Re: select() bug

Paul Marquis
2000-11-03T05:00:48Z

It shows that even though select() says a file descriptor is not
writable, a write() can still succeed. This code is not used anywhere
in the real world, or at least my real world :-P. It just demonstrates
"the bug".

Richard B. Johnson" wrote:
> Not as I see it. This is clearly a code bug. Look:
> iteration 1
> select says pipe is writable
> write succeeded - 1 bytes written
> iteration 2
> select returned 0 -- pipe not writable
>
> for (i = 0; i < 4; i++)
> {
> printf("iteration %d\n", i + 1);
>
> status = 0;
>
> /* do select */
> FD_ZERO(&write_fds);
> FD_SET(fd[1], &write_fds);
> tv.tv_sec = 0;
> tv.tv_usec = 0;
> switch (select(fd[1] + 1, NULL, &write_fds, NULL, &tv))
> {
> case -1:
> /* should probably check for EINTR and/or EWOULDBLOCK */
> printf("select error - %s\n", strerror(errno));
> break;
> case 0:
> /* no I/O */
> puts("select returned 0 -- pipe not writable");
> break;
>
> The BREAK breaks out of the switch-statement ---
> |
> |-----------------------------------------------------------
> |
> | default:
> | /* make sure our fd is writable */
> | if (FD_ISSET(fd[1], &write_fds))
> | {
> | puts("select says pipe is writable");
> | status = 1;
> | }
> | else
> | puts("select says pipe is not writable");
> | break;
> | }
> |
> | /* do write */
> |-------> n = write(fd[1], buf + (i % 2), 1);
>
> Then you write it anyway!
>
> write succeeded - 1 bytes written
> select bug
>
> Cheers,
> Dick Johnson
>
> Penguin : Linux version 2.2.17 on an i686 machine (801.18 BogoMips).
>
> "Memory is like gasoline. You use it up when you are running. Of
> course you get it all back when you reboot..."; Actual explanation
> obtained from the Micro$oft help desk.

--
Paul Marquis
pmarquis@iname.com