https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=73168846ea25b6f64cab9fa6c85b13bfeac3b3df

commit 73168846ea25b6f64cab9fa6c85b13bfeac3b3df
Author: Takashi Yano <[email protected]>
Date:   Tue Nov 5 20:20:21 2024 +0900

    Cygwin: console: Fix open() failure when the console owner calls exec().
    
    Currently, open() tries to attach to the console which is owned by
    the console owner process. However, when the owner process calls
    exec(), AttachConsole() to dwProcessId may sometimes fail due to
    unlucky timing. With this patch, open() tries to attach also to
    exec_dwProcessId if attaching to dwProcessId fails. That is, open()
    tries to attach to both the stub process and target process to
    prevent the above situation.
    
    Fixes: 3721a756b0d8 ("Cygwin: console: Make the console accessible from 
other terminals.")
    Signed-off-by: Takashi Yano <[email protected]>

Diff:
---
 winsup/cygwin/fhandler/console.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/winsup/cygwin/fhandler/console.cc 
b/winsup/cygwin/fhandler/console.cc
index 9cdc13dd2..ac47c8374 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -84,6 +84,10 @@ fhandler_console::attach_console (pid_t owner, bool *err)
       DWORD attached =
        fhandler_pty_common::get_console_process_id (p->dwProcessId,
                                                     true, false, false);
+      if (!attached)
+       attached =
+         fhandler_pty_common::get_console_process_id (p->exec_dwProcessId,
+                                                      true, false, false);
       if (!attached)
        {
          resume_pid =
@@ -91,6 +95,8 @@ fhandler_console::attach_console (pid_t owner, bool *err)
                                                         false, false, false);
          FreeConsole ();
          BOOL r = AttachConsole (p->dwProcessId);
+         if (!r)
+           r = AttachConsole (p->exec_dwProcessId);
          if (!r)
            {
              if (resume_pid)

Reply via email to