invalid argument in select() when peer socket is in FD_SET

Jilles Tjoelker jilles at stack.nl
Sun Jul 31 15:45:13 UTC 2011


On Sun, Jul 31, 2011 at 04:20:08PM +0200, Christoph P.U. Kukulies wrote:
> I posted this on freebsd-questions also but maybe the expert density 
> isn't that high as here in "hackers".
> Since I think it may be a design or implementation issue in FreeBSDs' 
> select(), I'm posting it here as well,
> hoping to get an experts' answer.

> I have written a small server to test TCP/IP roundtrip times of the 
> packets in a proprietary protocol and while
> compiling and running this server on different platforms (Windows 
> 7/cygwin, UbuntuLinux, FreeBSD 8.0 Release), I found
> that the server produces an error when the listening socket (on which 
> the accept() is performed) is also
> member of the select() fd_set.

> On the other platforms the program works without error, just under 
> FreeBSD I'm getting this "invalid argument" error.

> Comments appreciated (despite comments about the error checking logic

> [snip]
>      tv.tv_sec = 0;
>      tv.tv_usec = 5000000;       /* 5 seconds */
> [snip]
>          n = select(nfds, &readfds,
>                     (fd_set *) NULL,     /* not interested in write */
>                     (fd_set *) NULL,     /* ...or exceptions */
> &tv);        /* timeout */

The number of microseconds in a struct timeval must be nonnegative and
less than one million (likewise, the number of nanoseconds in a struct
timespec must be nonnegative and less than 1000 million).

FreeBSD checks this strictly in most functions.

-- 
Jilles Tjoelker


More information about the freebsd-hackers mailing list