Messages in this thread | | | From | Radu Greab <> | Date | Sat, 31 Mar 2001 18:44:20 +0300 (EEST) | Subject | bug report: select on unconnected sockets |
| |
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; }
| |