Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

SIOC[GZ]IFDATA fix



 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 (msaitoh%execsw.org@localhost
                                 msaitoh%netbsd.org@localhost)


Home | Main Index | Thread Index | Old Index