diff options
author | Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> | 2009-04-02 19:58:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-02 22:04:58 -0400 |
commit | e4da026f980df125a4918c3bb9fe93185c7ef12a (patch) | |
tree | bb755bb687bca82feb05ba3bb6962ef57257dd9a /kernel | |
parent | 921cf9f63089c7442d44083477620132f4cea066 (diff) |
signals: zap_pid_ns_process() should use force_sig()
send_signal() assumes that signals with SEND_SIG_PRIV are generated from
within the same namespace. So any nested container-init processes become
immune to the SIGKILL generated by kill_proc_info() in
zap_pid_ns_processes().
Use force_sig() in zap_pid_ns_processes() instead - force_sig() clears the
SIGNAL_UNKILLABLE flag ensuring the signal is processed by
container-inits.
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Daniel Lezcano <daniel.lezcano@free.fr>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/pid_namespace.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index fab8ea86fac3..2d1001b4858d 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
@@ -152,6 +152,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
152 | { | 152 | { |
153 | int nr; | 153 | int nr; |
154 | int rc; | 154 | int rc; |
155 | struct task_struct *task; | ||
155 | 156 | ||
156 | /* | 157 | /* |
157 | * The last thread in the cgroup-init thread group is terminating. | 158 | * The last thread in the cgroup-init thread group is terminating. |
@@ -169,7 +170,19 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
169 | read_lock(&tasklist_lock); | 170 | read_lock(&tasklist_lock); |
170 | nr = next_pidmap(pid_ns, 1); | 171 | nr = next_pidmap(pid_ns, 1); |
171 | while (nr > 0) { | 172 | while (nr > 0) { |
172 | kill_proc_info(SIGKILL, SEND_SIG_PRIV, nr); | 173 | rcu_read_lock(); |
174 | |||
175 | /* | ||
176 | * Use force_sig() since it clears SIGNAL_UNKILLABLE ensuring | ||
177 | * any nested-container's init processes don't ignore the | ||
178 | * signal | ||
179 | */ | ||
180 | task = pid_task(find_vpid(nr), PIDTYPE_PID); | ||
181 | if (task) | ||
182 | force_sig(SIGKILL, task); | ||
183 | |||
184 | rcu_read_unlock(); | ||
185 | |||
173 | nr = next_pidmap(pid_ns, nr); | 186 | nr = next_pidmap(pid_ns, nr); |
174 | } | 187 | } |
175 | read_unlock(&tasklist_lock); | 188 | read_unlock(&tasklist_lock); |