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.
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							bb7741acf8
						
					
				
				
					commit
					bb30582a99
				
			| @@ -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]; | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user