aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2024-07-08 23:09:12 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2024-07-09 00:04:41 +0900
commitce3889ad551503ddc511a7537360f93ba5ad2b25 (patch)
tree6b964208bfac4783b14d5be80b74a0a8ebbfca14
parentcc9dcdb11583f9625c2a5ef2f99b588976452f29 (diff)
downloadnewlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.zip
newlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.tar.gz
newlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.tar.bz2
Cygwin: console: Fix for GNU screen/tmux in ConEmugithub/cygwin-3_5-branchcygwin-3_5-branch
If the master process of GNU screen or tmux is started in ConEmu and ConEmu is closed, reattaching to the GNU screen/tmux in another console will not work correctly. This is because the ConEmu master process was already closed even though some console APIs are hooked by ConEmuHk64.dll to communicate with ConEmu master process. With this patch, to make them unhooked, DllMain() of ConEmuHk64.dll is called with DLL_PROCESS_DETACH. Fixes: 3721a756b0d8 ("Cygwin: console: Make the console accessible from other terminals.") Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp> (cherry picked from commit ac7c0e23d85a638e6f930aa9a0582812e886a688)
-rw-r--r--winsup/cygwin/fhandler/console.cc19
1 files changed, 18 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
index 8c08a8a..d4c3f10 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -33,6 +33,7 @@ details. */
#include "child_info.h"
#include "cygwait.h"
#include "winf.h"
+#include "psapi.h"
/* Don't make this bigger than NT_MAX_PATH as long as the temporary buffer
is allocated using tmp_pathbuf!!! */
@@ -1970,7 +1971,23 @@ fhandler_console::close ()
if (!have_execed && !invisible_console
&& (!CTTY_IS_VALID (myself->ctty)
|| get_device () == (dev_t) myself->ctty))
- free_console ();
+ {
+ /* ConEmu hack. Detach from ConEmu to unhook console APIs. */
+ HMODULE h = GetModuleHandle ("ConEmuHk64.dll");
+ if (h)
+ {
+ MODULEINFO mi;
+ if (GetModuleInformation (GetCurrentProcess (), h, &mi, sizeof (mi)))
+ {
+ BOOL (*DllMain)(HINSTANCE, DWORD, LPVOID) =
+ (BOOL (*)(HINSTANCE, DWORD, LPVOID)) mi.EntryPoint;
+ DllMain (h, DLL_PROCESS_DETACH, NULL);
+ }
+ }
+
+ /* Freeing console to detach the process from the console. */
+ free_console ();
+ }
release_output_mutex ();