From: Al Viro <v...@zeniv.linux.org.uk>

Signed-off-by: Al Viro <v...@zeniv.linux.org.uk>
---
 include/net/wext.h       |  4 ++--
 net/core/dev_ioctl.c     | 18 ------------------
 net/socket.c             |  2 +-
 net/wireless/wext-core.c | 13 +++++++++----
 4 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/include/net/wext.h b/include/net/wext.h
index e51f067fdb3a..aa192a670304 100644
--- a/include/net/wext.h
+++ b/include/net/wext.h
@@ -7,7 +7,7 @@
 struct net;
 
 #ifdef CONFIG_WEXT_CORE
-int wext_handle_ioctl(struct net *net, struct iwreq *iwr, unsigned int cmd,
+int wext_handle_ioctl(struct net *net, unsigned int cmd,
                      void __user *arg);
 int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
                             unsigned long arg);
@@ -15,7 +15,7 @@ int compat_wext_handle_ioctl(struct net *net, unsigned int 
cmd,
 struct iw_statistics *get_wireless_stats(struct net_device *dev);
 int call_commit_handler(struct net_device *dev);
 #else
-static inline int wext_handle_ioctl(struct net *net, struct iwreq *iwr, 
unsigned int cmd,
+static inline int wext_handle_ioctl(struct net *net, unsigned int cmd,
                                    void __user *arg)
 {
        return -EINVAL;
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
index 5cdec23dd28e..d262f159f9fd 100644
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -411,24 +411,6 @@ int dev_ioctl(struct net *net, unsigned int cmd, void 
__user *arg)
        if (cmd == SIOCGIFNAME)
                return dev_ifname(net, (struct ifreq __user *)arg);
 
-       /*
-        * Take care of Wireless Extensions. Unfortunately struct iwreq
-        * isn't a proper subset of struct ifreq (it's 8 byte shorter)
-        * so we need to treat it specially, otherwise applications may
-        * fault if the struct they're passing happens to land at the
-        * end of a mapped page.
-        */
-       if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
-               struct iwreq iwr;
-
-               if (copy_from_user(&iwr, arg, sizeof(iwr)))
-                       return -EFAULT;
-
-               iwr.ifr_name[sizeof(iwr.ifr_name) - 1] = 0;
-
-               return wext_handle_ioctl(net, &iwr, cmd, arg);
-       }
-
        if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
                return -EFAULT;
 
diff --git a/net/socket.c b/net/socket.c
index 6d29ebce93dd..d0e24f6ec1a9 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1005,7 +1005,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, 
unsigned long arg)
        } else
 #ifdef CONFIG_WEXT_CORE
        if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
-               err = dev_ioctl(net, cmd, argp);
+               err = wext_handle_ioctl(net, cmd, argp);
        } else
 #endif
                switch (cmd) {
diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c
index 6cdb054484d6..9efbfc753347 100644
--- a/net/wireless/wext-core.c
+++ b/net/wireless/wext-core.c
@@ -1035,18 +1035,23 @@ static int ioctl_standard_call(struct net_device *      
dev,
 }
 
 
-int wext_handle_ioctl(struct net *net, struct iwreq *iwr, unsigned int cmd,
-                     void __user *arg)
+int wext_handle_ioctl(struct net *net, unsigned int cmd, void __user *arg)
 {
        struct iw_request_info info = { .cmd = cmd, .flags = 0 };
+       struct iwreq iwr;
        int ret;
 
-       ret = wext_ioctl_dispatch(net, iwr, cmd, &info,
+       if (copy_from_user(&iwr, arg, sizeof(iwr)))
+               return -EFAULT;
+
+       iwr.ifr_name[sizeof(iwr.ifr_name) - 1] = 0;
+
+       ret = wext_ioctl_dispatch(net, &iwr, cmd, &info,
                                  ioctl_standard_call,
                                  ioctl_private_call);
        if (ret >= 0 &&
            IW_IS_GET(cmd) &&
-           copy_to_user(arg, iwr, sizeof(struct iwreq)))
+           copy_to_user(arg, &iwr, sizeof(struct iwreq)))
                return -EFAULT;
 
        return ret;
-- 
2.11.0

Reply via email to