[newlib-cygwin] Cygwin: console: Add error handling for thread_sync_event
Takashi Yano
tyan0@sourceware.org
Sat Jun 29 10:08:35 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=55baaac2ef5fb946e673ac79e00635cd3d67115b
commit 55baaac2ef5fb946e673ac79e00635cd3d67115b
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date: Sat Jun 29 19:03:20 2024 +0900
Cygwin: console: Add error handling for thread_sync_event
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
Diff:
---
winsup/cygwin/fhandler/console.cc | 51 ++++++++++++++++++++++++++-------------
1 file changed, 34 insertions(+), 17 deletions(-)
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
index 1c0d5c815..881445824 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -272,17 +272,23 @@ cons_master_thread (VOID *arg)
fhandler_console::handle_set_t handle_set;
fh->get_duplicated_handle_set (&handle_set);
HANDLE thread_sync_event;
- DuplicateHandle (GetCurrentProcess (), fh->thread_sync_event,
- 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);
- fhandler_console::close_handle_set (&handle_set);
- SetEvent (thread_sync_event);
- CloseHandle (thread_sync_event);
+ if (DuplicateHandle (GetCurrentProcess (), fh->thread_sync_event,
+ 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);
+ fhandler_console::close_handle_set (&handle_set);
+ SetEvent (thread_sync_event);
+ CloseHandle (thread_sync_event);
+ master_thread_started = false;
+ }
+ else
+ debug_printf ("cons_master_thread not started because thread_sync_event "
+ "could not be duplicated %08x", GetLastError ());
return 0;
}
@@ -451,6 +457,8 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp)
case WAIT_CANCELED:
break;
default: /* Error */
+ free (input_rec);
+ free (input_tmp);
ReleaseMutex (p->input_mutex);
return;
}
@@ -1847,9 +1855,12 @@ fhandler_console::open (int flags, mode_t)
char name[MAX_PATH];
shared_name (name, CONS_THREAD_SYNC, get_minor ());
thread_sync_event = CreateEvent(NULL, FALSE, FALSE, name);
- new cygthread (::cons_master_thread, this, "consm");
- WaitForSingleObject (thread_sync_event, INFINITE);
- CloseHandle (thread_sync_event);
+ if (thread_sync_event)
+ {
+ new cygthread (::cons_master_thread, this, "consm");
+ WaitForSingleObject (thread_sync_event, INFINITE);
+ CloseHandle (thread_sync_event);
+ }
}
return 1;
}
@@ -1910,9 +1921,15 @@ fhandler_console::close ()
char name[MAX_PATH];
shared_name (name, CONS_THREAD_SYNC, get_minor ());
thread_sync_event = OpenEvent (MAXIMUM_ALLOWED, FALSE, name);
- con.owner = MAX_PID + 1;
- WaitForSingleObject (thread_sync_event, INFINITE);
- CloseHandle (thread_sync_event);
+ if (thread_sync_event)
+ {
+ con.owner = MAX_PID + 1;
+ WaitForSingleObject (thread_sync_event, INFINITE);
+ CloseHandle (thread_sync_event);
+ }
+ else
+ debug_printf ("Failed to open thread_sync_event %08x",
+ GetLastError ());
}
con.owner = 0;
}
More information about the Cygwin-cvs
mailing list