⬢ DragonFlyBSD Kernel Audit
DF-3279 / fix.diff
← back to finding ↓ download raw
Fix DF-3279: bridge_ioctl_addspan() allocates a bridge_ifinfo for the
span bif (if_bridge.c:1823-1828) but bridge_delete_span() freed only
the bif, leaking sizeof(struct bridge_ifinfo) (~120 bytes) of kernel
memory per spanport add/del cycle.  Measured on the guest: +2.28 MB of
devbuf in-use after 20000 cycles.

--- a/sys/net/bridge/if_bridge.c
+++ b/sys/net/bridge/if_bridge.c
@@ -1152,7 +1152,10 @@ bridge_delete_span(struct bridge_softc *sc, struct bridge_iflist *bif)
 	KASSERT(bif->bif_ifp->if_bridge == NULL,
 	    ("%s: not a span interface", __func__));
 
 	TAILQ_REMOVE(&sc->sc_spanlist, bif, bif_next);
+	if (bif->bif_info != NULL)
+		kfree(bif->bif_info, M_DEVBUF);
 	kfree(bif, M_DEVBUF);
 }