diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2021-04-19 19:30:45 +0900 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2021-04-20 10:21:45 +0200 |
commit | b4fc81edcc25b5c313ab3805dc0bcd015c370e62 (patch) | |
tree | 2da59d608642dd1d0b098696d293c4ccf2596408 | |
parent | 9c6c2fb0f697e70f1d1eacad915ea5f76bb123e6 (diff) | |
download | newlib-b4fc81edcc25b5c313ab3805dc0bcd015c370e62.zip newlib-b4fc81edcc25b5c313ab3805dc0bcd015c370e62.tar.gz newlib-b4fc81edcc25b5c313ab3805dc0bcd015c370e62.tar.bz2 |
Cygwin: console: Fix race issue regarding cons_master_thread().
- With this patch, the race issue regarding starting/stopping
cons_master_thread() introduced by commit ff4440fc is fixed.
Addresses:
https://cygwin.com/pipermail/cygwin/2021-April/248292.html
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 62ee9e0..ebe89fc 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -48,6 +48,7 @@ details. */ #define con_is_legacy (shared_console_info && con.is_legacy) #define CONS_THREAD_SYNC "cygcons.thread_sync" +static bool NO_COPY master_thread_started = false; const unsigned fhandler_console::MAX_WRITE_CHARS = 16384; @@ -184,6 +185,7 @@ cons_master_thread (VOID *arg) GetCurrentProcess (), &thread_sync_event, 0, FALSE, DUPLICATE_SAME_ACCESS); SetEvent (thread_sync_event); + master_thread_started = true; /* Do not touch class members after here because the class instance may have been destroyed. */ fhandler_console::cons_master_thread (&handle_set, ttyp); @@ -370,6 +372,8 @@ fhandler_console::set_unit () } if (!created && shared_console_info) { + while (con.owner > MAX_PID) + Sleep (1); pinfo p (con.owner); if (!p) con.owner = myself->pid; @@ -1393,14 +1397,16 @@ fhandler_console::close () release_output_mutex (); - if (shared_console_info && con.owner == myself->pid) + if (shared_console_info && con.owner == myself->pid + && master_thread_started) { char name[MAX_PATH]; shared_name (name, CONS_THREAD_SYNC, get_minor ()); thread_sync_event = OpenEvent (MAXIMUM_ALLOWED, FALSE, name); - con.owner = 0; + con.owner = MAX_PID + 1; WaitForSingleObject (thread_sync_event, INFINITE); CloseHandle (thread_sync_event); + con.owner = 0; } CloseHandle (input_mutex); |