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;
-- 
2.51.0

Reply via email to