With parallel execution of pf_test() two packets may try to update the same
authorsashan <sashan@openbsd.org>
Wed, 2 Jun 2021 21:49:31 +0000 (21:49 +0000)
committersashan <sashan@openbsd.org>
Wed, 2 Jun 2021 21:49:31 +0000 (21:49 +0000)
state in pfsync(4) queue. pfsync_q_ins() takes that race into account with one
exception: the KASSERT() at line 2352. That KASSERT()  needs to be removed.

2346 void
2347 pfsync_q_ins(struct pf_state *st, int q)
2348 {
2349    struct pfsync_softc *sc = pfsyncif;
2350    size_t nlen, sc_len;
2351
2352    KASSERT(st->sync_state == PFSYNC_S_NONE);
2353
2354 #if defined(PFSYNC_DEBUG)
2355         if (sc->sc_len < PFSYNC_MINPKT)
2356                 panic("pfsync pkt len is too low %zd", sc->sc_len);
2357 #endif
2358 do {
2359         mtx_enter(&sc->sc_mtx[q]);
2360
2361         /*
2362          * If two threads are competing to insert the same state, then
2363          * there must be just single winner.
2364          */
2365         if (st->sync_state != PFSYNC_S_NONE) {
2366                 mtx_leave(&sc->sc_mtx[q]);
2367                 break;
2368         }

OK bluhm@

sys/net/if_pfsync.c

index b90aa93..d82f31a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_pfsync.c,v 1.288 2021/03/10 10:21:48 jsg Exp $     */
+/*     $OpenBSD: if_pfsync.c,v 1.289 2021/06/02 21:49:31 sashan Exp $  */
 
 /*
  * Copyright (c) 2002 Michael Shalayeff
@@ -2349,8 +2349,6 @@ pfsync_q_ins(struct pf_state *st, int q)
        struct pfsync_softc *sc = pfsyncif;
        size_t nlen, sc_len;
 
-       KASSERT(st->sync_state == PFSYNC_S_NONE);
-
 #if defined(PFSYNC_DEBUG)
        if (sc->sc_len < PFSYNC_MINPKT)
                panic("pfsync pkt len is too low %zd", sc->sc_len);