Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pid: implement ns_of_pid

A current problem with the pid namespace is that it is easy to do pid
related work after exit_task_namespaces which drops the nsproxy pointer.

However if we are doing pid namespace related work we are always operating
on some struct pid which retains the pid_namespace pointer of the pid
namespace it was allocated in.

So provide ns_of_pid which allows us to find the pid namespace a pid was
allocated in.

Using this we have the needed infrastructure to do pid namespace related
work at anytime we have a struct pid, removing the chance of accidentally
having a NULL pointer dereference when accessing current->nsproxy.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Roland McGrath <roland@redhat.com>
Cc: Bastian Blank <bastian@waldi.eu.org>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Nadia Derbey <Nadia.Derbey@bull.net>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Eric W. Biederman and committed by
Linus Torvalds
f9fb860f 6af866af

+18
+18
include/linux/pid.h
··· 123 123 extern void free_pid(struct pid *pid); 124 124 125 125 /* 126 + * ns_of_pid() returns the pid namespace in which the specified pid was 127 + * allocated. 128 + * 129 + * NOTE: 130 + * ns_of_pid() is expected to be called for a process (task) that has 131 + * an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid 132 + * is expected to be non-NULL. If @pid is NULL, caller should handle 133 + * the resulting NULL pid-ns. 134 + */ 135 + static inline struct pid_namespace *ns_of_pid(struct pid *pid) 136 + { 137 + struct pid_namespace *ns = NULL; 138 + if (pid) 139 + ns = pid->numbers[pid->level].ns; 140 + return ns; 141 + } 142 + 143 + /* 126 144 * the helpers to get the pid's id seen from different namespaces 127 145 * 128 146 * pid_nr() : global id, i.e. the id seen from the init namespace;