bnxt_en: Use struct_group_attr() for memcpy() region
authorKees Cook <keescook@chromium.org>
Tue, 25 May 2021 01:51:54 +0000 (18:51 -0700)
committerKees Cook <keescook@chromium.org>
Sat, 25 Sep 2021 15:20:48 +0000 (08:20 -0700)
In preparation for FORTIFY_SOURCE performing compile-time and run-time
field bounds checking for memcpy(), memmove(), and memset(), avoid
intentionally writing across neighboring fields.

Use struct_group() around members queue_id, min_bw, max_bw, tsa, pri_lvl,
and bw_weight so they can be referenced together. This will allow memcpy()
and sizeof() to more easily reason about sizes, improve readability,
and avoid future warnings about writing beyond the end of queue_id.

"pahole" shows no size nor member offset changes to struct bnxt_cos2bw_cfg.
"objdump -d" shows no meaningful object code changes (i.e. only source
line number induced differences and optimizations).

Cc: Michael Chan <michael.chan@broadcom.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: netdev@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/lkml/CACKFLinDc6Y+P8eZ=450yA1nMC7swTURLtcdyiNR=9J6dfFyBg@mail.gmail.com
Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/lkml/20210728044517.GE35706@embeddedor
drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c
drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h

index 228a5db7e1434beb35ca82ebee0a0a84c387f734..217ff597cdf2fbc679722a73730f6a5c098bd4a9 100644 (file)
@@ -159,10 +159,10 @@ static int bnxt_hwrm_queue_cos2bw_qcfg(struct bnxt *bp, struct ieee_ets *ets)
        }
 
        data = &resp->queue_id0 + offsetof(struct bnxt_cos2bw_cfg, queue_id);
-       for (i = 0; i < bp->max_tc; i++, data += sizeof(cos2bw) - 4) {
+       for (i = 0; i < bp->max_tc; i++, data += sizeof(cos2bw.cfg)) {
                int tc;
 
-               memcpy(&cos2bw.queue_id, data, sizeof(cos2bw) - 4);
+               memcpy(&cos2bw.cfg, data, sizeof(cos2bw.cfg));
                if (i == 0)
                        cos2bw.queue_id = resp->queue_id0;
 
index 6eed231de565f0bee40681e57f86cd0452207ee7..7167425221615f90e2bf2d7031ed3a4c039e3f7c 100644 (file)
@@ -23,13 +23,15 @@ struct bnxt_dcb {
 
 struct bnxt_cos2bw_cfg {
        u8                      pad[3];
-       u8                      queue_id;
-       __le32                  min_bw;
-       __le32                  max_bw;
+       struct_group_attr(cfg, __packed,
+               u8              queue_id;
+               __le32          min_bw;
+               __le32          max_bw;
 #define BW_VALUE_UNIT_PERCENT1_100             (0x1UL << 29)
-       u8                      tsa;
-       u8                      pri_lvl;
-       u8                      bw_weight;
+               u8              tsa;
+               u8              pri_lvl;
+               u8              bw_weight;
+       );
        u8                      unused;
 };