diff options
| author | christos <christos@NetBSD.org> | 2013-01-11 19:01:36 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2013-01-11 19:01:36 +0000 |
| commit | 891f436cdc2df396e5c5cbfe5d8af27437d690a3 (patch) | |
| tree | c6acfe63553e327cc96134de60d868f223e00a3c /sys/compat/linux | |
| parent | c07ede2251b2ebdc6a8f39f549f28834909b74cd (diff) | |
Use copyin/copyout and linux-specific ifreq structures (they are the same
as the netbsd ones, but this disconnects them)
Diffstat (limited to 'sys/compat/linux')
| -rw-r--r-- | sys/compat/linux/common/linux_socket.c | 20 | ||||
| -rw-r--r-- | sys/compat/linux/common/linux_sockio.h | 13 |
2 files changed, 24 insertions, 9 deletions
diff --git a/sys/compat/linux/common/linux_socket.c b/sys/compat/linux/common/linux_socket.c index c9dfb5ef30d..d7a1cd73e2e 100644 --- a/sys/compat/linux/common/linux_socket.c +++ b/sys/compat/linux/common/linux_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.c,v 1.114 2012/06/20 15:03:18 christos Exp $ */ +/* $NetBSD: linux_socket.c,v 1.115 2013/01/11 19:01:36 christos Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.114 2012/06/20 15:03:18 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.115 2013/01/11 19:01:36 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -1083,7 +1083,7 @@ int linux_getifconf(struct lwp *l, register_t *retval, void *data) { struct linux_ifreq ifr, *ifrp; - struct ifconf *ifc = data; + struct linux_ifconf ifc; struct ifnet *ifp; struct ifaddr *ifa; struct sockaddr *sa; @@ -1091,11 +1091,15 @@ linux_getifconf(struct lwp *l, register_t *retval, void *data) int space, error = 0; const int sz = (int)sizeof(ifr); - ifrp = (struct linux_ifreq *)ifc->ifc_req; + error = copyin(data, &ifc, sizeof(ifc)); + if (error) + return error; + + ifrp = ifc.ifc_req; if (ifrp == NULL) space = 0; else - space = ifc->ifc_len; + space = ifc.ifc_len; IFNET_FOREACH(ifp) { (void)strncpy(ifr.ifr_name, ifp->if_xname, @@ -1123,11 +1127,11 @@ linux_getifconf(struct lwp *l, register_t *retval, void *data) } if (ifrp != NULL) - ifc->ifc_len -= space; + ifc.ifc_len -= space; else - ifc->ifc_len = -space; + ifc.ifc_len = -space; - return 0; + return copyout(&ifc, data, sizeof(ifc)); } int diff --git a/sys/compat/linux/common/linux_sockio.h b/sys/compat/linux/common/linux_sockio.h index cb51bbd3664..cdf63cb92e5 100644 --- a/sys/compat/linux/common/linux_sockio.h +++ b/sys/compat/linux/common/linux_sockio.h @@ -1,4 +1,4 @@ -/* $NetBSD: linux_sockio.h,v 1.18 2009/11/28 22:11:42 dsl Exp $ */ +/* $NetBSD: linux_sockio.h,v 1.19 2013/01/11 19:01:36 christos Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -76,4 +76,15 @@ struct linux_ifreq { #define ifr_map ifr_ifru.ifru_map /* device map */ }; +struct linux_ifconf { + int ifc_len; + union { + char *ifcu_buf; + struct linux_ifreq *ifcu_req; + } ifc_ifcu; +}; + +#define ifc_buf ifc_ifcu.ifcu_buf +#define ifc_req ifc_ifcu.ifcu_req + #endif /* !_LINUX_SOCKIO_H */ |
