|
@@ -877,6 +877,11 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
|
|
|
* what to do with it - that's up to the protocol still.
|
|
|
*/
|
|
|
|
|
|
+static struct ns_common *get_net_ns(struct ns_common *ns)
|
|
|
+{
|
|
|
+ return &get_net(container_of(ns, struct net, ns))->ns;
|
|
|
+}
|
|
|
+
|
|
|
static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|
|
{
|
|
|
struct socket *sock;
|
|
@@ -945,6 +950,13 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|
|
err = dlci_ioctl_hook(cmd, argp);
|
|
|
mutex_unlock(&dlci_ioctl_mutex);
|
|
|
break;
|
|
|
+ case SIOCGSKNS:
|
|
|
+ err = -EPERM;
|
|
|
+ if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
|
|
|
+ break;
|
|
|
+
|
|
|
+ err = open_related_ns(&net->ns, get_net_ns);
|
|
|
+ break;
|
|
|
default:
|
|
|
err = sock_do_ioctl(net, sock, cmd, arg);
|
|
|
break;
|
|
@@ -3093,6 +3105,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
|
|
|
case SIOCSIFVLAN:
|
|
|
case SIOCADDDLCI:
|
|
|
case SIOCDELDLCI:
|
|
|
+ case SIOCGSKNS:
|
|
|
return sock_ioctl(file, cmd, arg);
|
|
|
|
|
|
case SIOCGIFFLAGS:
|