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.
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);
}