From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id 25D923AA983A; Mon, 18 Jan 2021 10:24:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 25D923AA983A Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pty: Make close_pseudoconsole() be a static member function. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano via Cygwin-patches X-Git-Refname: refs/heads/master X-Git-Oldrev: 974e6d76d85a284add338d95bea9703e16a693d6 X-Git-Newrev: 85ea2614f5c911f468b37fad6865b45102e47a2f Message-Id: <20210118102401.25D923AA983A@sourceware.org> Date: Mon, 18 Jan 2021 10:24:01 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jan 2021 10:24:01 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=85ea2614f5c911f468b37fad6865b45102e47a2f commit 85ea2614f5c911f468b37fad6865b45102e47a2f Author: Takashi Yano via Cygwin-patches Date: Fri Jan 15 17:32:11 2021 +0900 Cygwin: pty: Make close_pseudoconsole() be a static member function. - The function close_pseudoconsole() should be static so that it can be safely called in spawn.cc even after the fhandler_pty_slave instance has been deleted. That is, there is a problem with the current code. This patch fixes the issue. Diff: --- winsup/cygwin/fhandler.h | 3 ++- winsup/cygwin/fhandler_tty.cc | 22 ++++++++++++---------- winsup/cygwin/spawn.cc | 6 ++++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 45ac17af2..2077b5245 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -2339,12 +2339,13 @@ class fhandler_pty_slave: public fhandler_pty_common return fh; } bool setup_pseudoconsole (STARTUPINFOEXW *si, bool nopcon); - void close_pseudoconsole (void); + static void close_pseudoconsole (tty *ttyp); bool term_has_pcon_cap (const WCHAR *env); void set_switch_to_pcon (void); void reset_switch_to_pcon (void); void mask_switch_to_pcon_in (bool mask); void setup_locale (void); + tty *get_ttyp () { return (tty *) tc (); } /* Override as public */ }; #define __ptsname(buf, unit) __small_sprintf ((buf), "/dev/pty%d", (unit)) diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 8ff74cdde..0c92f41d4 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -2563,21 +2563,23 @@ fallback: return false; } +/* The function close_pseudoconsole() should be static so that it can + be called even after the fhandler_pty_slave instance is deleted. */ void -fhandler_pty_slave::close_pseudoconsole (void) +fhandler_pty_slave::close_pseudoconsole (tty *ttyp) { - if (get_ttyp ()->h_pseudo_console) + if (ttyp->h_pseudo_console) { - get_ttyp ()->wait_pcon_fwd (); - HPCON_INTERNAL *hp = (HPCON_INTERNAL *) get_ttyp ()->h_pseudo_console; + ttyp->wait_pcon_fwd (); + HPCON_INTERNAL *hp = (HPCON_INTERNAL *) ttyp->h_pseudo_console; HANDLE tmp = hp->hConHostProcess; - ClosePseudoConsole (get_ttyp ()->h_pseudo_console); + ClosePseudoConsole (ttyp->h_pseudo_console); CloseHandle (tmp); - get_ttyp ()->h_pseudo_console = NULL; - get_ttyp ()->switch_to_pcon_in = false; - get_ttyp ()->pcon_pid = 0; - get_ttyp ()->pcon_start = false; - get_ttyp ()->do_not_resize_pcon = false; + ttyp->h_pseudo_console = NULL; + ttyp->switch_to_pcon_in = false; + ttyp->pcon_pid = 0; + ttyp->pcon_start = false; + ttyp->do_not_resize_pcon = false; } } diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 94909df4c..bf1b08057 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -664,6 +664,7 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, init_console_handler (myself->ctty > 0); bool enable_pcon = false; + tty *ptys_ttyp = NULL; STARTUPINFOEXW si_pcon; ZeroMemory (&si_pcon, sizeof (si_pcon)); STARTUPINFOW *si_tmp = &si; @@ -677,6 +678,7 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, c_flags |= EXTENDED_STARTUPINFO_PRESENT; si_tmp = &si_pcon.StartupInfo; enable_pcon = true; + ptys_ttyp = ptys_primary->get_ttyp (); } } @@ -954,7 +956,7 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, if (enable_pcon) { WaitForSingleObject (pi.hProcess, INFINITE); - ptys_primary->close_pseudoconsole (); + fhandler_pty_slave::close_pseudoconsole (ptys_ttyp); } else if (cons_native) { @@ -973,7 +975,7 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, if (waitpid (cygpid, &res, 0) != cygpid) res = -1; if (enable_pcon) - ptys_primary->close_pseudoconsole (); + fhandler_pty_slave::close_pseudoconsole (ptys_ttyp); else if (cons_native) { fhandler_console::request_xterm_mode_output (true,