⬢ DragonFlyBSD Kernel Audit
DF-3419 / fix.diff
← back to finding ↓ download raw
--- a/sys/net/pf/pf_if.c
+++ b/sys/net/pf/pf_if.c
@@ -284,12 +284,14 @@
 		return;
 
 	crit_enter();
+	lwkt_gettoken(&pf_token);
 	pfi_update++;
 	if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
 		panic("%s: pfi_kif_get failed", __func__);
 	kif->pfik_ifp = ifp;
 	ifp->if_pf_kif = kif;
 	pfi_kif_update(kif);
+	lwkt_reltoken(&pf_token);
 	crit_exit();
 }
 
@@ -302,11 +304,13 @@
 		return;
 
 	crit_enter();
+	lwkt_gettoken(&pf_token);
 	pfi_update++;
 	pfi_kif_update(kif);
 	kif->pfik_ifp = NULL;
 	ifp->if_pf_kif = NULL;
 	pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+	lwkt_reltoken(&pf_token);
 	crit_exit();
 }
 
@@ -346,10 +350,12 @@
 	struct pfi_kif *kif;
 
 	crit_enter();
+	lwkt_gettoken(&pf_token);
 	pfi_update++;
 	if ((kif = pfi_kif_get(group)) == NULL)
 		panic("%s: pfi_kif_get failed", __func__);
 	pfi_kif_update(kif);
+	lwkt_reltoken(&pf_token);
 	crit_exit();
 }
 
@@ -909,8 +915,10 @@
 {
 	if (ifp && ifp->if_pf_kif) {
 		crit_enter();
+		lwkt_gettoken(&pf_token);
 		pfi_update++;
 		pfi_kif_update(ifp->if_pf_kif);
+		lwkt_reltoken(&pf_token);
 		crit_exit();
 	}
 }