Sorry if this is already known: on a RH 7.0 system with kernel 2.4.2 or 2.4.3, a select on an unconnected socket incorrectly says that the socket is ready for input and output. Of course, reading from the socket file descriptor returns -1 and errno is set to ENOTCONN as shown in the strace output: socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 select(4, [3], [3], [3], {0, 0}) = 2 (in [3], out [3], left {0, 0}) read(3, 0xbffff668, 1024) = -1 ENOTCONN (Transport endpoint is not connected) I attached a small example program to reproduce the bug. Thanks, Radu Greab PS: please CC me your eventual replies as I'm not subscribed to the list.
#include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> int main(int argc, char **argv) { fd_set rfds, wfds, efds; int s, rc; struct timeval timeout; char buf[1025]; s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) { perror("couldn't create socket"); return -1; } FD_ZERO(&rfds); FD_SET(s, &rfds); FD_ZERO(&wfds); FD_SET(s, &wfds); FD_ZERO(&efds); FD_SET(s, &efds); timeout.tv_sec = timeout.tv_usec = 0; rc = select(s + 1, &rfds, &wfds, &efds, &timeout); if (rc == -1) { perror("select"); return -1; } printf("select result=%d\n", rc); if (FD_ISSET(s, &rfds)) { rc = read(s, buf, 1024); if (rc == -1) { perror("read"); return -1; } printf("read result=%d\n", rc); } return 0; }