[newlib-cygwin/cygwin-3_6-branch] Cygwin: console: Fix the console states after the console is closed
Takashi Yano
tyan0@sourceware.org
Thu Apr 10 19:41:56 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=92f86615996cc8aefef958a01a421f1483ab68b6
commit 92f86615996cc8aefef958a01a421f1483ab68b6
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date: Thu Apr 10 16:18:17 2025 +0900
Cygwin: console: Fix the console states after the console is closed
Due to a bug introduced by the commit 3312f2d21f13, when the parent
process exits before the child process exits, disable_master_thread
is wrongly set to true, that disables special key handling such as
Ctrl-C. With this patch, the disable_master_thread is set to true if
any of the following conditions is met.
- The parent process is not a cygwin process.
- The master process already died.
- The current process is the master process.
Otherwise, disable_master_thread remains false to keep special key
handling enabled.
Addresses: https://cygwin.com/pipermail/cygwin/2025-April/257909.html
Fixed: 3312f2d21f13 ("Cygwin: console: Redesign mode set strategy on close().")
Reported-by: Jeremy Drake <cygwin@jdrake.com>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
Diff:
---
winsup/cygwin/fhandler/console.cc | 24 ++++++++++++++++++++----
winsup/cygwin/local_includes/fhandler.h | 2 +-
winsup/cygwin/release/3.6.2 | 3 +++
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
index a38487f9b..f33e354c2 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -932,7 +932,7 @@ fhandler_console::cleanup_for_non_cygwin_app (handle_set_t *p)
/* Cleaning-up console mode for non-cygwin app. */
/* conmode can be tty::restore when non-cygwin app is
exec'ed from login shell. */
- tty::cons_mode conmode = cons_mode_on_close ();
+ tty::cons_mode conmode = cons_mode_on_close (p);
set_output_mode (conmode, ti, p);
set_input_mode (conmode, ti, p);
set_disable_master_thread (con.owner == GetCurrentProcessId ());
@@ -1991,8 +1991,9 @@ fhandler_console::close (int flag)
acquire_output_mutex (mutex_timeout);
- if (shared_console_info[unit] && myself->ppid == 1
- && (dev_t) myself->ctty == get_device ())
+ if (shared_console_info[unit] && con.curr_input_mode != tty::restore
+ && (dev_t) myself->ctty == get_device ()
+ && cons_mode_on_close (&handle_set) == tty::restore)
{
set_output_mode (tty::restore, &get_ttyp ()->ti, &handle_set);
set_input_mode (tty::restore, &get_ttyp ()->ti, &handle_set);
@@ -4704,10 +4705,25 @@ fhandler_console::fstat (struct stat *st)
}
tty::cons_mode
-fhandler_console::cons_mode_on_close ()
+fhandler_console::cons_mode_on_close (handle_set_t *p)
{
+ int unit = p->unit;
if (myself->ppid != 1) /* Execed from normal cygwin process. */
return tty::cygwin;
+ if (!process_alive (con.owner)) /* The Master process already died. */
+ return tty::restore;
+ if (con.owner == GetCurrentProcessId ()) /* Master process */
+ return tty::restore;
+
+ PROCESS_BASIC_INFORMATION pbi;
+ NTSTATUS status =
+ NtQueryInformationProcess (GetCurrentProcess (), ProcessBasicInformation,
+ &pbi, sizeof (pbi), NULL);
+ if (NT_SUCCESS (status)
+ && !process_alive ((DWORD) pbi.InheritedFromUniqueProcessId))
+ /* Execed from normal cygwin process and the parent has been exited. */
+ return tty::cygwin;
+
return tty::restore; /* otherwise, restore */
}
diff --git a/winsup/cygwin/local_includes/fhandler.h b/winsup/cygwin/local_includes/fhandler.h
index 8c71d8495..4c013dd4a 100644
--- a/winsup/cygwin/local_includes/fhandler.h
+++ b/winsup/cygwin/local_includes/fhandler.h
@@ -2368,7 +2368,7 @@ private:
void setup_pcon_hand_over ();
static void pcon_hand_over_proc ();
- static tty::cons_mode cons_mode_on_close ();
+ static tty::cons_mode cons_mode_on_close (handle_set_t *);
friend tty_min * tty_list::get_cttyp ();
};
diff --git a/winsup/cygwin/release/3.6.2 b/winsup/cygwin/release/3.6.2
index ef56a74ff..f10a947cd 100644
--- a/winsup/cygwin/release/3.6.2
+++ b/winsup/cygwin/release/3.6.2
@@ -7,3 +7,6 @@ Fixes:
- Fix connect(2) returning WSAEPROTOTYPE on abstract sockets.
Addresses: https://sourceware.org/pipermail/cygwin-patches/2025q2/013638.html
+
+- Fix the console states after the console is closed.
+ Addresses: https://cygwin.com/pipermail/cygwin/2025-April/257909.html
More information about the Cygwin-cvs
mailing list