Hi.

 I noticed that -current's SIOC[GZ]IFDATA doesn't work correctly.
It's OK on netbsd-8.

static int
doifioctl(struct socket *so, u_long cmd, void *data, struct lwp *l)
{
        struct ifnet *ifp;
        struct ifreq *ifr;
        int error = 0;
#if defined(COMPAT_OSOCK) || defined(COMPAT_OIFREQ)
        u_long ocmd = cmd;
#endif
        short oif_flags;
#ifdef COMPAT_OIFREQ
        struct ifreq ifrb;
        struct oifreq *oifr = NULL;
#endif
        int r;
        struct psref psref;
        int bound;

        switch (cmd) {
        case SIOCGIFCONF:
                return ifconf(cmd, data);
        case SIOCINITIFADDR:
                return EPERM;
        default:
                error = (*vec_compat_ifconf)(l, cmd, data);
                if (error != ENOSYS)
                        return error;
                error = (*vec_compat_ifdatareq)(l, cmd, data);
                if (error != ENOSYS) <<==================
                        return error;
                break;
        }

The call of vec_compat_ifdatareq() always returns other than ENOSYS.


Patch:
----------------
Index: uipc_syscalls_50.c
===================================================================
RCS file: /cvsroot/src/sys/compat/common/uipc_syscalls_50.c,v
retrieving revision 1.5
diff -u -p -r1.5 uipc_syscalls_50.c
--- uipc_syscalls_50.c  26 Apr 2018 08:11:18 -0000      1.5
+++ uipc_syscalls_50.c  11 Sep 2018 09:45:31 -0000
@@ -65,23 +65,24 @@ compat_ifdatareq(struct lwp *l, u_long c
/* Validate arguments. */
        switch (cmd) {
-       case SIOCGIFDATA:
-       case SIOCZIFDATA:
-               ifp = ifunit(ifdr->ifdr_name);
-               if (ifp == NULL)
-                       return ENXIO;
+       case OSIOCGIFDATA:
+       case OSIOCZIFDATA:
                break;
        default:
                return ENOSYS;
        }
+ ifp = ifunit(ifdr->ifdr_name);
+       if (ifp == NULL)
+               return ENXIO;
+
        /* Do work. */
        switch (cmd) {
-       case SIOCGIFDATA:
+       case OSIOCGIFDATA:
                ifdatan2o(&ifdr->ifdr_data, &ifp->if_data);
                return 0;
- case SIOCZIFDATA:
+       case OSIOCZIFDATA:
                if (l != NULL) {
                        error = kauth_authorize_network(l->l_cred,
                            KAUTH_NETWORK_INTERFACE,
----------------

OK?


--
-----------------------------------------------
                SAITOH Masanobu (msai...@execsw.org
                                 msai...@netbsd.org)

Reply via email to