Skip to content

Commit c62cce2

Browse files
avagindavem330
authored andcommitted
net: add an ioctl to get a socket network namespace
Each socket operates in a network namespace where it has been created, so if we want to dump and restore a socket, we have to know its network namespace. We have a socket_diag to get information about sockets, it doesn't report sockets which are not bound or connected. This patch introduces a new socket ioctl, which is called SIOCGSKNS and used to get a file descriptor for a socket network namespace. A task must have CAP_NET_ADMIN in a target network namespace to use this ioctl. Cc: "David S. Miller" <davem@davemloft.net> Cc: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Andrei Vagin <avagin@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 2a43ca0 commit c62cce2

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

fs/nsfs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void *ns_get_path(struct path *path, struct task_struct *task,
118118
return ret;
119119
}
120120

121-
static int open_related_ns(struct ns_common *ns,
121+
int open_related_ns(struct ns_common *ns,
122122
struct ns_common *(*get_ns)(struct ns_common *ns))
123123
{
124124
struct path path = {};

include/linux/proc_fs.h

+4
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,8 @@ static inline struct proc_dir_entry *proc_net_mkdir(
8282
return proc_mkdir_data(name, 0, parent, net);
8383
}
8484

85+
struct ns_common;
86+
int open_related_ns(struct ns_common *ns,
87+
struct ns_common *(*get_ns)(struct ns_common *ns));
88+
8589
#endif /* _LINUX_PROC_FS_H */

include/uapi/linux/sockios.h

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#define SIOCWANDEV 0x894A /* get/set netdev parameters */
8585

8686
#define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */
87+
#define SIOCGSKNS 0x894C /* get socket network namespace */
8788

8889
/* ARP cache control calls. */
8990
/* 0x8950 - 0x8952 * obsolete calls, don't re-use */

net/socket.c

+13
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,11 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
877877
* what to do with it - that's up to the protocol still.
878878
*/
879879

880+
static struct ns_common *get_net_ns(struct ns_common *ns)
881+
{
882+
return &get_net(container_of(ns, struct net, ns))->ns;
883+
}
884+
880885
static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
881886
{
882887
struct socket *sock;
@@ -945,6 +950,13 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
945950
err = dlci_ioctl_hook(cmd, argp);
946951
mutex_unlock(&dlci_ioctl_mutex);
947952
break;
953+
case SIOCGSKNS:
954+
err = -EPERM;
955+
if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
956+
break;
957+
958+
err = open_related_ns(&net->ns, get_net_ns);
959+
break;
948960
default:
949961
err = sock_do_ioctl(net, sock, cmd, arg);
950962
break;
@@ -3093,6 +3105,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
30933105
case SIOCSIFVLAN:
30943106
case SIOCADDDLCI:
30953107
case SIOCDELDLCI:
3108+
case SIOCGSKNS:
30963109
return sock_ioctl(file, cmd, arg);
30973110

30983111
case SIOCGIFFLAGS:

0 commit comments

Comments
 (0)