DragonFlyBSD Kernel Audit
DF-0546 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/net/netmap/netmap_mem2.c b/sys/net/netmap/netmap_mem2.c
--- a/sys/net/netmap/netmap_mem2.c
+++ b/sys/net/netmap/netmap_mem2.c
@@ -176,8 +176,12 @@ netmap_mem_ofstophys(struct netmap_mem_d* nmd, vm_ooffset_t offset)
 	for (i = 0; i < NETMAP_POOLS_NR; offset -= p[i].memtotal, i++) {
 		if (offset >= p[i].memtotal)
 			continue;
+		/* DF-0546: bound lut index to prevent OOB read in page padding */
+		u_int idx = offset / p[i]._objsize;
+		if (idx >= p[i].objtotal)
+			break;
 		// now lookup the cluster's address
-		pa = p[i].lut[offset / p[i]._objsize].paddr +
+		pa = p[i].lut[idx].paddr +
 			offset % p[i]._objsize;
 		NMA_UNLOCK(nmd);
 		return pa;