Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1b0c245 authored by Al Viro's avatar Al Viro
Browse files

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



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 4cf808e7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;
+0 −18
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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) {
+9 −4
Original line number Diff line number Diff line
@@ -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;