From: Kishore Padmanabha <[email protected]>

Three independent out-of-bounds issues:

- bnxt_rx_pkt() incremented tpa_info->agg_count and indexed
  tpa_info->agg_arr[] with only an RTE_ASSERT (compiled out in release
  builds) guarding the array bound, allowing an out-of-bounds write if
  firmware sent more aggregation segments than TPA_MAX_NUM_SEGS.

- bnxt_rx_descriptor_status_op() used the firmware-supplied completion
  opaque value directly as an rx_buf_ring[] index without masking it to
  the ring size first.

- bnxt_hwrm_func_vf_vnic_query() returned the firmware-reported
  vnic_id_cnt unclamped; a value exceeding bp->pf->total_vnics would
  cause the caller to iterate past the end of its VNIC ID buffer.

Fixes: b150a7e7ee66 ("net/bnxt: support LRO on Thor adapters")
Fixes: 0fe613bb87b2 ("net/bnxt: support Rx descriptor status")
Fixes: cbcd375d37d2 ("net/bnxt: fix HWRM macros and locking")
Cc: [email protected]

Signed-off-by: Kishore Padmanabha <[email protected]>
Signed-off-by: Mohammad Shuab Siddique <[email protected]>
---
 drivers/net/bnxt/bnxt_ethdev.c |  3 ++-
 drivers/net/bnxt/bnxt_hwrm.c   |  3 ++-
 drivers/net/bnxt/bnxt_rxr.c    | 10 +++++++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index db9b49238a..d21ebac0c2 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -3631,7 +3631,8 @@ bnxt_rx_descriptor_status_op(void *rx_queue, uint16_t 
offset)
                case CMPL_BASE_TYPE_RX_L2:
                case CMPL_BASE_TYPE_RX_L2_V2:
                        if (desc == offset) {
-                               cons = rxcmp->opaque;
+                               cons = RING_IDX(rxr->rx_ring_struct,
+                                                rxcmp->opaque);
                                if (rxr->rx_buf_ring[cons])
                                        return RTE_ETH_RX_DESC_DONE;
                                else
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 0143da8789..aae50c1fea 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -6242,7 +6242,8 @@ static int bnxt_hwrm_func_vf_vnic_query(struct bnxt *bp, 
uint16_t vf,
        }
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);
        HWRM_CHECK_RESULT();
-       rc = rte_le_to_cpu_32(resp->vnic_id_cnt);
+       rc = RTE_MIN(rte_le_to_cpu_32(resp->vnic_id_cnt),
+                    (uint32_t)bp->pf->total_vnics);
 
        HWRM_UNLOCK();
 
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index 87640eaa79..cd4e93bdb3 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -1164,7 +1164,15 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
                }
 
                tpa_info = &rxr->tpa_info[agg_id];
-               RTE_ASSERT(tpa_info->agg_count < 16);
+               if (unlikely(tpa_info->agg_count >= TPA_MAX_NUM_SEGS)) {
+                       PMD_DRV_LOG_LINE(ERR,
+                                        "TPA abuf: agg_count %u exceeds max 
%u",
+                                        tpa_info->agg_count, TPA_MAX_NUM_SEGS);
+                       tpa_info->agg_count = 0;
+                       bnxt_sched_ring_reset(rxq);
+                       rc = -EINVAL;
+                       goto next_rx;
+               }
                tpa_info->agg_arr[tpa_info->agg_count++] = *rx_agg;
                rc = -EINVAL; /* Continue w/o new mbuf */
                goto next_rx;
-- 
2.47.3

Reply via email to