Table persistent flag (PFR_TFLAG_PERSIST) won't get set
authorsashan <sashan@openbsd.org>
Thu, 10 Aug 2023 16:44:04 +0000 (16:44 +0000)
committersashan <sashan@openbsd.org>
Thu, 10 Aug 2023 16:44:04 +0000 (16:44 +0000)
commitd40c63659aefc32359b6396f35c7bc9a9ae8f265
tree240eaad80fba173026ed74e5f9beff109bb99569
parent2c347fa615d36b710f10ecea62dd0279a2148fd3
Table persistent flag (PFR_TFLAG_PERSIST) won't get set
by ioctl(2) operation if table exists already. The issue
has been noticed by Giannis Kapetanakis (_at_) edu.physics.uoc.gr.
Giannis noticed relayd(8) aborts unexpectedly when 'relay host'
gets disabled by 'relayctl host dis ...' command. To understand
what's going on we must look at the way how relayd(8) manages
its firewall configuration. If relay-host 'example' is enabled relayd(8)
inserts rule to anchor relayd/example. The rule looks somewhat
like this:
     pass in from ... to ... rdr-to <example>
When the rule gets inserted to pf(4) the table 'example' is
created with flags:
    lumpy# pfctl -a relayd/example -vg -sT
    ----r-- example relayd/example
r-flag indicates table is referred by rule only. In the next
step relayd(8) creates and populates table example. It asks
pf(4) to add a persistent flag (PFR_TFLAG_PERSIST), so table
survives flush operation of relayd/example ruleset on behalf
of 'relayctl host dis ...' command. relayd(8) exits via abort()
when table is gone with disable operation.

Giannis was patient enough so we could debug and fix issue.
The committed change has been tested by Giannis too.

OK kn@, bluhm@
regress/sys/net/pf_table/Makefile
sys/net/pf_table.c