lift handling of SIOCIW... out of dev_ioctl()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2017-10-01 20:13:08 -04:00
parent 4cf808e7ac
commit b1b0c24506
4 changed files with 12 additions and 25 deletions

View File

@ -7,7 +7,7 @@
struct net; struct net;
#ifdef CONFIG_WEXT_CORE #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); void __user *arg);
int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
unsigned long arg); 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); struct iw_statistics *get_wireless_stats(struct net_device *dev);
int call_commit_handler(struct net_device *dev); int call_commit_handler(struct net_device *dev);
#else #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) void __user *arg)
{ {
return -EINVAL; return -EINVAL;

View File

@ -411,24 +411,6 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
if (cmd == SIOCGIFNAME) if (cmd == SIOCGIFNAME)
return dev_ifname(net, (struct ifreq __user *)arg); 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))) if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
return -EFAULT; return -EFAULT;

View File

@ -1005,7 +1005,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
} else } else
#ifdef CONFIG_WEXT_CORE #ifdef CONFIG_WEXT_CORE
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) {
err = dev_ioctl(net, cmd, argp); err = wext_handle_ioctl(net, cmd, argp);
} else } else
#endif #endif
switch (cmd) { switch (cmd) {

View File

@ -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, int wext_handle_ioctl(struct net *net, unsigned int cmd, void __user *arg)
void __user *arg)
{ {
struct iw_request_info info = { .cmd = cmd, .flags = 0 }; struct iw_request_info info = { .cmd = cmd, .flags = 0 };
struct iwreq iwr;
int ret; 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_standard_call,
ioctl_private_call); ioctl_private_call);
if (ret >= 0 && if (ret >= 0 &&
IW_IS_GET(cmd) && IW_IS_GET(cmd) &&
copy_to_user(arg, iwr, sizeof(struct iwreq))) copy_to_user(arg, &iwr, sizeof(struct iwreq)))
return -EFAULT; return -EFAULT;
return ret; return ret;