- Currently, GetStdHandle(STD_INPUT_HANDLE) returns input handle for non-cygwin process. If cygwin process read from non-cygwin pipe, this causes hang up because master writes input to cygwin pipe. Also, setup_locale() is called to make charset conversion for output handle work properly. --- winsup/cygwin/fhandler_tty.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 02e94efcc..c1f11f399 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -157,6 +157,7 @@ set_switch_to_pcon (HANDLE *in, HANDLE *out, HANDLE *err, bool iscygwin) DEF_HOOK (CreateProcessA); DEF_HOOK (CreateProcessW); DEF_HOOK (exit); +DEF_HOOK (GetStdHandle); static BOOL WINAPI CreateProcessA_Hooked @@ -300,6 +301,23 @@ exit_Hooked (int e) exit_Orig (e); } +static HANDLE WINAPI +GetStdHandle_Hooked (DWORD h) +{ + HANDLE r = GetStdHandle_Orig (h); + cygheap_fdenum cfd (false); + while (cfd.next () >= 0) + if (cfd->get_major () == DEV_PTYS_MAJOR) + { + fhandler_pty_slave *ptys = + (fhandler_pty_slave *) (fhandler_base *) cfd; + ptys->setup_locale (); + if (r == cfd->get_handle ()) + return cfd->get_handle_cyg (); + } + return r; +} + static void convert_mb_str (UINT cp_to, char *ptr_to, size_t *len_to, UINT cp_from, const char *ptr_from, size_t len_from, @@ -2349,6 +2367,7 @@ fhandler_pty_slave::fixup_after_exec () DO_HOOK (NULL, CreateProcessW); if (CreateProcessA_Orig || CreateProcessW_Orig) DO_HOOK (NULL, exit); + DO_HOOK (NULL, GetStdHandle); } /* This thread function handles the master control pipe. It waits for a -- 2.30.1