Skip to content

Commit

Permalink
net/bnxt: fix xstats names query overrun
Browse files Browse the repository at this point in the history
[ upstream commit 8dcee14 ]

When the xstats_names parameter to rte_eth_xstats_get_names()
is non-NULL and the size parameter is less than the required
number of entries, the driver must return the required size
without modifying (and over-running) the caller's xstats_names
array.

Update bnxt_dev_xstats_get_names_op() in accordance with this
requirement.

Fixes: bfb9c22 ("net/bnxt: support xstats get/reset")

Signed-off-by: Lance Richardson <lance.richardson@broadcom.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
  • Loading branch information
Lance Richardson authored and kevintraynor committed Feb 21, 2022
1 parent 9d1da36 commit c59f883
Showing 1 changed file with 46 additions and 47 deletions.
93 changes: 46 additions & 47 deletions drivers/net/bnxt/bnxt_stats.c
Expand Up @@ -846,7 +846,7 @@ int bnxt_flow_stats_cnt(struct bnxt *bp)

int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
struct rte_eth_xstat_name *xstats_names,
__rte_unused unsigned int limit)
unsigned int size)
{
struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
Expand All @@ -862,63 +862,62 @@ int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
if (rc)
return rc;

if (xstats_names != NULL) {
count = 0;
if (xstats_names == NULL || size < stat_cnt)
return stat_cnt;

for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_rx_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}
for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_rx_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}

for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_tx_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}
for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_tx_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}

for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_func_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}
for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_func_stats_strings[i].name,
sizeof(xstats_names[count].name));
count++;
}

for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_rx_ext_stats_strings[i].name,
sizeof(xstats_names[count].name));
for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_rx_ext_stats_strings[i].name,
sizeof(xstats_names[count].name));

count++;
}
count++;
}

for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_tx_ext_stats_strings[i].name,
sizeof(xstats_names[count].name));
for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
strlcpy(xstats_names[count].name,
bnxt_tx_ext_stats_strings[i].name,
sizeof(xstats_names[count].name));

count++;
}
count++;
}

if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
BNXT_FLOW_XSTATS_EN(bp)) {
for (i = 0; i < bp->max_l2_ctx; i++) {
char buf[RTE_ETH_XSTATS_NAME_SIZE];
if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
BNXT_FLOW_XSTATS_EN(bp)) {
for (i = 0; i < bp->max_l2_ctx; i++) {
char buf[RTE_ETH_XSTATS_NAME_SIZE];

sprintf(buf, "flow_%d_bytes", i);
strlcpy(xstats_names[count].name, buf,
sizeof(xstats_names[count].name));
count++;
sprintf(buf, "flow_%d_bytes", i);
strlcpy(xstats_names[count].name, buf,
sizeof(xstats_names[count].name));
count++;

sprintf(buf, "flow_%d_packets", i);
strlcpy(xstats_names[count].name, buf,
sizeof(xstats_names[count].name));
sprintf(buf, "flow_%d_packets", i);
strlcpy(xstats_names[count].name, buf,
sizeof(xstats_names[count].name));

count++;
}
count++;
}
}

Expand Down

0 comments on commit c59f883

Please sign in to comment.