|
@@ -2850,10 +2850,10 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
unsigned long arg, int ifreq_len)
|
|
|
{
|
|
|
struct tun_file *tfile = file->private_data;
|
|
|
+ struct net *net = sock_net(&tfile->sk);
|
|
|
struct tun_struct *tun;
|
|
|
void __user* argp = (void __user*)arg;
|
|
|
struct ifreq ifr;
|
|
|
- struct net *net;
|
|
|
kuid_t owner;
|
|
|
kgid_t group;
|
|
|
int sndbuf;
|
|
@@ -2877,14 +2877,18 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
*/
|
|
|
return put_user(IFF_TUN | IFF_TAP | TUN_FEATURES,
|
|
|
(unsigned int __user*)argp);
|
|
|
- } else if (cmd == TUNSETQUEUE)
|
|
|
+ } else if (cmd == TUNSETQUEUE) {
|
|
|
return tun_set_queue(file, &ifr);
|
|
|
+ } else if (cmd == SIOCGSKNS) {
|
|
|
+ if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
|
|
|
+ return -EPERM;
|
|
|
+ return open_related_ns(&net->ns, get_net_ns);
|
|
|
+ }
|
|
|
|
|
|
ret = 0;
|
|
|
rtnl_lock();
|
|
|
|
|
|
tun = tun_get(tfile);
|
|
|
- net = sock_net(&tfile->sk);
|
|
|
if (cmd == TUNSETIFF) {
|
|
|
ret = -EEXIST;
|
|
|
if (tun)
|
|
@@ -2914,14 +2918,6 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
tfile->ifindex = ifindex;
|
|
|
goto unlock;
|
|
|
}
|
|
|
- if (cmd == SIOCGSKNS) {
|
|
|
- ret = -EPERM;
|
|
|
- if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
|
|
|
- goto unlock;
|
|
|
-
|
|
|
- ret = open_related_ns(&net->ns, get_net_ns);
|
|
|
- goto unlock;
|
|
|
- }
|
|
|
|
|
|
ret = -EBADFD;
|
|
|
if (!tun)
|