Index: sys/sys/compat_stub.h =================================================================== RCS file: /cvsroot/src/sys/sys/compat_stub.h,v retrieving revision 1.3 diff -p -u -r1.3 compat_stub.h --- sys/sys/compat_stub.h 28 Jan 2019 15:46:49 -0000 1.3 +++ sys/sys/compat_stub.h 29 Jan 2019 01:07:07 -0000 @@ -199,7 +199,7 @@ MODULE_HOOK(if_43_ifioctl_hook, int, /* * if43_20 compatability */ -MODULE_HOOK(if43_20_hook, int, (u_long)); +MODULE_HOOK(if43_20_hook, int, (u_long *, u_long, u_long)); /* * tty 43 ioctl compatibility Index: sys/compat/common/if43_20.c =================================================================== RCS file: /cvsroot/src/sys/compat/common/if43_20.c,v retrieving revision 1.2 diff -p -u -r1.2 if43_20.c --- sys/compat/common/if43_20.c 27 Jan 2019 02:08:39 -0000 1.2 +++ sys/compat/common/if43_20.c 29 Jan 2019 01:07:07 -0000 @@ -67,16 +67,19 @@ __KERNEL_RCSID(0, "$NetBSD: if43_20.c,v #include static int -if43_cvtcmd_20(u_long ncmd) +if43_cvtcmd_20(u_long *rcmdp, u_long ocmd, u_long ncmd) { switch (ncmd) { case OSIOCG80211STATS: case OSIOCG80211ZSTATS: - return 0; + *rcmdp = ncmd; + break; default: - return EINVAL; + *rcmdp = ocmd; + break; } + return 0; } void Index: sys/compat/common/if_43.c =================================================================== RCS file: /cvsroot/src/sys/compat/common/if_43.c,v retrieving revision 1.16 diff -p -u -r1.16 if_43.c --- sys/compat/common/if_43.c 27 Jan 2019 02:08:39 -0000 1.16 +++ sys/compat/common/if_43.c 29 Jan 2019 01:07:07 -0000 @@ -84,15 +84,19 @@ __KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1. static int do_compat_cvtcmd(u_long *ncmd, u_long ocmd) { + int error; - *ncmd = compat_cvtcmd(ocmd); - return 0; + *ncmd = compat_cvtcmd(ocmd, &error); + return error; } u_long -compat_cvtcmd(u_long cmd) +compat_cvtcmd(u_long cmd, int *errorp) { u_long ncmd; + int error; + + *errorp = 0; if (IOCPARM_LEN(cmd) != sizeof(struct oifreq)) return cmd; @@ -212,7 +216,9 @@ compat_cvtcmd(u_long cmd) case TAPGIFNAME: return ncmd; default: - MODULE_CALL_HOOK(if43_20_hook, (ncmd), enosys(), ncmd); + MODULE_CALL_HOOK(if43_20_hook, (&ncmd, cmd, ncmd), enosys(), error); + if (error) + *errorp = error; return ncmd; } } @@ -243,7 +249,11 @@ compat_ifioctl(struct socket *so, u_long * not oifreq calls. */ if (cmd == ocmd) { - cmd = compat_cvtcmd(ocmd); + cmd = compat_cvtcmd(ocmd, &error); + if (error) { + curlwp_bindx(bound); + return error; + } } if (cmd != ocmd) { oifr = data; Index: sys/compat/sys/socket.h =================================================================== RCS file: /cvsroot/src/sys/compat/sys/socket.h,v retrieving revision 1.17 diff -p -u -r1.17 socket.h --- sys/compat/sys/socket.h 27 Jan 2019 02:08:41 -0000 1.17 +++ sys/compat/sys/socket.h 29 Jan 2019 01:07:07 -0000 @@ -100,7 +100,7 @@ struct sockcred70 { __BEGIN_DECLS struct socket; struct proc; -u_long compat_cvtcmd(u_long cmd); +u_long compat_cvtcmd(u_long cmd, int *); int compat_ifioctl(struct socket *, u_long, u_long, void *, struct lwp *); int compat43_set_accrights(struct msghdr *, void *, int);