From 8489ba9996d9f89ebe5b321fd66cc455548bc411 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Sun, 3 Jul 2022 10:38:13 +0900 Subject: [PATCH] Cygwin: console: Fix new bugs in cons_master_thread(). - The previous commit for console introduced new bugs in error handling in cons_master_thread(). This patch fixes that. --- winsup/cygwin/fhandler_console.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index c95716c5f..848c96772 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -361,7 +361,8 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp) { case WAIT_OBJECT_0: total_read = 0; - while (cygwait (p->input_handle, (DWORD) 0) == WAIT_OBJECT_0) + while (cygwait (p->input_handle, (DWORD) 0) == WAIT_OBJECT_0 + && total_read < inrec_size) { DWORD len; ReadConsoleInputW (p->input_handle, input_rec + total_read, @@ -477,7 +478,8 @@ remove_record: /* Try to fix */ acquire_attach_mutex (mutex_timeout); n = 0; - while (cygwait (p->input_handle, (DWORD) 0) == WAIT_OBJECT_0) + while (cygwait (p->input_handle, (DWORD) 0) == WAIT_OBJECT_0 + && n < inrec_size) { DWORD len; ReadConsoleInputW (p->input_handle, input_tmp + n, @@ -492,14 +494,13 @@ remove_record: if (total_read + j - i >= n) { /* Something is wrong. Giving up. */ acquire_attach_mutex (mutex_timeout); - WriteConsoleInputW (p->input_handle, input_tmp, n, &n); - n = 0; - while (n < total_read) + DWORD l = 0; + while (l < n) { DWORD len; - WriteConsoleInputW (p->input_handle, input_rec + n, - min (total_read - n, inrec_size1), &len); - n += len; + WriteConsoleInputW (p->input_handle, input_tmp + l, + min (n - l, inrec_size1), &len); + l += len; } release_attach_mutex (); goto skip_writeback;