diff options
Diffstat (limited to 'misc/pselect.c')
-rw-r--r-- | misc/pselect.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/misc/pselect.c b/misc/pselect.c index 80cf8be4b3..e29d7b36ad 100644 --- a/misc/pselect.c +++ b/misc/pselect.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-1998,2001,2002,2003,2006 Free Software Foundation, Inc. +/* Copyright (C) 1996-1998,2001-2003,2006,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -43,7 +43,17 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, precision and therefore the `pselect` should be available. But for now it is hardly found. */ if (timeout != NULL) - TIMESPEC_TO_TIMEVAL (&tval, timeout); + { + /* Catch bugs which would be hidden by the TIMESPEC_TO_TIMEVAL + computations. The division by 1000 truncates values. */ + if (__builtin_expect (timeout->tv_nsec < 0, 0)) + { + __set_errno (EINVAL); + return -1; + } + + TIMESPEC_TO_TIMEVAL (&tval, timeout); + } /* The setting and restoring of the signal mask and the select call should be an atomic operation. This can't be done without kernel |