Guard against unusable fd in pthreads' empth_select()
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 29 Oct 2011 15:16:08 +0000 (17:16 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Thu, 29 Dec 2011 10:47:05 +0000 (11:47 +0100)
0 <= fd < FD_SETSIZE must hold, or else undefined behavior in
FD_SET().

src/lib/empthread/pthread.c

index 6339459e35c71c66b56fc4d1917fe8d522f31645..0c0ef5dcd7c76adc40d2005021ca171fbbe19bb2 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Sasha Mikheev
  *     Steve McClure, 1998
- *     Markus Armbruster, 2005-2010
+ *     Markus Armbruster, 2005-2011
  *     Ron Koenderink, 2007-2009
  */
 
@@ -289,6 +289,11 @@ empth_select(int fd, int flags, struct timeval *timeout)
     empth_t *ctx;
     int res = 0;
 
+    if (CANT_HAPPEN(fd < 0 || fd >= FD_SETSIZE)) {
+       errno = EBADF;
+       return -1;
+    }
+
     ef_make_stale();
     pthread_mutex_unlock(&mtx_ctxsw);
     empth_status("select on %d for %d", fd, flags);