Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=303cd1535f6257b9fd8214534ca87b1a1567a2c5
Commit:     303cd1535f6257b9fd8214534ca87b1a1567a2c5
Parent:     bad77057ed59892bd5c7807dcf0c2500e5ff1fe7
Author:     Mathieu Desnoyers <[EMAIL PROTECTED]>
AuthorDate: Sun Mar 18 01:26:11 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Sun Mar 18 11:35:08 2007 -0700

    [PATCH] Fix atomicity of TIF update in flush_thread() for x86_64
    
    Fix atomicity of TIF update in flush_thread() for x86_64
    
    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: Rebecca Schultz <[EMAIL PROTECTED]>
    Signed-off-by: Mathieu Desnoyers <[EMAIL PROTECTED]>
    Acked-by: Andi Kleen <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 arch/x86_64/kernel/process.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c
index cbbc6ad..d8d5ccc 100644
--- a/arch/x86_64/kernel/process.c
+++ b/arch/x86_64/kernel/process.c
@@ -382,14 +382,17 @@ void exit_thread(void)
 void flush_thread(void)
 {
        struct task_struct *tsk = current;
-       struct thread_info *t = current_thread_info();
 
-       if (t->flags & _TIF_ABI_PENDING) {
-               t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
-               if (t->flags & _TIF_IA32)
+       if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
+               clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
+               if (test_tsk_thread_flag(tsk, TIF_IA32)) {
+                       clear_tsk_thread_flag(tsk, TIF_IA32);
+               } else {
+                       set_tsk_thread_flag(tsk, TIF_IA32);
                        current_thread_info()->status |= TS_COMPAT;
+               }
        }
-       t->flags &= ~_TIF_DEBUG;
+       clear_tsk_thread_flag(tsk, TIF_DEBUG);
 
        tsk->thread.debugreg0 = 0;
        tsk->thread.debugreg1 = 0;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to