Re: [PATCH v3 1/2] Cygwin: pty: Introduce a helper function get_handle_from_process()

Takashi Yano <[email protected]> Tue, 23 Jun 2026 10:16:48 +0900
Newsgroups gmane.os.cygwin.patches
Message-ID <[email protected]>
On Sun, 21 Jun 2026 00:16:21 -0700
Mark Geisert wrote:
> Hi Takashi,
> 
> On 6/13/2026 7:06 AM, Takashi Yano wrote:
> > The current pty code performs the sequence:
> >    OpenProcess() -> DuplicateHandle()
> > in various places. This helper function encapsulates that sequence
> > to improve readability and maintainability.
> > 
> > Signed-off-by: Takashi Yano <[email protected]>
> > Reviewed-by:
> > ---
> >   winsup/cygwin/fhandler/pty.cc | 66 +++++++++++++++++------------------
> >   1 file changed, 33 insertions(+), 33 deletions(-)
> > 
> > diff --git a/winsup/cygwin/fhandler/pty.cc b/winsup/cygwin/fhandler/pty.cc
> > index 2558fa799..e60e30230 100644
> > --- a/winsup/cygwin/fhandler/pty.cc
> > +++ b/winsup/cygwin/fhandler/pty.cc
> > @@ -2213,6 +2213,23 @@ fhandler_pty_common::close (int flag)
> >     return 0;
> >   }
> >   
> > +static inline HANDLE
> > +get_handle_from_process (DWORD pid, HANDLE h, bool inh = false)
> > +{
> > +  HANDLE ret = NULL;
> > +  HANDLE owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pid);
> > +  if (owner)
> > +    {
> > +      if (!DuplicateHandle (owner, h, GetCurrentProcess (), &ret, 0, inh,
> > +			    DUPLICATE_SAME_ACCESS))
> > +	termios_printf ("DuplicateHandle() %p from process %d (%E)", h, pid);
> > +      CloseHandle (owner);
> > +    }
> > +  else
> > +    termios_printf ("OpenProcess (%d) failed (%E).", pid);
> > +  return ret;
> > +}
> > +
> >   void
> >   fhandler_pty_common::resize_pseudo_console (struct winsize *ws)
> >   {
> > @@ -2220,15 +2237,14 @@ fhandler_pty_common::resize_pseudo_console (struct winsize *ws)
> >     size.X = ws->ws_col;
> >     size.Y = ws->ws_row;
> >     HPCON_INTERNAL hpcon_local;
> > -  HANDLE pcon_owner =
> > -    OpenProcess (PROCESS_DUP_HANDLE, FALSE, get_ttyp ()->nat_pipe_owner_pid);
> > -  DuplicateHandle (pcon_owner, get_ttyp ()->h_pcon_write_pipe,
> > -		   GetCurrentProcess (), &hpcon_local.hWritePipe,
> > -		   0, FALSE, DUPLICATE_SAME_ACCESS);
> > +  hpcon_local.hWritePipe =
> > +    get_handle_from_process (get_ttyp ()->nat_pipe_owner_pid,
> > +			     get_ttyp ()->h_pcon_write_pipe);
> > +  if (hpcon_local.hWritePipe == NULL)
> > +    return;
> >     acquire_attach_mutex (mutex_timeout);
> >     ResizePseudoConsole ((HPCON) &hpcon_local, size);
> >     release_attach_mutex ();
> > -  CloseHandle (pcon_owner);
> >     CloseHandle (hpcon_local.hWritePipe);
> >   }
> >   
> > @@ -2490,18 +2506,13 @@ fhandler_pty_master::write (const void *ptr, size_t len)
> >   	    {
> >   	      if (h_pcon_in_dupped)
> >   		ForceCloseHandle (h_pcon_in_dupped);
> > -	      h_pcon_in_dupped = NULL;
> > -	      nat_pipe_owner_pid_dupped = 0;
> > -	      HANDLE pcon_owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE,
> > -					       get_ttyp ()->nat_pipe_owner_pid);
> > -	      if (pcon_owner)
> > -		{
> > -		  DuplicateHandle (pcon_owner, get_ttyp ()->h_pcon_in,
> > -				   GetCurrentProcess (), &h_pcon_in_dupped,
> > -				   0, FALSE, DUPLICATE_SAME_ACCESS);
> > -		  nat_pipe_owner_pid_dupped = get_ttyp ()->nat_pipe_owner_pid;
> > -		  CloseHandle (pcon_owner);
> > -		}
> > +	      h_pcon_in_dupped =
> > +		get_handle_from_process (get_ttyp ()->nat_pipe_owner_pid,
> > +					 get_ttyp ()->h_pcon_in);
> > +	      if (h_pcon_in_dupped)
> > +		nat_pipe_owner_pid_dupped = get_ttyp ()->nat_pipe_owner_pid;
> > +	      else
> > +		nat_pipe_owner_pid_dupped = 0;
> >   	    }
> >   	  else
> >   	    {
> > @@ -4265,16 +4276,9 @@ fhandler_pty_slave::transfer_input (tty::xfer_dir dir, HANDLE from, tty *ttyp,
> >       to = ttyp->to_slave ();
> >   
> >     pinfo p (ttyp->master_pid);
> > -  HANDLE pty_owner = NULL;
> >     if (p)
> > -    pty_owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE, p->dwProcessId);
> > -  if (pty_owner)
> > -    {
> > -      DuplicateHandle (pty_owner, to, GetCurrentProcess (), &to,
> > -		       0, TRUE, DUPLICATE_SAME_ACCESS);
> > -      CloseHandle (pty_owner);
> > -    }
> > -  else
> > +    to = get_handle_from_process (p->dwProcessId, to, true);
> > +  if (to == NULL)
> >       {
> >         char pipe[MAX_PATH];
> >         __small_sprintf (pipe,
> > @@ -4571,12 +4575,8 @@ fhandler_pty_slave::setpgid_aux (pid_t pid)
> >         if (get_ttyp ()->pcon_activated && get_ttyp ()->nat_pipe_owner_pid
> >   	  && !get_console_process_id (get_ttyp ()->nat_pipe_owner_pid, true))
> >   	{
> > -	  HANDLE pcon_owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE,
> > -					   get_ttyp ()->nat_pipe_owner_pid);
> > -	  DuplicateHandle (pcon_owner, get_ttyp ()->h_pcon_in,
> > -			   GetCurrentProcess (), &from,
> > -			   0, TRUE, DUPLICATE_SAME_ACCESS);
> > -	  CloseHandle (pcon_owner);
> > +	  from = get_handle_from_process (get_ttyp ()->nat_pipe_owner_pid,
> > +					  get_ttyp ()->h_pcon_in, true);
> >   	  DWORD target_pid = get_ttyp ()->nat_pipe_owner_pid;
> >   	  resume_pid = attach_console_temporarily (target_pid);
> >   	  attach_restore = true;
> 
> LGTM.  OK to push.

Thanks! Pushed.

-- 
Takashi Yano <[email protected]>