On Wed, Jun 28, 2023 at 06:17:46PM +0200, Alexandr Nedvedicky wrote: > Hello, > > the fix below solves the locking issue. however pf_close_all_trans() still > breaks the test case. it fails to retrieve all rules. it looks like pfctl(8) > currently opens transaction for every ruleset/anchor it's going to retrieve. > > the ruleset in question reads as follows: > > netlock# cat /usr/src/regress/sbin/pfctl/pf91.in > # basic anchor test > anchor on tun1000000 { > anchor foo out { > pass proto tcp to port 1234 > anchor proto tcp to port 2413 user root label "foo" { > block > pass from 127.0.0.1 > } > } > pass in proto tcp to port 1234 > } > > as soon as we loaded we get this output on system which runs diff below: > > netlock# /sbin/pfctl -o none -a 'regress/*' -sr > anchor on tun1000000 all { > anchor "foo" out all { > pass proto tcp from any to any port = 1234 flags S/SA > anchor proto tcp from any to any port = 2413 user = 0 label "foo" { > block drop all > pass inet from 127.0.0.1 to any flags S/SA > } > pfctl: DIOCGETRULE: Device not configured > } > pfctl: DIOCGETRULE: Device not configured > } > pfctl: DIOCGETRULE: Device not configured > > sigh... things are not that simple. I still want to commit diff > below because it fixes bug we have in tree. > > then I'll have to think on how to make claudio's diff smarter.
Sounds like a plan. > > thanks and > regards > sashan > > > On Wed, Jun 28, 2023 at 05:46:36PM +0200, Alexandr Nedvedicky wrote: > > Hello, > > > > it looks like we need to use goto fail instead of return. > > this is the diff I'm testing now. That early return is clearly a bug holding pfioctl_rw back. OK kn > > > > --------8<---------------8<---------------8<------------------8<-------- > > diff --git a/sys/net/pf_ioctl.c b/sys/net/pf_ioctl.c > > index 36779cfdfd3..a51df9e6089 100644 > > --- a/sys/net/pf_ioctl.c > > +++ b/sys/net/pf_ioctl.c > > @@ -1508,11 +1508,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int > > flags, struct proc *p) > > int i; > > > > t = pf_find_trans(minor(dev), pr->ticket); > > - if (t == NULL) > > - return (ENXIO); > > + if (t == NULL) { > > + error = ENXIO; > > + goto fail; > > + } > > KASSERT(t->pft_unit == minor(dev)); > > - if (t->pft_type != PF_TRANS_GETRULE) > > - return (EINVAL); > > + if (t->pft_type != PF_TRANS_GETRULE) { > > + error = EINVAL; > > + goto fail; > > + } > > > > NET_LOCK(); >