- Currently read() is somehow not thread-safe. This patch fixes the issue. --- winsup/cygwin/fhandler_console.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 02d0ac052..d0e5bb33a 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -530,12 +530,14 @@ fhandler_console::read (void *pv, size_t& buflen) if (wincap.has_con_24bit_colors ()) request_xterm_mode_input (true, &handle_set); + acquire_input_mutex (INFINITE); while (!input_ready && !get_cons_readahead_valid ()) { int bgres; if ((bgres = bg_check (SIGTTIN)) <= bg_eof) { buflen = bgres; + release_input_mutex (); return; } @@ -552,6 +554,7 @@ wait_retry: pthread::static_cancel_self (); /*NOTREACHED*/ case WAIT_TIMEOUT: + release_input_mutex (); set_sig_errno (EAGAIN); buflen = (size_t) -1; return; @@ -572,9 +575,7 @@ wait_retry: int ret; acquire_attach_mutex (INFINITE); - acquire_input_mutex (INFINITE); ret = process_input_message (); - release_input_mutex (); release_attach_mutex (); switch (ret) { @@ -595,7 +596,6 @@ wait_retry: } /* Check console read-ahead buffer filled from terminal requests */ - acquire_input_mutex (INFINITE); while (con.cons_rapoi && *con.cons_rapoi && buflen) { buf[copied_chars++] = *con.cons_rapoi++; @@ -615,11 +615,13 @@ wait_retry: return; err: + release_input_mutex (); __seterrno (); buflen = (size_t) -1; return; sig_exit: + release_input_mutex (); set_sig_errno (EINTR); buflen = (size_t) -1; } @@ -984,9 +986,7 @@ fhandler_console::process_input_message (void) if (toadd) { ssize_t ret; - release_input_mutex (); line_edit_status res = line_edit (toadd, nread, *ti, &ret); - acquire_input_mutex (INFINITE); if (res == line_edit_signalled) { stat = input_signalled; -- 2.30.0