]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix 9554ebf2d4da22591e974d3cf2ed09a2b8dbdbd8.
authorThomas Schwinge <thomas@codesourcery.com>
Thu, 8 Mar 2012 08:33:12 +0000 (09:33 +0100)
committerThomas Schwinge <thomas@codesourcery.com>
Thu, 8 Mar 2012 08:33:12 +0000 (09:33 +0100)
| Invalid timeouts in i386 sem_timedwait.
|
| We adjusted nwaiters even though this isn't necessary.

nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S
nptl/tst-sem13.c

index dd6f334a3d87a6cdb84b71e0446f3fd315e00d88..6cf6b3fed9f29726de94a3c6ce8d73e8f45d95a2 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-08  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * tst-sem13.c (do_test): Add another test case.
+       * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait):
+       Fix updating nwaiters.
+
 2012-03-07  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #10545]
index 4740aee10dae584a3babf731353cf613439565bf..03892437f60efab1a2c994d796a96ee68343efe9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2005, 2007, 2009, 2011-2012 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -64,7 +64,7 @@ sem_timedwait:
        /* Check for invalid nanosecond field.  */
        cmpl    $1000000000, 4(%edi)
        movl    $EINVAL, %esi
-       jae     6f
+       jae     .Lerrno_exit
 
        LOCK
        incl    NWAITERS(%ecx)
@@ -146,6 +146,10 @@ sem_timedwait:
 .Lafter_ret:
 3:     negl    %esi
 6:
+       movl    28(%esp), %ebx  /* Load semaphore address.  */
+       LOCK
+       decl    NWAITERS(%ebx)
+.Lerrno_exit:
 #ifdef PIC
        SETUP_PIC_REG(bx)
 #else
@@ -162,7 +166,6 @@ sem_timedwait:
        movl    %esi, %gs:(%edx)
 #endif
 
-       movl    28(%esp), %ebx  /* Load semaphore address.  */
        orl     $-1, %eax
        jmp     10b
        .size   sem_timedwait,.-sem_timedwait
index 8756b2262fd9d39c8153d128c015031968700ad2..068d79e85e993b081a21450314f4c7fa3b728d74 100644 (file)
@@ -30,12 +30,31 @@ do_test (void)
     }
   if (errno != EINVAL)
     {
-      puts ("sem_timedwait did not fail with EINVAL");
+      perror ("sem_timedwait did not fail with EINVAL");
       return 1;
     }
   if (u.ns.nwaiters != 0)
     {
-      puts ("nwaiters modified");
+      printf ("sem_timedwait modified nwaiters: %ld\n", u.ns.nwaiters);
+      return 1;
+    }
+
+  ts.tv_sec = /* Invalid.  */ -2;
+  ts.tv_nsec = 0;
+  errno = 0;
+  if (sem_timedwait (&u.s, &ts) >= 0)
+    {
+      puts ("2nd sem_timedwait did not fail");
+      return 1;
+    }
+  if (errno != ETIMEDOUT)
+    {
+      perror ("2nd sem_timedwait did not fail with ETIMEDOUT");
+      return 1;
+    }
+  if (u.ns.nwaiters != 0)
+    {
+      printf ("2nd sem_timedwait modified nwaiters: %ld\n", u.ns.nwaiters);
       return 1;
     }