diff options
Diffstat (limited to 'kernel/pid_namespace.c')
| -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); |
