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;
}