(play): Increment send_eof instead of setting it, decrement it instead

of clearing it.  Fixes a race condition: when we got EOF on input_fd
and a failed doexecute() in the same iteration of the loop, only one
EOF cookie was sent, leaving the client hung.
This commit is contained in:
Markus Armbruster 2007-11-28 06:34:33 +00:00
parent 0b058415a1
commit 51846ec38f

View file

@ -258,7 +258,7 @@ play(int sock)
if (send_eof
&& ring_putm(&inbuf, EOF_COOKIE, sizeof(EOF_COOKIE) - 1) >= 0)
send_eof = 0;
send_eof--;
if (send_intr
&& ring_putm(&inbuf, INTR_COOKIE, sizeof(INTR_COOKIE) - 1) >= 0)
send_intr = 0;
@ -275,7 +275,7 @@ play(int sock)
}
if (n == 0) {
/* EOF on input */
send_eof = 1;
send_eof++;
if (input_fd) {
/* execute done, switch back to fd 0 */
if (input_fd > 0)
@ -311,7 +311,7 @@ play(int sock)
if (input_fd < 0) {
/* execute failed */
input_fd = 0;
send_eof = 1;
send_eof++;
}
}
}