diff options
author | Arnd Bergmann <arnd@arndb.de> | 2018-08-13 18:12:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-08-13 23:45:49 -0400 |
commit | 1bbf3aed25e0fc256e825da1f5c45d7b4daa828e (patch) | |
tree | 785d4d7d59822490c0709d379954e3dba35729f1 | |
parent | cf87615d15f37182b2a3a4cd722288d3d5956900 (diff) |
bnxt_en: take coredump_record structure off stack
The bnxt_coredump_record structure is very long, causing a warning
about possible stack overflow on 32-bit architectures:
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c: In function 'bnxt_get_coredump':
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c:2989:1: error: the frame size of 1188 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
I could not see any reason to operate on an on-stack copy of the
structure before copying it back into the caller-provided buffer, which
also simplifies the code here.
Fixes: 6c5657d085ae ("bnxt_en: Add support for ethtool get dump.")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 539be1d1b67f..e52d7af3ab3e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | |||
@@ -2900,7 +2900,6 @@ static int bnxt_get_coredump(struct bnxt *bp, void *buf, u32 *dump_len) | |||
2900 | struct coredump_segment_record *seg_record = NULL; | 2900 | struct coredump_segment_record *seg_record = NULL; |
2901 | u32 offset = 0, seg_hdr_len, seg_record_len; | 2901 | u32 offset = 0, seg_hdr_len, seg_record_len; |
2902 | struct bnxt_coredump_segment_hdr seg_hdr; | 2902 | struct bnxt_coredump_segment_hdr seg_hdr; |
2903 | struct bnxt_coredump_record coredump_rec; | ||
2904 | struct bnxt_coredump coredump = {NULL}; | 2903 | struct bnxt_coredump coredump = {NULL}; |
2905 | time64_t start_time; | 2904 | time64_t start_time; |
2906 | u16 start_utc; | 2905 | u16 start_utc; |
@@ -2976,14 +2975,12 @@ next_seg: | |||
2976 | } | 2975 | } |
2977 | 2976 | ||
2978 | err: | 2977 | err: |
2979 | if (buf) { | 2978 | if (buf) |
2980 | bnxt_fill_coredump_record(bp, &coredump_rec, start_time, | 2979 | bnxt_fill_coredump_record(bp, buf + offset, start_time, |
2981 | start_utc, coredump.total_segs + 1, | 2980 | start_utc, coredump.total_segs + 1, |
2982 | rc); | 2981 | rc); |
2983 | memcpy(buf + offset, &coredump_rec, sizeof(coredump_rec)); | ||
2984 | } | ||
2985 | kfree(coredump.data); | 2982 | kfree(coredump.data); |
2986 | *dump_len += sizeof(coredump_rec); | 2983 | *dump_len += sizeof(struct bnxt_coredump_record); |
2987 | 2984 | ||
2988 | return rc; | 2985 | return rc; |
2989 | } | 2986 | } |