From 51846ec38fccd78b30002d0b724bb4aea91a16d4 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 28 Nov 2007 06:34:33 +0000 Subject: [PATCH] (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. --- src/client/play.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/play.c b/src/client/play.c index 744b66e8..956ca410 100644 --- a/src/client/play.c +++ b/src/client/play.c @@ -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++; } } }