|
@@ -78,6 +78,7 @@
|
|
#include <linux/mutex.h>
|
|
#include <linux/mutex.h>
|
|
|
|
|
|
#include <linux/uaccess.h>
|
|
#include <linux/uaccess.h>
|
|
|
|
+#include <linux/proc_fs.h>
|
|
|
|
|
|
/* Uncomment to enable debugging */
|
|
/* Uncomment to enable debugging */
|
|
/* #define TUN_DEBUG 1 */
|
|
/* #define TUN_DEBUG 1 */
|
|
@@ -2793,6 +2794,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
struct tun_struct *tun;
|
|
struct tun_struct *tun;
|
|
void __user* argp = (void __user*)arg;
|
|
void __user* argp = (void __user*)arg;
|
|
struct ifreq ifr;
|
|
struct ifreq ifr;
|
|
|
|
+ struct net *net;
|
|
kuid_t owner;
|
|
kuid_t owner;
|
|
kgid_t group;
|
|
kgid_t group;
|
|
int sndbuf;
|
|
int sndbuf;
|
|
@@ -2801,7 +2803,8 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
int le;
|
|
int le;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || _IOC_TYPE(cmd) == SOCK_IOC_TYPE) {
|
|
|
|
|
|
+ if (cmd == TUNSETIFF || cmd == TUNSETQUEUE ||
|
|
|
|
+ (_IOC_TYPE(cmd) == SOCK_IOC_TYPE && cmd != SIOCGSKNS)) {
|
|
if (copy_from_user(&ifr, argp, ifreq_len))
|
|
if (copy_from_user(&ifr, argp, ifreq_len))
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
} else {
|
|
} else {
|
|
@@ -2821,6 +2824,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
rtnl_lock();
|
|
rtnl_lock();
|
|
|
|
|
|
tun = tun_get(tfile);
|
|
tun = tun_get(tfile);
|
|
|
|
+ net = sock_net(&tfile->sk);
|
|
if (cmd == TUNSETIFF) {
|
|
if (cmd == TUNSETIFF) {
|
|
ret = -EEXIST;
|
|
ret = -EEXIST;
|
|
if (tun)
|
|
if (tun)
|
|
@@ -2828,7 +2832,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
|
|
|
ifr.ifr_name[IFNAMSIZ-1] = '\0';
|
|
ifr.ifr_name[IFNAMSIZ-1] = '\0';
|
|
|
|
|
|
- ret = tun_set_iff(sock_net(&tfile->sk), file, &ifr);
|
|
|
|
|
|
+ ret = tun_set_iff(net, file, &ifr);
|
|
|
|
|
|
if (ret)
|
|
if (ret)
|
|
goto unlock;
|
|
goto unlock;
|
|
@@ -2850,6 +2854,14 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
tfile->ifindex = ifindex;
|
|
tfile->ifindex = ifindex;
|
|
goto unlock;
|
|
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;
|
|
ret = -EBADFD;
|
|
if (!tun)
|
|
if (!tun)
|