aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/wext.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/net/wireless/wext.c b/net/wireless/wext.c
index e9c88172ec55..09022cbb58ba 100644
--- a/net/wireless/wext.c
+++ b/net/wireless/wext.c
@@ -1079,8 +1079,10 @@ static int wext_permission_check(unsigned int cmd)
1079} 1079}
1080 1080
1081/* entry point from dev ioctl */ 1081/* entry point from dev ioctl */
1082int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd, 1082static int wext_ioctl_dispatch(struct net *net, struct ifreq *ifr,
1083 void __user *arg) 1083 unsigned int cmd,
1084 wext_ioctl_func standard,
1085 wext_ioctl_func private)
1084{ 1086{
1085 int ret = wext_permission_check(cmd); 1087 int ret = wext_permission_check(cmd);
1086 1088
@@ -1089,12 +1091,24 @@ int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd,
1089 1091
1090 dev_load(net, ifr->ifr_name); 1092 dev_load(net, ifr->ifr_name);
1091 rtnl_lock(); 1093 rtnl_lock();
1092 ret = wireless_process_ioctl(net, ifr, cmd, 1094 ret = wireless_process_ioctl(net, ifr, cmd, standard, private);
1093 ioctl_standard_call,
1094 ioctl_private_call);
1095 rtnl_unlock(); 1095 rtnl_unlock();
1096 if (IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct iwreq))) 1096
1097 return ret;
1098}
1099
1100int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd,
1101 void __user *arg)
1102{
1103 int ret = wext_ioctl_dispatch(net, ifr, cmd,
1104 ioctl_standard_call,
1105 ioctl_private_call);
1106
1107 if (ret >= 0 &&
1108 IW_IS_GET(cmd) &&
1109 copy_to_user(arg, ifr, sizeof(struct iwreq)))
1097 return -EFAULT; 1110 return -EFAULT;
1111
1098 return ret; 1112 return ret;
1099} 1113}
1100 1114