Commit 137d1a26c842a384c98dd2a6a605014fddf5c777
Committed by
Linus Torvalds
1 parent
9bd0a07712
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
um: fix possible race on task->mm
Checking for task->mm is dangerous as ->mm might disappear (exit_mm() assigns NULL under task_lock(), so tasklist lock is not enough). We can't use get_task_mm()/mmput() pair as mmput() might sleep, so let's take the task lock while we care about its mm. Note that we should also use find_lock_task_mm() to check all process' threads for a valid mm, but for uml we'll do it in a separate patch. Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org> Cc: Richard Weinberger <richard@nod.at> Cc: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 5 additions and 2 deletions Side-by-side Diff
arch/um/kernel/reboot.c
... | ... | @@ -25,10 +25,13 @@ |
25 | 25 | |
26 | 26 | read_lock(&tasklist_lock); |
27 | 27 | for_each_process(p) { |
28 | - if (p->mm == NULL) | |
28 | + task_lock(p); | |
29 | + if (!p->mm) { | |
30 | + task_unlock(p); | |
29 | 31 | continue; |
30 | - | |
32 | + } | |
31 | 33 | pid = p->mm->context.id.u.pid; |
34 | + task_unlock(p); | |
32 | 35 | os_kill_ptraced_process(pid, 1); |
33 | 36 | } |
34 | 37 | read_unlock(&tasklist_lock); |