From d0cf7a3119451f5ef75413a1c46765266766c2c1 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 25 Apr 2009 09:43:48 +0200 Subject: [PATCH] Fix Windows client's stdin read thread's error handling stdin_read_thread() zeroed bounce_status on failure, effectifely treating it like EOF. Fix by setting to -1. It treated main thread termination like failure, and set bounce_error to a bogus value. Can't happen, because the program terminates when the main thread terminates, and the only user of bounce_error is the main thread anyway. Regardless, handle the case by terminating, because that's more obviously correct. Broken in commit f082ef9f, v4.3.11. --- src/client/play.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/play.c b/src/client/play.c index 6d74382e..4b9f3d7a 100644 --- a/src/client/play.c +++ b/src/client/play.c @@ -136,12 +136,19 @@ static DWORD WINAPI stdin_read_thread(LPVOID lpParam) { for (;;) { - if (WaitForSingleObject(bounce_empty, INFINITE) != WAIT_OBJECT_0) { - bounce_status = 0; + switch (WaitForSingleObject(bounce_empty, INFINITE)) { + case WAIT_FAILED: + bounce_status = -1; bounce_error = GetLastError(); - } else { + break; + case WAIT_OBJECT_0: bounce_status = _read(0, bounce_buf, sizeof(bounce_buf)); bounce_error = errno; + break; + case WAIT_ABANDONED: + return 0; + default: + assert(0); } SetEvent(bounce_full); }