Commit 89939e89 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller
Browse files

staging: rtlwifi: use siocdevprivate



rtl8188eu has an "android private" ioctl command multiplexer
that is not currently safe for use in compat mode because
of its triple-indirect pointer.

rtl8723bs uses a different interface on the SIOCDEVPRIVATE
command, based on the iwpriv data structure

Both also have normal unreachable iwpriv commands, and all
of the above should probably just get removed. For the
moment, just switch over to the new interface.

Cc: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9067f5d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ void rtw_stop_drv_threads(struct adapter *padapter);
void rtw_cancel_all_timer(struct adapter *padapter);

int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
int rtw_android_priv_cmd(struct net_device *dev, struct ifreq *rq,
			 void __user *data, int cmd);

struct net_device *rtw_init_netdev(void);
u16 rtw_recv_select_queue(struct sk_buff *skb);
+2 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ enum ANDROID_WIFI_CMD {
	ANDROID_WIFI_CMD_MAX
};

int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
			 void __user *data, int cmd);

#endif /* __RTW_ANDROID_H__ */
+0 −3
Original line number Diff line number Diff line
@@ -2769,9 +2769,6 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
		ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
		break;
#endif /*  CONFIG_88EU_AP_MODE */
	case (SIOCDEVPRIVATE + 1):
		ret = rtw_android_priv_cmd(dev, rq, cmd);
		break;
	default:
		ret = -EOPNOTSUPP;
		break;
+1 −0
Original line number Diff line number Diff line
@@ -288,6 +288,7 @@ static const struct net_device_ops rtw_netdev_ops = {
	.ndo_set_mac_address = rtw_net_set_mac_address,
	.ndo_get_stats = rtw_net_get_stats,
	.ndo_do_ioctl = rtw_ioctl,
	.ndo_siocdevprivate = rtw_android_priv_cmd,
};

static const struct device_type wlan_type = {
+11 −3
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
 *
 ******************************************************************************/

#include <linux/compat.h>
#include <linux/module.h>
#include <linux/netdevice.h>

@@ -116,7 +117,8 @@ static int android_get_p2p_addr(struct net_device *net, char *command,
	return ETH_ALEN;
}

int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
			 void __user *data, int cmd)
{
	int ret = 0;
	char *command;
@@ -124,9 +126,15 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
	int bytes_written = 0;
	struct android_wifi_priv_cmd priv_cmd;

	if (!ifr->ifr_data)
	if (cmd != SIOCDEVPRIVATE)
		return -EOPNOTSUPP;

	if (in_compat_syscall()) /* to be implemented */
		return -EOPNOTSUPP;

	if (!data)
		return -EINVAL;
	if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(priv_cmd)))
	if (copy_from_user(&priv_cmd, data, sizeof(priv_cmd)))
		return -EFAULT;
	if (priv_cmd.total_len < 1)
		return -EINVAL;
Loading