bnx2x: Use struct_group() for memcpy() region

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() in struct nig_stats around members egress_mac_pkt0_lo,
egress_mac_pkt0_hi, egress_mac_pkt1_lo, and egress_mac_pkt1_hi (and the
respective members in struct bnx2x_eth_stats), 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 struct bnx2x_eth_stats's rx_stat_ifhcinbadoctets_hi.

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

Additionally adds BUILD_BUG_ON() to compare the separate struct group
sizes.

Reviewed-by: Prabhakar Kushwaha <pkushwaha@marvell.com>
Link: https://lore.kernel.org/lkml/DM5PR18MB2229B0413C372CC6E49D59A3B2C59@DM5PR18MB2229.namprd18.prod.outlook.com
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Kees Cook 2021-11-18 10:42:53 -08:00 коммит произвёл David S. Miller
Родитель 641d3ef00c
Коммит 29fd0ec65e
2 изменённых файлов: 14 добавлений и 7 удалений

Просмотреть файл

@ -849,7 +849,8 @@ static int bnx2x_hw_stats_update(struct bnx2x *bp)
memcpy(old, new, sizeof(struct nig_stats)); memcpy(old, new, sizeof(struct nig_stats));
memcpy(&(estats->rx_stat_ifhcinbadoctets_hi), &(pstats->mac_stx[1]), BUILD_BUG_ON(sizeof(estats->shared) != sizeof(pstats->mac_stx[1]));
memcpy(&(estats->shared), &(pstats->mac_stx[1]),
sizeof(struct mac_stx)); sizeof(struct mac_stx));
estats->brb_drop_hi = pstats->brb_drop_hi; estats->brb_drop_hi = pstats->brb_drop_hi;
estats->brb_drop_lo = pstats->brb_drop_lo; estats->brb_drop_lo = pstats->brb_drop_lo;
@ -1634,9 +1635,9 @@ void bnx2x_stats_init(struct bnx2x *bp)
REG_RD(bp, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38); REG_RD(bp, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38);
if (!CHIP_IS_E3(bp)) { if (!CHIP_IS_E3(bp)) {
REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50, REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50,
&(bp->port.old_nig_stats.egress_mac_pkt0_lo), 2); &(bp->port.old_nig_stats.egress_mac_pkt0), 2);
REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50, REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50,
&(bp->port.old_nig_stats.egress_mac_pkt1_lo), 2); &(bp->port.old_nig_stats.egress_mac_pkt1), 2);
} }
/* Prepare statistics ramrod data */ /* Prepare statistics ramrod data */

Просмотреть файл

@ -36,10 +36,14 @@ struct nig_stats {
u32 pbf_octets; u32 pbf_octets;
u32 pbf_packet; u32 pbf_packet;
u32 safc_inp; u32 safc_inp;
u32 egress_mac_pkt0_lo; struct_group(egress_mac_pkt0,
u32 egress_mac_pkt0_hi; u32 egress_mac_pkt0_lo;
u32 egress_mac_pkt1_lo; u32 egress_mac_pkt0_hi;
u32 egress_mac_pkt1_hi; );
struct_group(egress_mac_pkt1,
u32 egress_mac_pkt1_lo;
u32 egress_mac_pkt1_hi;
);
}; };
enum bnx2x_stats_event { enum bnx2x_stats_event {
@ -83,6 +87,7 @@ struct bnx2x_eth_stats {
u32 no_buff_discard_hi; u32 no_buff_discard_hi;
u32 no_buff_discard_lo; u32 no_buff_discard_lo;
struct_group(shared,
u32 rx_stat_ifhcinbadoctets_hi; u32 rx_stat_ifhcinbadoctets_hi;
u32 rx_stat_ifhcinbadoctets_lo; u32 rx_stat_ifhcinbadoctets_lo;
u32 tx_stat_ifhcoutbadoctets_hi; u32 tx_stat_ifhcoutbadoctets_hi;
@ -159,6 +164,7 @@ struct bnx2x_eth_stats {
u32 tx_stat_dot3statsinternalmactransmiterrors_lo; u32 tx_stat_dot3statsinternalmactransmiterrors_lo;
u32 tx_stat_bmac_ufl_hi; u32 tx_stat_bmac_ufl_hi;
u32 tx_stat_bmac_ufl_lo; u32 tx_stat_bmac_ufl_lo;
);
u32 pause_frames_received_hi; u32 pause_frames_received_hi;
u32 pause_frames_received_lo; u32 pause_frames_received_lo;