Page MenuHomeFreeBSD

D60535.id.diff
No OneTemporary

D60535.id.diff

diff --git a/sys/netpfil/pf/pf_if.c b/sys/netpfil/pf/pf_if.c
--- a/sys/netpfil/pf/pf_if.c
+++ b/sys/netpfil/pf/pf_if.c
@@ -448,6 +448,7 @@
void
pfi_kkif_purge(void)
{
+ LIST_HEAD(, pfi_kkif) freeq = LIST_HEAD_INITIALIZER(freeq);
struct pfi_kkif *kif, *kif1;
/*
@@ -458,11 +459,18 @@
LIST_FOREACH_SAFE(kif, &V_pfi_unlinked_kifs, pfik_list, kif1) {
if (!(kif->pfik_flags & PFI_IFLAG_REFS)) {
LIST_REMOVE(kif, pfik_list);
- pf_kkif_free(kif);
+ LIST_INSERT_HEAD(&freeq, kif, pfik_list);
} else
atomic_clear_int(&kif->pfik_flags, PFI_IFLAG_REFS);
}
mtx_unlock(&pfi_unlnkdkifs_mtx);
+
+ /*
+ * pf_kkif_free() may take the rules lock, which is held before
+ * pfi_unlnkdkifs_mtx in pfi_kkif_remove_if_unref().
+ */
+ LIST_FOREACH_SAFE(kif, &freeq, pfik_list, kif1)
+ pf_kkif_free(kif);
}
int

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 12, 6:18 PM (3 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40561144
Default Alt Text
D60535.id.diff (828 B)

Event Timeline