HomeFreeBSD

pf: protect the rpool from races

Description

pf: protect the rpool from races

The roundrobin pool stores its state in the rule, which could
potentially lead to invalid addresses being returned.

For example, thread A just executed PF_AINC(&rpool->counter) and
immediately afterwards thread B executes PF_ACPY(naddr, &rpool->counter)
(i.e. after the pf_match_addr() check of rpool->counter).

Lock the rpool with its own mutex to prevent these races. The
performance impact of this is expected to be low, as each rule has its
own lock, and the lock is also only relevant when state is being created
(so only for the initial packets of a connection, not for all traffic).

See also: https://redmine.pfsense.org/issues/12660
Reviewed by: glebius
MFC after: 3 weeks
Sponsored by: Rubicon Communications, LLC ("Netgate")
Differential Revision: https://reviews.freebsd.org/D33874

(cherry picked from commit 5f5e32f1b3945087a687c5962071d3f46e34e1ff)

Details

Provenance
kpAuthored on Jan 10 2022, 4:49 PM
Reviewer
glebius
Differential Revision
D33874: pf: protect the rpool from races
Parents
rGd0128bd98a08: msdosfs_denode.c: some style
Branches
Unknown
Tags
Unknown