[SPARC64]: Fix atomicity of TIF update in flush_thread()

Fix atomicity of TIF update in flush_thread() for sparc64

Fixes correctly the race by using *_ti_thread_flag.

Race :

parent process executing :
sys_ptrace()
(lock_kernel())
(ptrace_get_task_struct(pid))
arch_ptrace()
ptrace_detach()
ptrace_disable(child);
clear_singlestep(child);
clear_tsk_thread_flag(child, TIF_SINGLESTEP);
(which clears the TIF_SINGLESTEP flag atomically from a different
process)
(put_task_struct(child))
(unlock_kernel())

And at the same time, in the child process :
sys_execve()
do_execve()
search_binary_handler()
load_elf_binary()
flush_old_exec()
flush_thread()
doing a non-atomic thread flag update

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Mathieu Desnoyers and committed by David S. Miller c0a79b22 63abdcdc

+7 -2
+7 -2
arch/sparc64/kernel/process.c
··· 413 413 struct thread_info *t = current_thread_info(); 414 414 struct mm_struct *mm; 415 415 416 - if (t->flags & _TIF_ABI_PENDING) 417 - t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT); 416 + if (test_ti_thread_flag(t, TIF_ABI_PENDING)) { 417 + clear_ti_thread_flag(t, TIF_ABI_PENDING); 418 + if (test_ti_thread_flag(t, TIF_32BIT)) 419 + clear_ti_thread_flag(t, TIF_32BIT); 420 + else 421 + set_ti_thread_flag(t, TIF_32BIT); 422 + } 418 423 419 424 mm = t->task->mm; 420 425 if (mm)