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)
commit3cc9bc2c41c589c0483bd3971e1890d376506495
tree9996cb23f2e442d0d65f5cac690541ba5d039b62
parent7d13f3ea4ef295a2e688ede982dcca69ae7947b6
With parallel execution of pf_test() two packets may try to update the same
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