| Invalid timeouts in i386 sem_timedwait.
|
| We adjusted nwaiters even though this isn't necessary.
This commit is contained in:
Thomas Schwinge 2012-03-08 09:33:12 +01:00
parent aea5d7277a
commit 48aff7765b
3 changed files with 33 additions and 5 deletions

View 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> 2012-03-07 Joseph Myers <joseph@codesourcery.com>
[BZ #10545] [BZ #10545]

View 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -64,7 +64,7 @@ sem_timedwait:
/* Check for invalid nanosecond field. */ /* Check for invalid nanosecond field. */
cmpl $1000000000, 4(%edi) cmpl $1000000000, 4(%edi)
movl $EINVAL, %esi movl $EINVAL, %esi
jae 6f jae .Lerrno_exit
LOCK LOCK
incl NWAITERS(%ecx) incl NWAITERS(%ecx)
@ -146,6 +146,10 @@ sem_timedwait:
.Lafter_ret: .Lafter_ret:
3: negl %esi 3: negl %esi
6: 6:
movl 28(%esp), %ebx /* Load semaphore address. */
LOCK
decl NWAITERS(%ebx)
.Lerrno_exit:
#ifdef PIC #ifdef PIC
SETUP_PIC_REG(bx) SETUP_PIC_REG(bx)
#else #else
@ -162,7 +166,6 @@ sem_timedwait:
movl %esi, %gs:(%edx) movl %esi, %gs:(%edx)
#endif #endif
movl 28(%esp), %ebx /* Load semaphore address. */
orl $-1, %eax orl $-1, %eax
jmp 10b jmp 10b
.size sem_timedwait,.-sem_timedwait .size sem_timedwait,.-sem_timedwait

View File

@ -30,12 +30,31 @@ do_test (void)
} }
if (errno != EINVAL) if (errno != EINVAL)
{ {
puts ("sem_timedwait did not fail with EINVAL"); perror ("sem_timedwait did not fail with EINVAL");
return 1; return 1;
} }
if (u.ns.nwaiters != 0) 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; return 1;
} }