mirror of
				https://github.com/PowerShell/Win32-OpenSSH.git
				synced 2025-10-26 17:24:05 +01:00 
			
		
		
		
	simplified sshd fork code
This commit is contained in:
		
							parent
							
								
									31989d6f07
								
							
						
					
					
						commit
						ed535436d0
					
				| @ -182,9 +182,6 @@ initialize_server_options(ServerOptions *options) | |||||||
| 	options->ip_qos_bulk = -1; | 	options->ip_qos_bulk = -1; | ||||||
| 	options->version_addendum = NULL; | 	options->version_addendum = NULL; | ||||||
| 	options->fingerprint_hash = -1; | 	options->fingerprint_hash = -1; | ||||||
| #ifdef WIN32_FIXME |  | ||||||
| 	options->i_am_a_fake_fork = 0; |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ | /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ | ||||||
|  | |||||||
| @ -199,11 +199,6 @@ typedef struct { | |||||||
| 	char   *auth_methods[MAX_AUTH_METHODS]; | 	char   *auth_methods[MAX_AUTH_METHODS]; | ||||||
| 
 | 
 | ||||||
| 	int	fingerprint_hash;   | 	int	fingerprint_hash;   | ||||||
| #ifdef WIN32_FIXME |  | ||||||
|   int i_am_a_fake_fork; |  | ||||||
| 	char *pamLibrary_; |  | ||||||
| #endif |  | ||||||
|    |  | ||||||
|    |    | ||||||
| }       ServerOptions; | }       ServerOptions; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										146
									
								
								sshd.c
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								sshd.c
									
									
									
									
									
								
							| @ -1569,23 +1569,19 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|       #ifdef WIN32_FIXME |  | ||||||
| 
 | 
 | ||||||
| 			/*
 | 			/*
 | ||||||
|          *  Win32 code. | 			* Normal production daemon.  Fork, and have | ||||||
|  | 			* the child process the connection. The | ||||||
|  | 			* parent continues listening. | ||||||
| 			*/ | 			*/ | ||||||
| 
 | 			platform_pre_fork(); | ||||||
|  |       #ifdef WIN32_FIXME | ||||||
| 			{ | 			{ | ||||||
| 				PROCESS_INFORMATION pi; | 				PROCESS_INFORMATION pi; | ||||||
|             |  | ||||||
| 				STARTUPINFO si; | 				STARTUPINFO si; | ||||||
|             |  | ||||||
| 				BOOL b; | 				BOOL b; | ||||||
| 
 | 				char path[MAX_PATH]; | ||||||
| 
 |  | ||||||
|            /*
 |  | ||||||
|             * Assign sockets to StartupInfo. |  | ||||||
|             */ |  | ||||||
| 
 | 
 | ||||||
| 				memset(&si, 0, sizeof(STARTUPINFO)); | 				memset(&si, 0, sizeof(STARTUPINFO)); | ||||||
| 
 | 
 | ||||||
| @ -1594,7 +1590,7 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
| 				SetEnvironmentVariable("SSHD_REMSOC", remotesoc); | 				SetEnvironmentVariable("SSHD_REMSOC", remotesoc); | ||||||
| 
 | 
 | ||||||
| 				si.cb = sizeof(STARTUPINFO); | 				si.cb = sizeof(STARTUPINFO); | ||||||
|            si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); //(HANDLE) sfd_to_handle(*newsock);
 | 				si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); | ||||||
| 				si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); | 				si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); | ||||||
| 				si.hStdError = GetStdHandle(STD_ERROR_HANDLE); | 				si.hStdError = GetStdHandle(STD_ERROR_HANDLE); | ||||||
| 				si.wShowWindow = SW_HIDE; | 				si.wShowWindow = SW_HIDE; | ||||||
| @ -1603,14 +1599,11 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
| 				/*
 | 				/*
 | ||||||
| 				 * Create the child process | 				 * Create the child process | ||||||
| 				 */ | 				 */ | ||||||
|              | 				strncpy(path, GetCommandLineA(), MAX_PATH); | ||||||
|            b = CreateProcess(NULL, fake_fork_args, NULL, NULL, TRUE, | 				if (CreateProcess(NULL, path, NULL, NULL, TRUE, | ||||||
| 					CREATE_NEW_PROCESS_GROUP, NULL, NULL, | 					CREATE_NEW_PROCESS_GROUP, NULL, NULL, | ||||||
|                                      &si, &pi); | 					&si, &pi) == FALSE) { | ||||||
|           if (!b) |  | ||||||
|           { |  | ||||||
| 					debug("CreateProcess failure: %d", GetLastError()); | 					debug("CreateProcess failure: %d", GetLastError()); | ||||||
|              |  | ||||||
| 					exit(1); | 					exit(1); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| @ -1622,26 +1615,18 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
| 				CloseHandle(pi.hProcess); | 				CloseHandle(pi.hProcess); | ||||||
| 
 | 
 | ||||||
| 				close(*newsock); | 				close(*newsock); | ||||||
| 
 |  | ||||||
|           /*
 |  | ||||||
|            * FIXME pipes are not used so instead of   |  | ||||||
|            * cleaning we can disable creation. |  | ||||||
|            */ |  | ||||||
|            |  | ||||||
| 				close(startup_pipes[i]); | 				close(startup_pipes[i]); | ||||||
| 				startup_pipes[i] = -1; | 				startup_pipes[i] = -1; | ||||||
| 				startups--; | 				startups--; | ||||||
|  | 
 | ||||||
|  | 				pid = pi.dwProcessId; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | 			if (pid == 0) { | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
| 			/*
 |  | ||||||
| 			 * Normal production daemon.  Fork, and have |  | ||||||
| 			 * the child process the connection. The |  | ||||||
| 			 * parent continues listening. |  | ||||||
| 			 */ |  | ||||||
| 			platform_pre_fork(); |  | ||||||
| 			if ((pid = fork()) == 0) { | 			if ((pid = fork()) == 0) { | ||||||
|  | #endif /* else WIN32_FIXME */ | ||||||
| 				/*
 | 				/*
 | ||||||
| 				 * Child.  Close the listening and | 				 * Child.  Close the listening and | ||||||
| 				 * max_startup sockets.  Start using | 				 * max_startup sockets.  Start using | ||||||
| @ -1704,7 +1689,6 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
| 			RAND_seed(rnd, sizeof(rnd)); | 			RAND_seed(rnd, sizeof(rnd)); | ||||||
| #endif | #endif | ||||||
| 			explicit_bzero(rnd, sizeof(rnd)); | 			explicit_bzero(rnd, sizeof(rnd)); | ||||||
| #endif /* else WIN32_FIXME */ |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/* child process check (or debug mode) */ | 		/* child process check (or debug mode) */ | ||||||
| @ -1719,21 +1703,6 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) | |||||||
|    * Win32 only. |    * Win32 only. | ||||||
|    */ |    */ | ||||||
|     |     | ||||||
|   char *create_fake_fork_args(int ac, char **av) |  | ||||||
|   { |  | ||||||
|     char *orig_cmd_line = GetCommandLine(); |  | ||||||
|      |  | ||||||
|     char fake_fork_param[] = " -~"; |  | ||||||
|      |  | ||||||
|     int orig_cmd_line_len = strlen(orig_cmd_line); |  | ||||||
|      |  | ||||||
|     char *new_cmd_line = xmalloc (orig_cmd_line_len + 1 + sizeof(fake_fork_param)); |  | ||||||
| 
 |  | ||||||
|     strcpy(new_cmd_line, orig_cmd_line); |  | ||||||
|     strcpy(new_cmd_line + orig_cmd_line_len, fake_fork_param); |  | ||||||
| 
 |  | ||||||
|     return new_cmd_line; |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   /*
 |   /*
 | ||||||
|    * This function handles exit signal from parent process. |    * This function handles exit signal from parent process. | ||||||
| @ -1826,15 +1795,6 @@ main(int ac, char **av) | |||||||
| 		saved_argv[i] = xstrdup(av[i]); | 		saved_argv[i] = xstrdup(av[i]); | ||||||
| 	saved_argv[i] = NULL; | 	saved_argv[i] = NULL; | ||||||
| 	 | 	 | ||||||
|  #ifdef WIN32_FIXME |  | ||||||
|    |  | ||||||
|     /*
 |  | ||||||
|      * Create arguments for starting fake forked sshd.exe instances. |  | ||||||
|      */ |  | ||||||
| 
 |  | ||||||
|     fake_fork_args = create_fake_fork_args(ac, av); |  | ||||||
| 
 |  | ||||||
|   #endif /* WIN32_FIXME */ |  | ||||||
|   |   | ||||||
| #ifndef HAVE_SETPROCTITLE | #ifndef HAVE_SETPROCTITLE | ||||||
| 	/* Prepare for later setproctitle emulation */ | 	/* Prepare for later setproctitle emulation */ | ||||||
| @ -1853,35 +1813,11 @@ main(int ac, char **av) | |||||||
| 	/* Initialize configuration options to their default values. */ | 	/* Initialize configuration options to their default values. */ | ||||||
| 	initialize_server_options(&options); | 	initialize_server_options(&options); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|   #ifdef WIN32_FIXME |  | ||||||
| 
 |  | ||||||
|     //debug_flag = 1;
 |  | ||||||
| 
 |  | ||||||
|     #define FAKE_FORK_ARG "~" |  | ||||||
|    |  | ||||||
|   #else |  | ||||||
|      |  | ||||||
|     #define FAKE_FORK_ARG |  | ||||||
|      |  | ||||||
|   #endif |  | ||||||
| 
 |  | ||||||
| 	/* Parse command-line arguments. */ | 	/* Parse command-line arguments. */ | ||||||
| 	while ((opt = getopt(ac, av, | 	while ((opt = getopt(ac, av, | ||||||
| 	    "C:E:b:c:f:g:h:k:o:p:u:46DQRTdeiqrt" FAKE_FORK_ARG)) != -1) { | 	    "C:E:b:c:f:g:h:k:o:p:u:46DQRTdeiqrt")) != -1) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
| 
 | 
 | ||||||
| #ifdef WIN32_FIXME |  | ||||||
|     case '~': |  | ||||||
|     { |  | ||||||
|       debug("fake fork child"); |  | ||||||
|        |  | ||||||
|       options.i_am_a_fake_fork = 1; |  | ||||||
|        |  | ||||||
|       break; |  | ||||||
|     }   |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 		case '4': | 		case '4': | ||||||
| 			options.address_family = AF_INET; | 			options.address_family = AF_INET; | ||||||
| 			break; | 			break; | ||||||
| @ -2000,37 +1936,7 @@ main(int ac, char **av) | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|   #ifdef WIN32_FIXME |   #ifdef WIN32_FIXME | ||||||
|      |     if (getenv("SSHD_REMSOC") == NULL) | ||||||
|     /*
 |  | ||||||
|      * Win32 only. |  | ||||||
|      */ |  | ||||||
| 
 |  | ||||||
|     /* 
 |  | ||||||
|      * Handle install and uninstall service options  |  | ||||||
|      */ |  | ||||||
|      |  | ||||||
|     if (ac > 1 && strcmp("install", av[1]) == 0) |  | ||||||
|     { |  | ||||||
|       /*
 |  | ||||||
|        * Install the service  |  | ||||||
|        */ |  | ||||||
|        |  | ||||||
|       SvcInstall(); |  | ||||||
|        |  | ||||||
|       return 0; |  | ||||||
|     } |  | ||||||
|     else if (ac > 1 && strcmp("uninstall", av[1]) == 0) |  | ||||||
|     { |  | ||||||
|       /*
 |  | ||||||
|        * Remove the service  |  | ||||||
|        */ |  | ||||||
|        |  | ||||||
|       SvcUninstall(); |  | ||||||
|        |  | ||||||
|       return 0; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!options.i_am_a_fake_fork) |  | ||||||
|     { |     { | ||||||
|       if (!ranServiceMain) |       if (!ranServiceMain) | ||||||
|       { |       { | ||||||
| @ -2575,7 +2481,7 @@ main(int ac, char **av) | |||||||
| 	} else { | 	} else { | ||||||
| 		platform_pre_listen(); | 		platform_pre_listen(); | ||||||
| #ifdef WIN32_FIXME | #ifdef WIN32_FIXME | ||||||
|     if (!options.i_am_a_fake_fork) |     if (getenv("SSHD_REMSOC") == NULL) | ||||||
| #endif | #endif | ||||||
| 		server_listen(); | 		server_listen(); | ||||||
| 
 | 
 | ||||||
| @ -2604,7 +2510,7 @@ main(int ac, char **av) | |||||||
| 		} | 		} | ||||||
|     #ifdef WIN32_FIXME |     #ifdef WIN32_FIXME | ||||||
|        |        | ||||||
|       if (!options.i_am_a_fake_fork) |       if (getenv("SSHD_REMSOC") == NULL) | ||||||
|       { |       { | ||||||
|         /* 
 |         /* 
 | ||||||
|          * Accept a connection and return in a forked child  |          * Accept a connection and return in a forked child  | ||||||
| @ -2614,22 +2520,10 @@ main(int ac, char **av) | |||||||
|       } |       } | ||||||
|       else |       else | ||||||
|       {         |       {         | ||||||
|         //STARTUPINFO si;
 |  | ||||||
| 
 |  | ||||||
|         //memset(&si, 0 , sizeof(STARTUPINFO));
 |  | ||||||
|          |  | ||||||
|         //si.cb = sizeof(STARTUPINFO);
 |  | ||||||
| 
 |  | ||||||
|         /* 
 |  | ||||||
|          * Get the stdin handle from process info to use for client  |  | ||||||
|          */ |  | ||||||
|          |  | ||||||
|         //GetStartupInfo(&si);
 |  | ||||||
|          |  | ||||||
|         int remotesochandle ; |         int remotesochandle ; | ||||||
|         remotesochandle = atoi( getenv("SSHD_REMSOC") ); |         remotesochandle = atoi( getenv("SSHD_REMSOC") ); | ||||||
| 
 | 
 | ||||||
|         sock_in = sock_out = newsock = w32_allocate_fd_for_handle(remotesochandle, TRUE) ; //si.hStdInput);
 |         sock_in = sock_out = newsock = w32_allocate_fd_for_handle(remotesochandle, TRUE) ;  | ||||||
| 		 | 		 | ||||||
| 		// we have the socket handle, delete it for child processes we create like shell 
 | 		// we have the socket handle, delete it for child processes we create like shell 
 | ||||||
| 		SetEnvironmentVariable("SSHD_REMSOC", NULL); | 		SetEnvironmentVariable("SSHD_REMSOC", NULL); | ||||||
| @ -3249,7 +3143,7 @@ cleanup_exit(int i) | |||||||
| 		audit_event(SSH_CONNECTION_ABANDON); | 		audit_event(SSH_CONNECTION_ABANDON); | ||||||
| #endif | #endif | ||||||
| #ifdef WIN32_FIXME | #ifdef WIN32_FIXME | ||||||
|    if (!iAmAService || options.i_am_a_fake_fork) |    if (!iAmAService || (getenv("SSHD_REMSOC"))) | ||||||
| #endif | #endif | ||||||
| 	_exit(i); | 	_exit(i); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user