mirror of
				https://github.com/clearml/dropbear
				synced 2025-06-26 18:17:32 +00:00 
			
		
		
		
	Don't bother waiting for a ssh-connection service reply - the server
will disconnect if it wasn't accepted
This commit is contained in:
		
							parent
							
								
									a0e931005b
								
							
						
					
					
						commit
						36526700a9
					
				| @ -34,7 +34,7 @@ SVROBJS=svr-kex.o svr-algo.o svr-auth.o sshpty.o \ | ||||
| 		svr-tcpfwd.o svr-authpam.o | ||||
| 
 | ||||
| CLIOBJS=cli-algo.o cli-main.o cli-auth.o cli-authpasswd.o cli-kex.o \
 | ||||
| 		cli-session.o cli-service.o cli-runopts.o cli-chansession.o \
 | ||||
| 		cli-session.o cli-runopts.o cli-chansession.o \
 | ||||
| 		cli-authpubkey.o cli-tcpfwd.o cli-channel.o cli-authinteract.o \
 | ||||
| 		cli-agentfwd.o list.o | ||||
| 
 | ||||
|  | ||||
| @ -1,85 +0,0 @@ | ||||
| /*
 | ||||
|  * Dropbear SSH | ||||
|  *  | ||||
|  * Copyright (c) 2002,2003 Matt Johnston | ||||
|  * Copyright (c) 2004 by Mihnea Stoenescu | ||||
|  * All rights reserved. | ||||
|  *  | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  *  | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  *  | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|  * SOFTWARE. */ | ||||
| 
 | ||||
| #include "includes.h" | ||||
| #include "service.h" | ||||
| #include "dbutil.h" | ||||
| #include "packet.h" | ||||
| #include "buffer.h" | ||||
| #include "session.h" | ||||
| #include "ssh.h" | ||||
| 
 | ||||
| void send_msg_service_request(char* servicename) { | ||||
| 
 | ||||
| 	TRACE(("enter send_msg_service_request: servicename='%s'", servicename)) | ||||
| 
 | ||||
| 	CHECKCLEARTOWRITE(); | ||||
| 
 | ||||
| 	buf_putbyte(ses.writepayload, SSH_MSG_SERVICE_REQUEST); | ||||
| 	buf_putstring(ses.writepayload, servicename, strlen(servicename)); | ||||
| 
 | ||||
| 	encrypt_packet(); | ||||
| 	TRACE(("leave send_msg_service_request")) | ||||
| } | ||||
| 
 | ||||
| /* This just sets up the state variables right for the main client session loop
 | ||||
|  * to deal with */ | ||||
| void recv_msg_service_accept() { | ||||
| 
 | ||||
| 	unsigned char* servicename; | ||||
| 	unsigned int len; | ||||
| 
 | ||||
| 	TRACE(("enter recv_msg_service_accept")) | ||||
| 
 | ||||
| 	servicename = buf_getstring(ses.payload, &len); | ||||
| 
 | ||||
| 	/* ssh-userauth */ | ||||
| 	if (cli_ses.state == SERVICE_AUTH_REQ_SENT | ||||
| 			&& len == SSH_SERVICE_USERAUTH_LEN | ||||
| 			&& strncmp(SSH_SERVICE_USERAUTH, servicename, len) == 0) { | ||||
| 
 | ||||
| 		cli_ses.state = SERVICE_AUTH_ACCEPT_RCVD; | ||||
| 		m_free(servicename); | ||||
| 		TRACE(("leave recv_msg_service_accept: done ssh-userauth")) | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	/* ssh-connection */ | ||||
| 	if (cli_ses.state == SERVICE_CONN_REQ_SENT | ||||
| 			&& len == SSH_SERVICE_CONNECTION_LEN  | ||||
| 			&& strncmp(SSH_SERVICE_CONNECTION, servicename, len) == 0) { | ||||
| 
 | ||||
| 		if (ses.authstate.authdone != 1) { | ||||
| 			dropbear_exit("Request for connection before auth"); | ||||
| 		} | ||||
| 
 | ||||
| 		cli_ses.state = SERVICE_CONN_ACCEPT_RCVD; | ||||
| 		m_free(servicename); | ||||
| 		TRACE(("leave recv_msg_service_accept: done ssh-connection")) | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	dropbear_exit("Unrecognised service accept"); | ||||
| } | ||||
| @ -41,6 +41,7 @@ static void cli_remoteclosed(); | ||||
| static void cli_sessionloop(); | ||||
| static void cli_session_init(); | ||||
| static void cli_finished(); | ||||
| static void recv_msg_service_accept(void); | ||||
| 
 | ||||
| struct clientsession cli_ses; /* GLOBAL */ | ||||
| 
 | ||||
| @ -150,6 +151,23 @@ static void cli_session_init() { | ||||
| 	ses.isserver = 0; | ||||
| } | ||||
| 
 | ||||
| static void send_msg_service_request(char* servicename) { | ||||
| 
 | ||||
| 	TRACE(("enter send_msg_service_request: servicename='%s'", servicename)) | ||||
| 
 | ||||
| 	CHECKCLEARTOWRITE(); | ||||
| 
 | ||||
| 	buf_putbyte(ses.writepayload, SSH_MSG_SERVICE_REQUEST); | ||||
| 	buf_putstring(ses.writepayload, servicename, strlen(servicename)); | ||||
| 
 | ||||
| 	encrypt_packet(); | ||||
| 	TRACE(("leave send_msg_service_request")) | ||||
| } | ||||
| 
 | ||||
| static void recv_msg_service_accept(void) { | ||||
| 	// do nothing, if it failed then the server MUST have disconnected
 | ||||
| } | ||||
| 
 | ||||
| /* This function drives the progress of the session - it initiates KEX,
 | ||||
|  * service, userauth and channel requests */ | ||||
| static void cli_sessionloop() { | ||||
| @ -195,12 +213,6 @@ static void cli_sessionloop() { | ||||
| 			/* We've got the transport layer sorted, we now need to request
 | ||||
| 			 * userauth */ | ||||
| 			send_msg_service_request(SSH_SERVICE_USERAUTH); | ||||
| 			cli_ses.state = SERVICE_AUTH_REQ_SENT; | ||||
| 			TRACE(("leave cli_sessionloop: sent userauth service req")) | ||||
| 			return; | ||||
| 
 | ||||
| 		/* userauth code */ | ||||
| 		case SERVICE_AUTH_ACCEPT_RCVD: | ||||
| 			cli_auth_getmethods(); | ||||
| 			cli_ses.state = USERAUTH_REQ_SENT; | ||||
| 			TRACE(("leave cli_sessionloop: sent userauth methods req")) | ||||
|  | ||||
| @ -26,7 +26,5 @@ | ||||
| #define _SERVICE_H_ | ||||
| 
 | ||||
| void recv_msg_service_request(); /* Server */ | ||||
| void send_msg_service_request(); /* Client */ | ||||
| void recv_msg_service_accept(); /* Client */ | ||||
| 
 | ||||
| #endif /* _SERVICE_H_ */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user