diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2013-08-29 16:21:04 (GMT) |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2014-05-14 18:37:45 (GMT) |
commit | 55d0c53740aa94a99615540ef5ab5afb98f5b55c (patch) | |
tree | 652c2d38ab140d4914e61d7e05a04022c1e687b6 /arch/sparc/kernel/sys_sparc32.c | |
parent | 10622edfde1dfb8717b43727828e651df45c5498 (diff) | |
download | linux-fsl-qoriq-55d0c53740aa94a99615540ef5ab5afb98f5b55c.tar.xz |
ptrace: fix ptrace vs tasklist_lock race
As explained by Alexander Fyodorov <halcy@yandex.ru>:
|read_lock(&tasklist_lock) in ptrace_stop() is converted to mutex on RT kernel,
|and it can remove __TASK_TRACED from task->state (by moving it to
|task->saved_state). If parent does wait() on child followed by a sys_ptrace
|call, the following race can happen:
|
|- child sets __TASK_TRACED in ptrace_stop()
|- parent does wait() which eventually calls wait_task_stopped() and returns
| child's pid
|- child blocks on read_lock(&tasklist_lock) in ptrace_stop() and moves
| __TASK_TRACED flag to saved_state
|- parent calls sys_ptrace, which calls ptrace_check_attach() and wait_task_inactive()
The patch is based on his initial patch where an additional check is
added in case the __TASK_TRACED moved to ->saved_state. The pi_lock is
taken in case the caller is interrupted between looking into ->state and
->saved_state.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Diffstat (limited to 'arch/sparc/kernel/sys_sparc32.c')
0 files changed, 0 insertions, 0 deletions