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.
>
> --------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;
> + }
That looks right in itself since pfioctl() graps pfioctl_rw early on and
these returns fail to release it in case no transaction was found.
>
> NET_LOCK();
> PF_LOCK();
> On Wed, Jun 28, 2023 at 02:38:00PM +0200, Alexander Bluhm wrote:
> > Hi,
> >
> > Since Jun 26 regress tests panic the kernel.
> >
> > panic: rw_enter: pfioctl_rw locking against myself
But I'm not sure yet that this is enough to reinstate claudio's diff as-is.
> > Stopped at db_enter+0x14: popq %rbp
> > TID PID UID PRFLAGS PFLAGS CPU COMMAND
> > * 19846 58589 0 0x2 0 1K pfctl
> > 343161 43899 0 0x2 0 2 perl
> > db_enter() at db_enter+0x14
> > panic(ffffffff820e7d9d) at panic+0xc3
> > rw_enter(ffffffff82462c60,1) at rw_enter+0x26f
> > pfioctl(24900,cd504407,ffff800000f4b000,1,ffff80002226adc0) at pfioctl+0x2da
> > VOP_IOCTL(fffffd827bfea6e0,cd504407,ffff800000f4b000,1,fffffd827f7e3bc8,ffff80002226adc0)
> > at VOP_IOCTL+0x60
> > vn_ioctl(fffffd823b841d20,cd504407,ffff800000f4b000,ffff80002226adc0) at
> > vn_ioctl+0x79
> > sys_ioctl(ffff80002226adc0,ffff800022458160,ffff8000224581c0) at
> > sys_ioctl+0x2c4
> > syscall(ffff800022458230) at syscall+0x3d4
> > Xsyscall() at Xsyscall+0x128
> > end of kernel
> > end trace frame: 0x77becbc54dd0, count: 6
> > https://www.openbsd.org/ddb.html describes the minimum info required in bug
> > reports. Insufficient info makes it difficult to find and fix bugs.
> > ddb{1}>
> >
> > Triggered by regress/sbin/pfctl
> >
> > ==== pfload ====
> > ...
> > /sbin/pfctl -o none -a regress -f - < /usr/src/regress/sbin/pfctl/pf90.in
> > /sbin/pfctl -o none -a 'regress/*' -gvvsr | sed -e
> > 's/__automatic_[0-9a-f]*_/__automatic_/g' | diff -u
> > /usr/src/regress/sbin/pfctl/pf90.loaded /dev/stdin
> > /sbin/pfctl -o none -a regress -Fr >/dev/null 2>&1
> > /sbin/pfctl -o none -a regress -f - < /usr/src/regress/sbin/pfctl/pf91.in
> > /sbin/pfctl -o none -a 'regress/*' -gvvsr | sed -e
> > 's/__automatic_[0-9a-f]*_/__automatic_/g' | diff -u
> > /usr/src/regress/sbin/pfctl/pf91.loaded /dev/stdin
> > Timeout, server ot6 not responding.
> >
> > bluhm
> >
>