Commit f9fb860f67b9542cd78d1558dec7058092b57d8e

Authored by Eric W. Biederman
Committed by Linus Torvalds
1 parent 6af866af34

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>

Showing 1 changed file with 18 additions and 0 deletions Side-by-side Diff

... ... @@ -123,6 +123,24 @@
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;