浏览代码

af_ieee802154: fix ioctl processing

fix two errors in ioctl processing:
1) if the ioctl isn't supported one should return -ENOIOCTLCMD
2) don't call ndo_do_ioctl if the device doesn't provide it

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Dmitry Eremin-Solenikov 16 年之前
父节点
当前提交
45a41d147a
共有 1 个文件被更改,包括 5 次插入3 次删除
  1. 5 3
      net/ieee802154/af_ieee802154.c

+ 5 - 3
net/ieee802154/af_ieee802154.c

@@ -136,7 +136,7 @@ static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg,
 		unsigned int cmd)
 		unsigned int cmd)
 {
 {
 	struct ifreq ifr;
 	struct ifreq ifr;
-	int ret = -EINVAL;
+	int ret = -ENOIOCTLCMD;
 	struct net_device *dev;
 	struct net_device *dev;
 
 
 	if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
 	if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
@@ -146,8 +146,10 @@ static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg,
 
 
 	dev_load(sock_net(sk), ifr.ifr_name);
 	dev_load(sock_net(sk), ifr.ifr_name);
 	dev = dev_get_by_name(sock_net(sk), ifr.ifr_name);
 	dev = dev_get_by_name(sock_net(sk), ifr.ifr_name);
-	if (dev->type == ARPHRD_IEEE802154 ||
-	    dev->type == ARPHRD_IEEE802154_PHY)
+
+	if ((dev->type == ARPHRD_IEEE802154 ||
+	     dev->type == ARPHRD_IEEE802154_PHY) &&
+	    dev->netdev_ops->ndo_do_ioctl)
 		ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, cmd);
 		ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, cmd);
 
 
 	if (!ret && copy_to_user(arg, &ifr, sizeof(struct ifreq)))
 	if (!ret && copy_to_user(arg, &ifr, sizeof(struct ifreq)))