Fix infloop in __pthread_disable_asynccancel on x86_64
authorAndreas Schwab <schwab@redhat.com>
Sat, 28 Nov 2009 05:37:30 +0000 (21:37 -0800)
committerUlrich Drepper <drepper@redhat.com>
Sat, 28 Nov 2009 05:37:30 +0000 (21:37 -0800)
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S

index d0e1abc..b964fd8 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-27  Andreas Schwab  <schwab@redhat.com>
+
+       * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Reload
+       THREAD_SELF->cancelhandling after returning from futex call.
+
 2009-11-24  Ulrich Drepper  <drepper@redhat.com>
 
        * tst-sem13.c: New file.
index 0d48ec6..6806962 100644 (file)
@@ -96,8 +96,8 @@ ENTRY(__pthread_disable_asynccancel)
        cmpxchgl %r11d, %fs:CANCELHANDLING
        jnz     2b
 
-3:     movl    %r11d, %eax
-       andl    $(TCB_CANCELING_BITMASK|TCB_CANCELED_BITMASK), %eax
+       movl    %r11d, %eax
+3:     andl    $(TCB_CANCELING_BITMASK|TCB_CANCELED_BITMASK), %eax
        cmpl    $TCB_CANCELING_BITMASK, %eax
        je      4f
 1:     ret
@@ -111,5 +111,6 @@ ENTRY(__pthread_disable_asynccancel)
        addq    $CANCELHANDLING, %rdi
        LOAD_PRIVATE_FUTEX_WAIT (%esi)
        syscall
+       movl    %fs:CANCELHANDLING, %eax
        jmp     3b
 END(__pthread_disable_asynccancel)