]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Work around kernel rejecting valid absolute timestamps
authorAndreas Schwab <schwab@redhat.com>
Fri, 2 Jul 2010 02:07:14 +0000 (19:07 -0700)
committerUlrich Drepper <drepper@redhat.com>
Fri, 2 Jul 2010 02:07:14 +0000 (19:07 -0700)
nptl/ChangeLog
nptl/Makefile
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S

index 05c16ceef0696ff37490e7de05c0c4855499c4f9..d60e368f9cb07a774008c60e6748391abb23a5dc 100644 (file)
@@ -1,3 +1,23 @@
+2010-07-01  Andreas Schwab  <schwab@redhat.com>
+           Ulrich Drepper  <drepper@redhat.com>
+
+       * Makefile (tests): Add tst-abstime.
+       * tst-abstime.c: New file.
+       * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
+       (__lll_timedlock_wait): Check for timestamp before the Epoch.
+       * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
+       (__lll_timedlock_wait): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S
+       (__lll_robust_timedlock_wait): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+       (__pthread_cond_timedwait): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
+       (pthread_rwlock_timedrdlock): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
+       (pthread_rwlock_timedwrlock): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait):
+       Likewise.
+
 2010-07-01  Ulrich Drepper  <drepper@redhat.com>
 
        * Makefile (tst-_res1): Add tst-_res1mod1 to dependency list.
index 3dcc876b2bdcaa29023a1be1cbdb4dcc8ffed0a1..51b6ae51d7b287a294fff3b71528fb3ca0a6ad72 100644 (file)
@@ -256,6 +256,7 @@ tests = tst-typesizes \
        tst-sched1 \
        tst-backtrace1 \
        tst-oddstacklimit \
+       tst-abstime \
        tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \
        tst-getpid1 tst-getpid2 tst-getpid3 \
        tst-initializers1 $(patsubst %,tst-initializers1-%,c89 gnu89 c99 gnu99)
index 7578c7ece049c6baa36b77bf83a8517aeb326836..2198ccf55a917df1625e1a3b033d82b2d77e5766 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2004, 2006, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2004,2006,2007,2009,2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -188,6 +188,9 @@ __lll_timedlock_wait:
        je      .Lreltmo
 # endif
 
+       cmpl    $0, (%edx)
+       js      8f
+
        movl    %ecx, %ebx
        movl    %esi, %ecx
        movl    %edx, %esi
@@ -223,6 +226,9 @@ __lll_timedlock_wait:
        cfi_restore(%ebp)
        ret
 
+8:     movl    $ETIMEDOUT, %eax
+       jmp     7b
+
 # ifndef __ASSUME_FUTEX_CLOCK_REALTIME
 .Lreltmo:
        /* Check for a valid timeout value.  */
index 8de9cf461a0f1221b998269e361a0bf2f528be12..3195db259f10f919be703f8451b4028f03923bf1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2006, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2006, 2007, 2009, 2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -169,9 +169,13 @@ __lll_timedlock_wait:
        je      .Lreltmo
 # endif
 
+       cmpq    $0, (%rdx)
+       js      5f
+
        pushq   %r9
        cfi_adjust_cfa_offset(8)
        cfi_rel_offset(%r9, 0)
+
        movq    %rdx, %r10
        movl    $0xffffffff, %r9d
        LOAD_FUTEX_WAIT_ABS (%esi)
@@ -202,6 +206,9 @@ __lll_timedlock_wait:
        cfi_restore(%r9)
        retq
 
+5:     movl    $ETIMEDOUT, %eax
+       retq
+
 # ifndef __ASSUME_FUTEX_CLOCK_REALTIME
 .Lreltmo:
        /* Check for a valid timeout value.  */
index 02db0a4f9d7f9effab8e5218191ce3ff58a62bd6..5218a4f57a565e03f487adba387e3998b5367380 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009
-   Free Software Foundation, Inc.
+/* Copyright (C) 2002=2007, 2009, 2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -125,6 +124,9 @@ __lll_robust_timedlock_wait:
        je      .Lreltmo
 # endif
 
+       cmpq    $0, (%rdx)
+       js      7f
+
        pushq   %r9
        cfi_adjust_cfa_offset(8)
        cfi_rel_offset(%r9, 0)
@@ -180,6 +182,9 @@ __lll_robust_timedlock_wait:
        cfi_adjust_cfa_offset(-8)
        cfi_restore(%r9)
 
+7:     movl    $ETIMEDOUT, %eax
+       retq
+
 
 # ifndef __ASSUME_FUTEX_CLOCK_REALTIME
 .Lreltmo:
index be14fc897ef4e2deedc490e42c21a428b683794e..e6535fb9a790dee1b6f855bde47249ad1911dd71 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -144,6 +144,10 @@ __pthread_cond_timedwait:
        movq    %r9, 24(%rsp)
        movl    %edx, 4(%rsp)
 
+       cmpq    $0, (%r13)
+       movq    $-ETIMEDOUT, %r14
+       js      36f
+
 38:    movl    cond_futex(%rdi), %r12d
 
        /* Unlock.  */
index 23b218af34cae0ef7f3fc29d702c7a41bcdef268..f5d055c77ec9f35fb3809e26427130df2daf26f0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -102,6 +102,9 @@ pthread_rwlock_timedrdlock:
        je      .Lreltmo
 #endif
 
+       cmpq    $0, (%r13)
+       js      16f             /* Time is already up.  */
+
        movl    $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi
        xorl    PSHARED(%r12), %esi
        movq    %r13, %r10
index cd867b60dcceea638f053c40731d7aac160afdb5..6ed8b49bd65c58fe0565e9fe14c85319e46c9876 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -99,6 +99,9 @@ pthread_rwlock_timedwrlock:
        je      .Lreltmo
 #endif
 
+       cmpq    $0, (%r13)
+       js      16f             /* Time is already up. */
+
        movl    $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi
        xorl    PSHARED(%r12), %esi
        movq    %r13, %r10
index 0291beb169908825d4e3d5bd74562513cd10d236..ca49cb89d05eb80ef939c1946b10d018ffc91a40 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002,2003,2005,2007,2009,2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -77,6 +77,9 @@ sem_timedwait:
        je      .Lreltmo
 #endif
 
+       cmpq    $0, (%rsi)
+       js      16f
+
        /* This push is only needed to store the sem_t pointer for the
           exception handler.  */
        pushq   %rdi
@@ -169,6 +172,19 @@ sem_timedwait:
 
        retq
 
+16:
+#if USE___THREAD
+       movq    errno@gottpoff(%rip), %rdx
+       movl    $ETIMEDOUT, %fs:(%rdx)
+#else
+       callq   __errno_location@plt
+       movl    $ETIMEDOUT, (%rax)
+#endif
+
+       orl     $-1, %eax
+
+       retq
+
 #ifndef __ASSUME_FUTEX_CLOCK_REALTIME
 .Lreltmo:
        pushq   %r12