The branch stable/13 has been updated by zlei:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=0a5e8108bf20d9d40d473f3a7f04cff7abb1ffa8

commit 0a5e8108bf20d9d40d473f3a7f04cff7abb1ffa8
Author:     Zhenlei Huang <z...@freebsd.org>
AuthorDate: 2025-06-28 15:46:51 +0000
Commit:     Zhenlei Huang <z...@freebsd.org>
CommitDate: 2025-07-08 10:03:29 +0000

    pfsync: Allocate and initialize buckets before attaching the interface
    
    This prevents a potential race that the ioctl threads see NULL or
    uninitialized buckets.
    
    Reviewed by:    kp
    Fixes:          4fc65bcbe3fb pfsync: Performance improvement
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D51064
    
    (cherry picked from commit edc307eca9a9a9b0ce7445cff513b48f6489e5c6)
    (cherry picked from commit 8cc376735c65a18c53a70c30957a5f56dd066b79)
---
 sys/netpfil/pf/if_pfsync.c | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/sys/netpfil/pf/if_pfsync.c b/sys/netpfil/pf/if_pfsync.c
index 9eef37ff9005..e071197f17ce 100644
--- a/sys/netpfil/pf/if_pfsync.c
+++ b/sys/netpfil/pf/if_pfsync.c
@@ -340,23 +340,6 @@ pfsync_clone_create(struct if_clone *ifc, int unit, 
caddr_t param)
        sc = malloc(sizeof(struct pfsync_softc), M_PFSYNC, M_WAITOK | M_ZERO);
        sc->sc_flags |= PFSYNCF_OK;
        sc->sc_maxupdates = 128;
-
-       ifp = sc->sc_ifp = if_alloc(IFT_PFSYNC);
-       if_initname(ifp, pfsyncname, unit);
-       ifp->if_softc = sc;
-       ifp->if_ioctl = pfsyncioctl;
-       ifp->if_output = pfsyncoutput;
-       ifp->if_hdrlen = sizeof(struct pfsync_header);
-       ifp->if_mtu = ETHERMTU;
-       mtx_init(&sc->sc_mtx, pfsyncname, NULL, MTX_DEF);
-       mtx_init(&sc->sc_bulk_mtx, "pfsync bulk", NULL, MTX_DEF);
-       callout_init_mtx(&sc->sc_bulk_tmo, &sc->sc_bulk_mtx, 0);
-       callout_init_mtx(&sc->sc_bulkfail_tmo, &sc->sc_bulk_mtx, 0);
-
-       if_attach(ifp);
-
-       bpfattach(ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
-
        sc->sc_buckets = mallocarray(pfsync_buckets, sizeof(*sc->sc_buckets),
            M_PFSYNC, M_ZERO | M_WAITOK);
        for (c = 0; c < pfsync_buckets; c++) {
@@ -378,6 +361,22 @@ pfsync_clone_create(struct if_clone *ifc, int unit, 
caddr_t param)
                b->b_snd.ifq_maxlen = ifqmaxlen;
        }
 
+       ifp = sc->sc_ifp = if_alloc(IFT_PFSYNC);
+       if_initname(ifp, pfsyncname, unit);
+       ifp->if_softc = sc;
+       ifp->if_ioctl = pfsyncioctl;
+       ifp->if_output = pfsyncoutput;
+       ifp->if_hdrlen = sizeof(struct pfsync_header);
+       ifp->if_mtu = ETHERMTU;
+       mtx_init(&sc->sc_mtx, pfsyncname, NULL, MTX_DEF);
+       mtx_init(&sc->sc_bulk_mtx, "pfsync bulk", NULL, MTX_DEF);
+       callout_init_mtx(&sc->sc_bulk_tmo, &sc->sc_bulk_mtx, 0);
+       callout_init_mtx(&sc->sc_bulkfail_tmo, &sc->sc_bulk_mtx, 0);
+
+       if_attach(ifp);
+
+       bpfattach(ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
+
        V_pfsyncif = sc;
 
        return (0);

Reply via email to