diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 9 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S | 4 | ||||
-rw-r--r-- | nptl/tst-rwlock14.c | 30 |
3 files changed, 40 insertions, 3 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 1b6f3d764c..8a81100cf4 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,12 @@ +2004-07-04 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S + (pthread_rwlock_timedrdlock): Use cmpq instead of cmpl to check + for valid tv_nsec. + * tst-rwlock14.c (do_test): Test for invalid tv_nsec equal to + 1 billion and 64-bit tv_nsec which is valid when truncated to 32 + bits. + 2004-06-29 Roland McGrath <roland@redhat.com> * Banner: NPTL no longer has its own version number. diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S index 924e20868f..aadc90c974 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -71,7 +71,7 @@ pthread_rwlock_timedrdlock: je 5f /* Check the value of the timeout parameter. */ -3: cmpl $1000000000, 8(%r13) +3: cmpq $1000000000, 8(%r13) jae 19f incl READERS_QUEUED(%r12) diff --git a/nptl/tst-rwlock14.c b/nptl/tst-rwlock14.c index 4451a023f7..b9611a81f0 100644 --- a/nptl/tst-rwlock14.c +++ b/nptl/tst-rwlock14.c @@ -104,7 +104,7 @@ do_test (void) result = 1; } - ts.tv_nsec = 2000000000; + ts.tv_nsec = 1000000000; e = pthread_rwlock_timedrdlock (&r, &ts); if (e == 0) @@ -130,6 +130,34 @@ do_test (void) result = 1; } + ts.tv_nsec = 0x100001000LL; + if (ts.tv_nsec != 0x100001000LL) + ts.tv_nsec = 2000000000; + + e = pthread_rwlock_timedrdlock (&r, &ts); + if (e == 0) + { + puts ("third rwlock_timedrdlock did not fail"); + result = 1; + } + else if (e != EINVAL) + { + puts ("third rwlock_timedrdlock did not return EINVAL"); + result = 1; + } + + e = pthread_rwlock_timedrdlock (&r, &ts); + if (e == 0) + { + puts ("third rwlock_timedrdlock did not fail"); + result = 1; + } + else if (e != EINVAL) + { + puts ("third rwlock_timedrdlock did not return EINVAL"); + result = 1; + } + if (result == 0) puts ("no bugs"); |