diff options
Diffstat (limited to 'net/core/net-sysfs.c')
| -rw-r--r-- | net/core/net-sysfs.c | 21 | 
1 files changed, 10 insertions, 11 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 017a8bacfb2..28c5f5aa7ca 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -18,11 +18,9 @@  #include <net/sock.h>  #include <net/net_namespace.h>  #include <linux/rtnetlink.h> -#include <linux/wireless.h>  #include <linux/vmalloc.h>  #include <linux/export.h>  #include <linux/jiffies.h> -#include <net/wext.h>  #include "net-sysfs.h" @@ -73,11 +71,12 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,  			    const char *buf, size_t len,  			    int (*set)(struct net_device *, unsigned long))  { -	struct net_device *net = to_net_dev(dev); +	struct net_device *netdev = to_net_dev(dev); +	struct net *net = dev_net(netdev);  	unsigned long new;  	int ret = -EINVAL; -	if (!capable(CAP_NET_ADMIN)) +	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))  		return -EPERM;  	ret = kstrtoul(buf, 0, &new); @@ -87,8 +86,8 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,  	if (!rtnl_trylock())  		return restart_syscall(); -	if (dev_isalive(net)) { -		if ((ret = (*set)(net, new)) == 0) +	if (dev_isalive(netdev)) { +		if ((ret = (*set)(netdev, new)) == 0)  			ret = len;  	}  	rtnl_unlock(); @@ -264,6 +263,9 @@ static ssize_t store_tx_queue_len(struct device *dev,  				  struct device_attribute *attr,  				  const char *buf, size_t len)  { +	if (!capable(CAP_NET_ADMIN)) +		return -EPERM; +  	return netdev_store(dev, attr, buf, len, change_tx_queue_len);  } @@ -271,10 +273,11 @@ static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr,  			     const char *buf, size_t len)  {  	struct net_device *netdev = to_net_dev(dev); +	struct net *net = dev_net(netdev);  	size_t count = len;  	ssize_t ret; -	if (!capable(CAP_NET_ADMIN)) +	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))  		return -EPERM;  	/* ignore trailing newline */ @@ -1331,7 +1334,6 @@ struct kobj_ns_type_operations net_ns_type_operations = {  };  EXPORT_SYMBOL_GPL(net_ns_type_operations); -#ifdef CONFIG_HOTPLUG  static int netdev_uevent(struct device *d, struct kobj_uevent_env *env)  {  	struct net_device *dev = to_net_dev(d); @@ -1350,7 +1352,6 @@ static int netdev_uevent(struct device *d, struct kobj_uevent_env *env)  exit:  	return retval;  } -#endif  /*   *	netdev_release -- destroy and free a dead device. @@ -1379,9 +1380,7 @@ static struct class net_class = {  #ifdef CONFIG_SYSFS  	.dev_attrs = net_class_attributes,  #endif /* CONFIG_SYSFS */ -#ifdef CONFIG_HOTPLUG  	.dev_uevent = netdev_uevent, -#endif  	.ns_type = &net_ns_type_operations,  	.namespace = net_namespace,  };  |