mirror of
				https://github.com/clearml/dropbear
				synced 2025-06-26 18:17:32 +00:00 
			
		
		
		
	Chantype handling is sorted
--HG-- extra : convert_revision : 807efead6ecf690f147fd8145aa9d78ff894cdb2
This commit is contained in:
		
							parent
							
								
									6152263045
								
							
						
					
					
						commit
						513f947d62
					
				| @ -81,7 +81,7 @@ struct Channel { | |||||||
| 	int initconn; /* used for TCP forwarding, whether the channel has been
 | 	int initconn; /* used for TCP forwarding, whether the channel has been
 | ||||||
| 					 fully initialised */ | 					 fully initialised */ | ||||||
| 
 | 
 | ||||||
| 	struct ChanType* type; | 	const struct ChanType* type; | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -100,7 +100,8 @@ void chaninitialise(); | |||||||
| void chancleanup(); | void chancleanup(); | ||||||
| void setchannelfds(fd_set *readfd, fd_set *writefd); | void setchannelfds(fd_set *readfd, fd_set *writefd); | ||||||
| void channelio(fd_set *readfd, fd_set *writefd); | void channelio(fd_set *readfd, fd_set *writefd); | ||||||
| struct Channel* newchannel(unsigned int remotechan, struct ChanType *type,  | struct Channel* newchannel(unsigned int remotechan,  | ||||||
|  | 		const struct ChanType *type,  | ||||||
| 		unsigned int transwindow, unsigned int transmaxpacket); | 		unsigned int transwindow, unsigned int transmaxpacket); | ||||||
| 
 | 
 | ||||||
| void recv_msg_channel_open(); | void recv_msg_channel_open(); | ||||||
|  | |||||||
| @ -96,7 +96,8 @@ void chancleanup() { | |||||||
| /* If remotechan, transwindow and transmaxpacket are not know (for a new
 | /* If remotechan, transwindow and transmaxpacket are not know (for a new
 | ||||||
|  * outgoing connection, with them to be filled on confirmation), they should |  * outgoing connection, with them to be filled on confirmation), they should | ||||||
|  * all be set to 0 */ |  * all be set to 0 */ | ||||||
| struct Channel* newchannel(unsigned int remotechan, struct ChanType *type,  | struct Channel* newchannel(unsigned int remotechan,  | ||||||
|  | 		const struct ChanType *type,  | ||||||
| 		unsigned int transwindow, unsigned int transmaxpacket) { | 		unsigned int transwindow, unsigned int transmaxpacket) { | ||||||
| 
 | 
 | ||||||
| 	struct Channel * newchan; | 	struct Channel * newchan; | ||||||
| @ -535,8 +536,6 @@ void recv_msg_channel_request() { | |||||||
| 		dropbear_exit("Unknown channel"); | 		dropbear_exit("Unknown channel"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	TRACE(("chan type is %d", channel->type)); |  | ||||||
| 
 |  | ||||||
| 	if (channel->type->reqhandler) { | 	if (channel->type->reqhandler) { | ||||||
| 		channel->type->reqhandler(channel); | 		channel->type->reqhandler(channel); | ||||||
| 	} else { | 	} else { | ||||||
| @ -737,6 +736,7 @@ void recv_msg_channel_open() { | |||||||
| 	unsigned int typelen; | 	unsigned int typelen; | ||||||
| 	unsigned int remotechan, transwindow, transmaxpacket; | 	unsigned int remotechan, transwindow, transmaxpacket; | ||||||
| 	struct Channel *channel; | 	struct Channel *channel; | ||||||
|  | 	const struct ChanType **cp; | ||||||
| 	const struct ChanType *chantype; | 	const struct ChanType *chantype; | ||||||
| 	unsigned int errtype = SSH_OPEN_UNKNOWN_CHANNEL_TYPE; | 	unsigned int errtype = SSH_OPEN_UNKNOWN_CHANNEL_TYPE; | ||||||
| 	int ret; | 	int ret; | ||||||
| @ -758,19 +758,24 @@ void recv_msg_channel_open() { | |||||||
| 		goto failure; | 		goto failure; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Get the channel type. This will depend if it is a client or a server,
 | 	/* Get the channel type. Client and server style invokation will set up a
 | ||||||
| 	 * so we iterate through the connection-specific list which was  | 	 * different list for ses.chantypes at startup. We just iterate through | ||||||
| 	 * set up when the connection started */ | 	 * this list and find the matching name */ | ||||||
| 	for (chantype = ses.chantypes[0]; chantype != NULL; chantype++) { | 	for (cp = &ses.chantypes[0], chantype = (*cp);  | ||||||
|  | 			chantype != NULL; | ||||||
|  | 			cp++, chantype = (*cp)) { | ||||||
| 		if (strcmp(type, chantype->name) == 0) { | 		if (strcmp(type, chantype->name) == 0) { | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (chantype == NULL) { | 	if (chantype == NULL) { | ||||||
|  | 		TRACE(("No matching type for '%s'", type)); | ||||||
| 		goto failure; | 		goto failure; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	TRACE(("matched type '%s'", type)); | ||||||
|  | 
 | ||||||
| 	/* create the channel */ | 	/* create the channel */ | ||||||
| 	channel = newchannel(remotechan, chantype, transwindow, transmaxpacket); | 	channel = newchannel(remotechan, chantype, transwindow, transmaxpacket); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ | |||||||
| #include "chansession.h" | #include "chansession.h" | ||||||
| 
 | 
 | ||||||
| /* Mapping of signal values to ssh signal strings */ | /* Mapping of signal values to ssh signal strings */ | ||||||
| const extern struct SigMap signames[] = { | const struct SigMap signames[] = { | ||||||
| 	{SIGABRT, "ABRT"}, | 	{SIGABRT, "ABRT"}, | ||||||
| 	{SIGALRM, "ALRM"}, | 	{SIGALRM, "ALRM"}, | ||||||
| 	{SIGFPE, "FPE"}, | 	{SIGFPE, "FPE"}, | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								debug.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								debug.h
									
									
									
									
									
								
							| @ -34,7 +34,9 @@ | |||||||
| /* #define DEBUG_VALGRIND */ | /* #define DEBUG_VALGRIND */ | ||||||
| 
 | 
 | ||||||
| /* Define this to print trace statements - very verbose */ | /* Define this to print trace statements - very verbose */ | ||||||
| #define DEBUG_TRACE | /* Caution: Don't use this in an unfriendly environment (ie unfirewalled),
 | ||||||
|  |  * since the printing does not sanitise strings etc */ | ||||||
|  | /*#define DEBUG_TRACE*/ | ||||||
| 
 | 
 | ||||||
| /* All functions writing to the cleartext payload buffer call
 | /* All functions writing to the cleartext payload buffer call
 | ||||||
|  * CHECKCLEARTOWRITE() before writing. This is only really useful if you're |  * CHECKCLEARTOWRITE() before writing. This is only really useful if you're | ||||||
|  | |||||||
| @ -1,14 +1,27 @@ | |||||||
| #include "includes.h" | #include "includes.h" | ||||||
| #include "session.h" | #include "session.h" | ||||||
| #include "dbutil.h" | #include "dbutil.h" | ||||||
|  | #include "channel.h" | ||||||
| #include "localtcpfwd.h" | #include "localtcpfwd.h" | ||||||
| 
 | 
 | ||||||
| #ifndef DISABLE_LOCALTCPFWD | #ifndef DISABLE_LOCALTCPFWD | ||||||
|  | static int newtcpdirect(struct Channel * channel); | ||||||
| static int newtcp(const char * host, int port); | static int newtcp(const char * host, int port); | ||||||
| 
 | 
 | ||||||
|  | const struct ChanType chan_tcpdirect = { | ||||||
|  | 	0, /* sepfds */ | ||||||
|  | 	"direct-tcpip", | ||||||
|  | 	newtcpdirect, /* init */ | ||||||
|  | 	NULL, /* checkclose */ | ||||||
|  | 	NULL, /* reqhandler */ | ||||||
|  | 	NULL /* closehandler */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* Called upon creating a new direct tcp channel (ie we connect out to an
 | /* Called upon creating a new direct tcp channel (ie we connect out to an
 | ||||||
|  * address */ |  * address */ | ||||||
| int newtcpdirect(struct Channel * channel) { | static int newtcpdirect(struct Channel * channel) { | ||||||
| 
 | 
 | ||||||
| 	unsigned char* desthost = NULL; | 	unsigned char* desthost = NULL; | ||||||
| 	unsigned int destport; | 	unsigned int destport; | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ | |||||||
| #include "includes.h" | #include "includes.h" | ||||||
| #include "channel.h" | #include "channel.h" | ||||||
| 
 | 
 | ||||||
| int newtcpdirect(struct Channel * channel); | extern const struct ChanType chan_tcpdirect; | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -90,6 +90,7 @@ static void acceptremote(struct TCPListener *listener) { | |||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* XXX XXX XXX - type here needs fixing */ | ||||||
| 	if (send_msg_channel_open_init(fd, CHANNEL_ID_TCPFORWARDED,  | 	if (send_msg_channel_open_init(fd, CHANNEL_ID_TCPFORWARDED,  | ||||||
| 				"forwarded-tcpip") == DROPBEAR_SUCCESS) { | 				"forwarded-tcpip") == DROPBEAR_SUCCESS) { | ||||||
| 		buf_putstring(ses.writepayload, tcpinfo->addr, | 		buf_putstring(ses.writepayload, tcpinfo->addr, | ||||||
|  | |||||||
| @ -56,16 +56,6 @@ static void chansessionrequest(struct Channel *channel); | |||||||
| static void send_exitsignalstatus(struct Channel *channel); | static void send_exitsignalstatus(struct Channel *channel); | ||||||
| static int sesscheckclose(struct Channel *channel); | static int sesscheckclose(struct Channel *channel); | ||||||
| 
 | 
 | ||||||
| const struct ChanType svrchansess = { |  | ||||||
| 	0, /* sepfds */ |  | ||||||
| 	"session", /* name */ |  | ||||||
| 	newchansess, /* inithandler */ |  | ||||||
| 	sesscheckclose, /* checkclosehandler */ |  | ||||||
| 	chansessionrequest, /* reqhandler */ |  | ||||||
| 	closechansess, /* closehandler */ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| /* required to clear environment */ | /* required to clear environment */ | ||||||
| extern char** environ; | extern char** environ; | ||||||
| @ -75,25 +65,6 @@ static int sesscheckclose(struct Channel *channel) { | |||||||
| 	return chansess->exited; | 	return chansess->exited; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Set up the general chansession environment, in particular child-exit
 |  | ||||||
|  * handling */ |  | ||||||
| void svr_chansessinitialise() { |  | ||||||
| 
 |  | ||||||
| 	struct sigaction sa_chld; |  | ||||||
| 
 |  | ||||||
| 	/* single child process intially */ |  | ||||||
| 	svr_ses.childpids = (struct ChildPid*)m_malloc(sizeof(struct ChildPid)); |  | ||||||
| 	svr_ses.childpids[0].pid = -1; /* unused */ |  | ||||||
| 	svr_ses.childpids[0].chansess = NULL; |  | ||||||
| 	svr_ses.childpidsize = 1; |  | ||||||
| 	sa_chld.sa_handler = sesssigchild_handler; |  | ||||||
| 	sa_chld.sa_flags = SA_NOCLDSTOP; |  | ||||||
| 	if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { |  | ||||||
| 		dropbear_exit("signal() error"); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* handler for childs exiting, store the state for return to the client */ | /* handler for childs exiting, store the state for return to the client */ | ||||||
| static void sesssigchild_handler(int dummy) { | static void sesssigchild_handler(int dummy) { | ||||||
| 
 | 
 | ||||||
| @ -254,7 +225,7 @@ static void closechansess(struct Channel *channel) { | |||||||
| 
 | 
 | ||||||
| 	chansess = (struct ChanSess*)channel->typedata; | 	chansess = (struct ChanSess*)channel->typedata; | ||||||
| 
 | 
 | ||||||
| 	send_exitsignalstatus(chansess); | 	send_exitsignalstatus(channel); | ||||||
| 
 | 
 | ||||||
| 	TRACE(("enter closechansess")); | 	TRACE(("enter closechansess")); | ||||||
| 	if (chansess == NULL) { | 	if (chansess == NULL) { | ||||||
| @ -911,6 +882,35 @@ static void execchild(struct ChanSess *chansess) { | |||||||
| 	dropbear_exit("child failed"); | 	dropbear_exit("child failed"); | ||||||
| } | } | ||||||
| 	 | 	 | ||||||
|  | const struct ChanType svrchansess = { | ||||||
|  | 	0, /* sepfds */ | ||||||
|  | 	"session", /* name */ | ||||||
|  | 	newchansess, /* inithandler */ | ||||||
|  | 	sesscheckclose, /* checkclosehandler */ | ||||||
|  | 	chansessionrequest, /* reqhandler */ | ||||||
|  | 	closechansess, /* closehandler */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Set up the general chansession environment, in particular child-exit
 | ||||||
|  |  * handling */ | ||||||
|  | void svr_chansessinitialise() { | ||||||
|  | 
 | ||||||
|  | 	struct sigaction sa_chld; | ||||||
|  | 
 | ||||||
|  | 	/* single child process intially */ | ||||||
|  | 	svr_ses.childpids = (struct ChildPid*)m_malloc(sizeof(struct ChildPid)); | ||||||
|  | 	svr_ses.childpids[0].pid = -1; /* unused */ | ||||||
|  | 	svr_ses.childpids[0].chansess = NULL; | ||||||
|  | 	svr_ses.childpidsize = 1; | ||||||
|  | 	sa_chld.sa_handler = sesssigchild_handler; | ||||||
|  | 	sa_chld.sa_flags = SA_NOCLDSTOP; | ||||||
|  | 	if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { | ||||||
|  | 		dropbear_exit("signal() error"); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* add a new environment variable, allocating space for the entry */ | /* add a new environment variable, allocating space for the entry */ | ||||||
| void addnewvar(const char* param, const char* var) { | void addnewvar(const char* param, const char* var) { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -35,6 +35,7 @@ | |||||||
| #include "channel.h" | #include "channel.h" | ||||||
| #include "chansession.h" | #include "chansession.h" | ||||||
| #include "atomicio.h" | #include "atomicio.h" | ||||||
|  | #include "localtcpfwd.h" | ||||||
| 
 | 
 | ||||||
| static void svr_remoteclosed(); | static void svr_remoteclosed(); | ||||||
| 
 | 
 | ||||||
| @ -42,6 +43,7 @@ struct serversession svr_ses; | |||||||
| 
 | 
 | ||||||
| const struct ChanType *chantypes[] = { | const struct ChanType *chantypes[] = { | ||||||
| 	&svrchansess, | 	&svrchansess, | ||||||
|  | 	&chan_tcpdirect, | ||||||
| 	NULL /* Null termination is mandatory. */ | 	NULL /* Null termination is mandatory. */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user