git: 08f7954e1c9f - stable/12 - iflib: add assert to prevent out-of-bounds array access

Vincenzo Maffione vmaffione at FreeBSD.org
Sun Jan 24 10:09:04 UTC 2021


The branch stable/12 has been updated by vmaffione:

URL: https://cgit.FreeBSD.org/src/commit/?id=08f7954e1c9f2e479896858f2af1ef7d568bc248

commit 08f7954e1c9f2e479896858f2af1ef7d568bc248
Author:     Vincenzo Maffione <vmaffione at FreeBSD.org>
AuthorDate: 2021-01-10 13:49:51 +0000
Commit:     Vincenzo Maffione <vmaffione at FreeBSD.org>
CommitDate: 2021-01-24 08:45:09 +0000

    iflib: add assert to prevent out-of-bounds array access
    
    The iflib_queues_alloc() allocates isc_nrxqs iflib_dma_info structs
    for each rxqset, and links each struct to a different free list.
    As a result, it must be isc_nrxqs >= isc_nfl (plus the completion
    queue, if present).
    Add an assertion to make this constraint explicit.
    
    MFC after:      2 weeks
    
    (cherry picked from commit 4ba9ad0dc316940f32065b05f24259f942c0692d)
---
 sys/net/iflib.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 1653fd31a7f7..6f7911a12b09 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -5530,11 +5530,14 @@ iflib_queues_alloc(if_ctx_t ctx)
 	uint8_t nrxqs = sctx->isc_nrxqs;
 	uint8_t ntxqs = sctx->isc_ntxqs;
 	int nfree_lists = sctx->isc_nfl ? sctx->isc_nfl : 1;
+	int fl_offset = (sctx->isc_flags & IFLIB_HAS_RXCQ ? 1 : 0);
 	caddr_t *vaddrs;
 	uint64_t *paddrs;
 
 	KASSERT(ntxqs > 0, ("number of queues per qset must be at least 1"));
 	KASSERT(nrxqs > 0, ("number of queues per qset must be at least 1"));
+	KASSERT(nrxqs >= fl_offset + nfree_lists,
+           ("there must be at least a rxq for each free list"));
 
 	/* Allocate the TX ring struct memory */
 	if (!(ctx->ifc_txqs =
@@ -5642,11 +5645,7 @@ iflib_queues_alloc(if_ctx_t ctx)
 		}
 		rxq->ifr_ctx = ctx;
 		rxq->ifr_id = i;
-		if (sctx->isc_flags & IFLIB_HAS_RXCQ) {
-			rxq->ifr_fl_offset = 1;
-		} else {
-			rxq->ifr_fl_offset = 0;
-		}
+		rxq->ifr_fl_offset = fl_offset;
 		rxq->ifr_nfl = nfree_lists;
 		if (!(fl =
 			  (iflib_fl_t) malloc(sizeof(struct iflib_fl) * nfree_lists, M_IFLIB, M_NOWAIT | M_ZERO))) {


More information about the dev-commits-src-all mailing list