From 68a3f91fcad464c4737c1eaed4ae0bf539801fb2 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 16 May 2011 09:35:51 -0400 Subject: Fix reporting of invalid timeouts in emulated pselect --- misc/pselect.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'misc/pselect.c') 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 , 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 -- cgit v1.2.3