/* * Based on test by Dr. David Alan Gilbert <dave@treblig.org> */ #include <assert.h> #include <unistd.h> #include <sys/select.h> static fd_set set[0x1000000 / sizeof(fd_set)]; int main() { int fds[2]; struct timeval timeout = { .tv_sec = 0, .tv_usec = 100 }; (void) close(0); (void) close(1); assert(pipe(fds) == 0); /* * Start with a nice simple select. */ FD_ZERO(set); FD_SET(0, set); FD_SET(1, set); assert(select(2, set, set, set, NULL) == 1); /* * Now the crash case that trinity found, negative nfds * but with a pointer to a large chunk of valid memory. */ FD_ZERO(set); FD_SET(1,set); assert(select(-1, NULL, set, NULL, NULL) == -1); /* * Another variant, with nfds exceeding FD_SETSIZE limit. */ FD_ZERO(set); FD_SET(0,set); assert(select(FD_SETSIZE + 1, set, set + 1, NULL, &timeout) == 0); return 0; }