summaryrefslogtreecommitdiff
path: root/arch/sparc/kernel/sys_sparc32.c
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2013-08-29 16:21:04 (GMT)
committerScott Wood <scottwood@freescale.com>2014-05-14 18:37:45 (GMT)
commit55d0c53740aa94a99615540ef5ab5afb98f5b55c (patch)
tree652c2d38ab140d4914e61d7e05a04022c1e687b6 /arch/sparc/kernel/sys_sparc32.c
parent10622edfde1dfb8717b43727828e651df45c5498 (diff)
downloadlinux-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