Module Name:    src
Committed By:   bouyer
Date:           Wed Feb 16 20:37:47 UTC 2011

Modified Files:
        src/sys/compat/common [netbsd-5]: uipc_syscalls_43.c
        src/sys/net [netbsd-5]: if.c

Log Message:
Pull up following revision(s) (requested by chs in ticket #1541):
        sys/compat/common/if_43.c: revision 1.3 via patch
        sys/net/if.c: revision 1.247 via patch
PR/44054: Onno van der Linden: Stacksmashing in handling of ioctl OOSIO*
parameter.
can't map the old and the new SIO calls the way we did before because the
numbers have changed. Instead provide a switch. Keep the old code there,
to handle cases we did not handle in the first switch, but this is a hack
and should be removed.


To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.43.10.1 src/sys/compat/common/uipc_syscalls_43.c
cvs rdiff -u -r1.230.4.3 -r1.230.4.4 src/sys/net/if.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/common/uipc_syscalls_43.c
diff -u src/sys/compat/common/uipc_syscalls_43.c:1.43 src/sys/compat/common/uipc_syscalls_43.c:1.43.10.1
--- src/sys/compat/common/uipc_syscalls_43.c:1.43	Tue Apr 29 19:02:14 2008
+++ src/sys/compat/common/uipc_syscalls_43.c	Wed Feb 16 20:37:47 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_syscalls_43.c,v 1.43 2008/04/29 19:02:14 ad Exp $	*/
+/*	$NetBSD: uipc_syscalls_43.c,v 1.43.10.1 2011/02/16 20:37:47 bouyer Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1990, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.43 2008/04/29 19:02:14 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.43.10.1 2011/02/16 20:37:47 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -407,80 +407,124 @@
 	if (IOCPARM_LEN(cmd) != sizeof(struct oifreq))
 		return cmd;
 
-	ncmd = ((cmd) & ~(IOCPARM_MASK << IOCPARM_SHIFT)) | 
-		(sizeof(struct ifreq) << IOCPARM_SHIFT);
-
-	switch (ncmd) {
-	case BIOCGETIF:
-	case BIOCSETIF:
-	case GREDSOCK:
-	case GREGADDRD:
-	case GREGADDRS:
-	case GREGPROTO:
-	case GRESADDRD:
-	case GRESADDRS:
-	case GRESPROTO:
-	case GRESSOCK:
+	switch (cmd) {
+	case OSIOCSIFADDR:
+		return SIOCSIFADDR;
+	case OOSIOCGIFADDR:
+		return SIOCGIFADDR;
+	case OSIOCSIFDSTADDR:
+		return SIOCSIFDSTADDR;
+	case OOSIOCGIFDSTADDR:
+		return SIOCGIFDSTADDR;
+	case OSIOCSIFFLAGS:
+		return SIOCSIFFLAGS;
+	case OSIOCGIFFLAGS:
+		return SIOCGIFFLAGS;
+	case OOSIOCGIFBRDADDR:
+		return SIOCGIFBRDADDR;
+	case OSIOCSIFBRDADDR:
+		return SIOCSIFBRDADDR;
+	case OOSIOCGIFCONF:
+		return SIOCGIFCONF;
+	case OOSIOCGIFNETMASK:
+		return SIOCGIFNETMASK;
+	case OSIOCSIFNETMASK:
+		return SIOCSIFNETMASK;
+	case OSIOCGIFCONF:
+		return SIOCGIFCONF;
+	case OSIOCADDMULTI:
+		return SIOCADDMULTI;
+	case OSIOCDELMULTI:
+		return SIOCDELMULTI;
+	case OSIOCSIFMEDIA:
+		return SIOCSIFMEDIA;
+	case OBIOCGETIF:
+		return BIOCGETIF;
+	case OBIOCSETIF:
+		return BIOCSETIF;
+	case OTAPGIFNAME:
+		return TAPGIFNAME;
+	default:
+		/*
+		 * XXX: the following code should be removed and the
+		 * needing treatment ioctls should move to the switch
+		 * above.
+		 */
+		ncmd = ((cmd) & ~(IOCPARM_MASK << IOCPARM_SHIFT)) | 
+		    (sizeof(struct ifreq) << IOCPARM_SHIFT);
+		switch (ncmd) {
+		case BIOCGETIF:
+		case BIOCSETIF:
+		case GREDSOCK:
+		case GREGADDRD:
+		case GREGADDRS:
+		case GREGPROTO:
+		case GRESADDRD:
+		case GRESADDRS:
+		case GRESPROTO:
+		case GRESSOCK:
 #ifdef COMPAT_20
-	case OSIOCG80211STATS:
-	case OSIOCG80211ZSTATS:
+		case OSIOCG80211STATS:
+		case OSIOCG80211ZSTATS:
 #endif /* COMPAT_20 */
-	case SIOCADDMULTI:
-	case SIOCDELMULTI:
-	case SIOCDIFADDR:
-	case SIOCDIFADDR_IN6:
-	case SIOCDIFPHYADDR:
-	case SIOCGDEFIFACE_IN6:
-	case SIOCG80211NWID:
-	case SIOCG80211STATS:
-	case SIOCG80211ZSTATS:
-	case SIOCGIFADDR:
-	case SIOCGIFADDR_IN6:
-	case SIOCGIFAFLAG_IN6:
-	case SIOCGIFALIFETIME_IN6:
-	case SIOCGIFBRDADDR:
-	case SIOCGIFDLT:
-	case SIOCGIFDSTADDR:
-	case SIOCGIFDSTADDR_IN6:
-	case SIOCGIFFLAGS:
-	case SIOCGIFGENERIC:
-	case SIOCGIFMETRIC:
-	case SIOCGIFMTU:
-	case SIOCGIFNETMASK:
-	case SIOCGIFNETMASK_IN6:
-	case SIOCGIFPDSTADDR:
-	case SIOCGIFPDSTADDR_IN6:
-	case SIOCGIFPSRCADDR:
-	case SIOCGIFPSRCADDR_IN6:
-	case SIOCGIFSTAT_ICMP6:
-	case SIOCGIFSTAT_IN6:
-	case SIOCGPVCSIF:
-	case SIOCGVH:
-	case SIOCIFCREATE:
-	case SIOCIFDESTROY:
-	case SIOCS80211NWID:
-	case SIOCSDEFIFACE_IN6:
-	case SIOCSIFADDR:
-	case SIOCSIFADDR_IN6:
-	case SIOCSIFBRDADDR:
-	case SIOCSIFDSTADDR:
-	case SIOCSIFDSTADDR_IN6:
-	case SIOCSIFFLAGS:
-	case SIOCSIFGENERIC:
-	case SIOCSIFMEDIA:
-	case SIOCSIFMETRIC:
-	case SIOCSIFMTU:
-	case SIOCSIFNETMASK:
-	case SIOCSIFNETMASK_IN6:
-	case SIOCSNDFLUSH_IN6:
-	case SIOCSPFXFLUSH_IN6:
-	case SIOCSPVCSIF:
-	case SIOCSRTRFLUSH_IN6:
-	case SIOCSVH:
-	case TAPGIFNAME:
-		return ncmd;
+		case SIOCADDMULTI:
+		case SIOCDELMULTI:
+		case SIOCDIFADDR:
+		case SIOCDIFADDR_IN6:
+		case SIOCDIFPHYADDR:
+		case SIOCGDEFIFACE_IN6:
+		case SIOCG80211NWID:
+		case SIOCG80211STATS:
+		case SIOCG80211ZSTATS:
+		case SIOCGIFADDR:
+		case SIOCGIFADDR_IN6:
+		case SIOCGIFAFLAG_IN6:
+		case SIOCGIFALIFETIME_IN6:
+		case SIOCGIFBRDADDR:
+		case SIOCGIFDLT:
+		case SIOCGIFDSTADDR:
+		case SIOCGIFDSTADDR_IN6:
+		case SIOCGIFFLAGS:
+		case SIOCGIFGENERIC:
+		case SIOCGIFMETRIC:
+		case SIOCGIFMTU:
+		case SIOCGIFNETMASK:
+		case SIOCGIFNETMASK_IN6:
+		case SIOCGIFPDSTADDR:
+		case SIOCGIFPDSTADDR_IN6:
+		case SIOCGIFPSRCADDR:
+		case SIOCGIFPSRCADDR_IN6:
+		case SIOCGIFSTAT_ICMP6:
+		case SIOCGIFSTAT_IN6:
+		case SIOCGPVCSIF:
+		case SIOCGVH:
+		case SIOCIFCREATE:
+		case SIOCIFDESTROY:
+		case SIOCS80211NWID:
+		case SIOCSDEFIFACE_IN6:
+		case SIOCSIFADDR:
+		case SIOCSIFADDR_IN6:
+		case SIOCSIFBRDADDR:
+		case SIOCSIFDSTADDR:
+		case SIOCSIFDSTADDR_IN6:
+		case SIOCSIFFLAGS:
+		case SIOCSIFGENERIC:
+		case SIOCSIFMEDIA:
+		case SIOCSIFMETRIC:
+		case SIOCSIFMTU:
+		case SIOCSIFNETMASK:
+		case SIOCSIFNETMASK_IN6:
+		case SIOCSNDFLUSH_IN6:
+		case SIOCSPFXFLUSH_IN6:
+		case SIOCSPVCSIF:
+		case SIOCSRTRFLUSH_IN6:
+		case SIOCSVH:
+		case TAPGIFNAME:
+			return ncmd;
+		default:
+			return cmd;
+		}
 	}
-	return cmd;
 }
 
 int

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.230.4.3 src/sys/net/if.c:1.230.4.4
--- src/sys/net/if.c:1.230.4.3	Sat Jun 12 16:37:55 2010
+++ src/sys/net/if.c	Wed Feb 16 20:37:47 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.230.4.3 2010/06/12 16:37:55 riz Exp $	*/
+/*	$NetBSD: if.c,v 1.230.4.4 2011/02/16 20:37:47 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.230.4.3 2010/06/12 16:37:55 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.230.4.4 2011/02/16 20:37:47 bouyer Exp $");
 
 #include "opt_inet.h"
 
@@ -1812,19 +1812,33 @@
 }
 
 int
-ifreq_setaddr(const u_long cmd, struct ifreq *ifr, const struct sockaddr *sa)
+ifreq_setaddr(u_long cmd, struct ifreq *ifr, const struct sockaddr *sa)
 {
 	uint8_t len;
-	u_long ncmd;
-
-	if ((ncmd = compat_cvtcmd(cmd)) != cmd)
-		len = sizeof(ifr->ifr_addr);
-	else
+#ifdef COMPAT_OIFREQ
+	struct ifreq ifrb;
+	struct oifreq *oifr = NULL;
+	u_long ocmd = cmd;
+	cmd = compat_cvtcmd(cmd);
+	if (cmd != ocmd) {
+		oifr = (struct oifreq *)(void *)ifr;
+		ifr = &ifrb;
+		ifreqo2n(oifr, ifr);
+		len = sizeof(oifr->ifr_addr);
+	} else
+#endif
 		len = sizeof(ifr->ifr_ifru.ifru_space);
+
 	if (len < sa->sa_len)
 		return EFBIG;
+
 	memset(&ifr->ifr_addr, 0, len);
 	sockaddr_copy(&ifr->ifr_addr, len, sa);
+
+#ifdef COMPAT_OIFREQ
+	if (cmd != ocmd)
+		ifreqn2o(oifr, ifr);
+#endif
 	return 0;
 }
 

Reply via email to