diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2012-03-08 09:33:12 +0100 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2012-03-08 09:33:12 +0100 |
commit | 48aff7765b16851c4c3c5b7beb44c878d0d24ae8 (patch) | |
tree | 5526b4e91f2306ee1eaa14ac67c52267bc49f9f5 /nptl | |
parent | aea5d7277a2ebd2f432bc3196e4a0e2afe8d5878 (diff) | |
download | glibc-48aff7765b16851c4c3c5b7beb44c878d0d24ae8.zip glibc-48aff7765b16851c4c3c5b7beb44c878d0d24ae8.tar.gz glibc-48aff7765b16851c4c3c5b7beb44c878d0d24ae8.tar.bz2 |
Fix 9554ebf2d4da22591e974d3cf2ed09a2b8dbdbd8.
| Invalid timeouts in i386 sem_timedwait.
|
| We adjusted nwaiters even though this isn't necessary.
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 6 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S | 9 | ||||
-rw-r--r-- | nptl/tst-sem13.c | 23 |
3 files changed, 33 insertions, 5 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index dd6f334..6cf6b3f 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -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] diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S index 4740aee..0389243 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S @@ -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 diff --git a/nptl/tst-sem13.c b/nptl/tst-sem13.c index 8756b22..068d79e 100644 --- a/nptl/tst-sem13.c +++ b/nptl/tst-sem13.c @@ -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; } |