2004-06-17  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/pthread/pthread_cond_timedwait.c
	(__pthread_cond_timedwait): Also check for negativ nanoseconds.
	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
	(__pthread_cond_timedwait): Check for invalid nanosecond in
	timeout value.
	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
	* tst-cond19.c: New file.
	* Makefile: Add rules to build and run tst-cond19.
This commit is contained in:
Ulrich Drepper 2004-06-18 04:29:42 +00:00
parent 72e615009b
commit 7c3164bc66
8 changed files with 112 additions and 11 deletions

View File

@ -1,3 +1,14 @@
2004-06-17 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/pthread_cond_timedwait.c
(__pthread_cond_timedwait): Also check for negativ nanoseconds.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Check for invalid nanosecond in
timeout value.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
* tst-cond19.c: New file.
* Makefile: Add rules to build and run tst-cond19.
2004-06-15 Steven Munroe <sjmunroe@us.ibm.com> 2004-06-15 Steven Munroe <sjmunroe@us.ibm.com>
* tst-context1.c (GUARD_PATTERN): Defined. * tst-context1.c (GUARD_PATTERN): Defined.

View File

@ -194,7 +194,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 \
tst-spin1 tst-spin2 tst-spin3 \ tst-spin1 tst-spin2 tst-spin3 \
tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \ tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \ tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \
tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 \ tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \ tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \ tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
tst-rwlock11 tst-rwlock12 tst-rwlock13 \ tst-rwlock11 tst-rwlock12 tst-rwlock13 \
@ -454,6 +454,7 @@ $(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library)
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
$(objpfx)tst-cond11: $(common-objpfx)rt/librt.so $(objpfx)tst-cond11: $(common-objpfx)rt/librt.so
$(objpfx)tst-cond19: $(common-objpfx)rt/librt.so
$(objpfx)tst-cancel17: $(common-objpfx)rt/librt.so $(objpfx)tst-cancel17: $(common-objpfx)rt/librt.so
$(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.so $(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.so
$(objpfx)tst-cancel18: $(common-objpfx)rt/librt.so $(objpfx)tst-cancel18: $(common-objpfx)rt/librt.so
@ -465,6 +466,7 @@ LDFLAGS-tst-_res1mod2.so = -Wl,-soname,tst-_res1mod2.so
$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library) $(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library)
else else
$(objpfx)tst-cond11: $(common-objpfx)rt/librt.a $(objpfx)tst-cond11: $(common-objpfx)rt/librt.a
$(objpfx)tst-cond19: $(common-objpfx)rt/librt.a
$(objpfx)tst-cancel17: $(common-objpfx)rt/librt.a $(objpfx)tst-cancel17: $(common-objpfx)rt/librt.a
$(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.a $(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.a
$(objpfx)tst-cancel18: $(common-objpfx)rt/librt.a $(objpfx)tst-cancel18: $(common-objpfx)rt/librt.a

View File

@ -50,7 +50,7 @@ __pthread_cond_timedwait (cond, mutex, abstime)
int result = 0; int result = 0;
/* Catch invalid parameters. */ /* Catch invalid parameters. */
if (abstime->tv_nsec >= 1000000000) if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
return EINVAL; return EINVAL;
/* Make sure we are along. */ /* Make sure we are along. */

View File

@ -55,6 +55,10 @@ __pthread_cond_timedwait:
movl 20(%esp), %ebx movl 20(%esp), %ebx
movl 28(%esp), %ebp movl 28(%esp), %ebp
cmpl $1000000000, 4(%ebp)
movl $EINVAL, %eax
jae 18f
/* Get internal lock. */ /* Get internal lock. */
movl $1, %edx movl $1, %edx
xorl %eax, %eax xorl %eax, %eax

View File

@ -54,6 +54,11 @@ __pthread_cond_timedwait:
#define FRAME_SIZE 80 #define FRAME_SIZE 80
subq $FRAME_SIZE, %rsp subq $FRAME_SIZE, %rsp
.Lsubq: .Lsubq:
cmpq $1000000000, 8(%rdx)
movl $EINVAL, %rax
jae 18f
/* Stack frame: /* Stack frame:
rsp + 80 rsp + 80

76
nptl/tst-cond19.c Normal file
View File

@ -0,0 +1,76 @@
/* Copyright (C) 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
static int
do_test (void)
{
int result = 0;
struct timespec ts;
if (clock_gettime (CLOCK_REALTIME, &ts) != 0)
{
puts ("clock_gettime failed");
return 1;
}
ts.tv_nsec = -1;
int e = pthread_cond_timedwait (&cond, &mut, &ts);
if (e == 0)
{
puts ("first cond_timedwait did not fail");
result = 1;
}
else if (e != EINVAL)
{
puts ("first cond_timedwait did not return EINVAL");
result = 1;
}
ts.tv_nsec = 2000000000;
e = pthread_cond_timedwait (&cond, &mut, &ts);
if (e == 0)
{
puts ("second cond_timedwait did not fail");
result = 1;
}
else if (e != EINVAL)
{
puts ("second cond_timedwait did not return EINVAL");
result = 1;
}
return result;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

View File

@ -79,6 +79,8 @@ EALIGN (BP_SYM (memcpy), 5, 0)
rldicl. 0,12,0,61 rldicl. 0,12,0,61
cmpldi cr6,31,7 cmpldi cr6,31,7
ble- cr6,.L2 /* less than 8 bytes left. */ ble- cr6,.L2 /* less than 8 bytes left. */
srdi 11,31,3
andi. 10,12,7
bne- 0,.L6 /* Source is not DW aligned. */ bne- 0,.L6 /* Source is not DW aligned. */
srdi. 9,31,3 srdi. 9,31,3
mr 10,3 mr 10,3
@ -164,19 +166,17 @@ EALIGN (BP_SYM (memcpy), 5, 0)
ld 30,-16(1) ld 30,-16(1)
blr blr
.align 4
.L6: .L6:
srdi 11,31,3
mr 4,3
mr 5,12
/* Copy doublewords where the destination is aligned but the source is /* Copy doublewords where the destination is aligned but the source is
not. Use aligned doubleword loads from the source, shifted to realign not. Use aligned doubleword loads from the source, shifted to realign
the data, to allow aligned destination stores. */ the data, to allow aligned destination stores. */
andi. 10,5,7 subf 5,10,12
andi. 0,11,1 andi. 0,11,1
subf 5,10,5
ld 6,0(5)
sldi 10,10,3 sldi 10,10,3
mr 4,3
ld 6,0(5)
ld 7,8(5) ld 7,8(5)
subfic 9,10,64 subfic 9,10,64
beq 2f beq 2f

View File

@ -60,9 +60,12 @@ __sched_setaffinity_new (pid_t pid, size_t cpusetsize, const cpu_set_t *cpuset)
does not request to set a bit beyond that. */ does not request to set a bit beyond that. */
for (size_t cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt) for (size_t cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
if (((char *) cpuset)[cnt] != '\0') if (((char *) cpuset)[cnt] != '\0')
{
/* Found a nonzero byte. This means the user request cannot be /* Found a nonzero byte. This means the user request cannot be
fulfilled. */ fulfilled. */
return EINVAL; __set_errno (EINVAL);
return -1;
}
return INLINE_SYSCALL (sched_setaffinity, 3, pid, cpusetsize, cpuset); return INLINE_SYSCALL (sched_setaffinity, 3, pid, cpusetsize, cpuset);
} }