⬢ DragonFlyBSD Kernel Audit
DF-3396 / 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
@@ -984,7 +984,19 @@ netmap_mem_rings_create(struct netmap_adapter *na)
 
 cleanup:
+	/*
+	 * DF-3396: release the packet buffers that were already
+	 * allocated into the rings we managed to create, mirroring
+	 * netmap_mem_rings_delete(), before returning the ring objects.
+	 */
+	{
+		u_int i, lim;
+		struct netmap_kring *kring;
+
+		for (kring = na->tx_rings; kring != na->tailroom; kring++) {
+			if (kring->ring == NULL)
+				continue;
+			lim = kring->nkr_num_slots;
+			for (i = 0; i < lim; i++)
+				netmap_free_buf(na->nm_mem,
+				    kring->ring->slot[i].buf_idx);
+		}
+	}
 	netmap_free_rings(na);
 
 	NMA_UNLOCK(na->nm_mem);