public inbox for cygwin-cvs@sourceware.org help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org> To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pty: Add missing CloseHandle() calls. Date: Tue, 14 Jan 2020 16:30:00 -0000 [thread overview] Message-ID: <20200114163045.129093.qmail@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=bb30582a99e2303512432cee32b3a47b383be0c4 commit bb30582a99e2303512432cee32b3a47b383be0c4 Author: Takashi Yano <takashi.yano@nifty.ne.jp> Date: Tue Jan 14 11:50:04 2020 +0900 Cygwin: pty: Add missing CloseHandle() calls. - PTY code which support pseudo console has a problem that causes handle leaks. Four of these are bug in pty code, and the other one seems to be a bug of Windows10. ClosePseudoConsole() fails to close one internal handle. This patch fixes the issue. Diff: --- winsup/cygwin/fhandler_tty.cc | 16 ++++++++++++++-- winsup/cygwin/ntdll.h | 13 +++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 84900fe..410e237 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -2233,11 +2233,21 @@ fhandler_pty_master::close () /* Terminate helper process */ SetEvent (get_ttyp ()->h_helper_goodbye); WaitForSingleObject (get_ttyp ()->h_helper_process, INFINITE); + CloseHandle (get_ttyp ()->h_helper_goodbye); + CloseHandle (get_ttyp ()->h_helper_process); /* FIXME: Pseudo console can be accessed via its handle only in the process which created it. What else can we do? */ if (master_pid_tmp == myself->pid) - /* Release pseudo console */ - ClosePseudoConsole (get_pseudo_console ()); + { + /* ClosePseudoConsole() seems to have a bug that one + internal handle remains opened. This causes handle leak. + This is a workaround for this problem. */ + HPCON_INTERNAL *hp = (HPCON_INTERNAL *) get_pseudo_console (); + HANDLE tmp = hp->hConHostProcess; + /* Release pseudo console */ + ClosePseudoConsole (get_pseudo_console ()); + CloseHandle (tmp); + } get_ttyp ()->switch_to_pcon_in = false; get_ttyp ()->switch_to_pcon_out = false; } @@ -3208,6 +3218,8 @@ fhandler_pty_master::setup_pseudoconsole () TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si_helper.StartupInfo, &pi_helper); WaitForSingleObject (hello, INFINITE); + CloseHandle (hello); + CloseHandle (pi_helper.hThread); /* Retrieve pseudo console handles */ DWORD rLen; char buf[64]; diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h index 1c07d02..8a08111 100644 --- a/winsup/cygwin/ntdll.h +++ b/winsup/cygwin/ntdll.h @@ -1763,4 +1763,17 @@ extern "C" return status; } } + +/* This is for pseudo console workaround. ClosePseudoConsole() + seems to have a bug that one internal handle remains opend. + This causes handle leak. To close this handle, it is needed + to access internal of HPCON. HPCON_INTERNAL is defined for + this purpose. The structure of internal of HPCON is not + documented. Refer to: https://github.com/Biswa96/XConPty */ +typedef struct _HPCON_INTERNAL +{ + HANDLE hWritePipe; + HANDLE hConDrvReference; + HANDLE hConHostProcess; +} HPCON_INTERNAL; #endif
reply other threads:[~2020-01-14 16:30 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200114163045.129093.qmail@sourceware.org \ --to=corinna@sourceware.org \ --cc=cygwin-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).