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
 | ||||
| 					 fully initialised */ | ||||
| 
 | ||||
| 	struct ChanType* type; | ||||
| 	const struct ChanType* type; | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| @ -100,7 +100,8 @@ void chaninitialise(); | ||||
| void chancleanup(); | ||||
| void setchannelfds(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); | ||||
| 
 | ||||
| void recv_msg_channel_open(); | ||||
|  | ||||
| @ -96,7 +96,8 @@ void chancleanup() { | ||||
| /* If remotechan, transwindow and transmaxpacket are not know (for a new
 | ||||
|  * outgoing connection, with them to be filled on confirmation), they should | ||||
|  * 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) { | ||||
| 
 | ||||
| 	struct Channel * newchan; | ||||
| @ -535,8 +536,6 @@ void recv_msg_channel_request() { | ||||
| 		dropbear_exit("Unknown channel"); | ||||
| 	} | ||||
| 
 | ||||
| 	TRACE(("chan type is %d", channel->type)); | ||||
| 
 | ||||
| 	if (channel->type->reqhandler) { | ||||
| 		channel->type->reqhandler(channel); | ||||
| 	} else { | ||||
| @ -737,6 +736,7 @@ void recv_msg_channel_open() { | ||||
| 	unsigned int typelen; | ||||
| 	unsigned int remotechan, transwindow, transmaxpacket; | ||||
| 	struct Channel *channel; | ||||
| 	const struct ChanType **cp; | ||||
| 	const struct ChanType *chantype; | ||||
| 	unsigned int errtype = SSH_OPEN_UNKNOWN_CHANNEL_TYPE; | ||||
| 	int ret; | ||||
| @ -758,19 +758,24 @@ void recv_msg_channel_open() { | ||||
| 		goto failure; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Get the channel type. This will depend if it is a client or a server,
 | ||||
| 	 * so we iterate through the connection-specific list which was  | ||||
| 	 * set up when the connection started */ | ||||
| 	for (chantype = ses.chantypes[0]; chantype != NULL; chantype++) { | ||||
| 	/* Get the channel type. Client and server style invokation will set up a
 | ||||
| 	 * different list for ses.chantypes at startup. We just iterate through | ||||
| 	 * this list and find the matching name */ | ||||
| 	for (cp = &ses.chantypes[0], chantype = (*cp);  | ||||
| 			chantype != NULL; | ||||
| 			cp++, chantype = (*cp)) { | ||||
| 		if (strcmp(type, chantype->name) == 0) { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (chantype == NULL) { | ||||
| 		TRACE(("No matching type for '%s'", type)); | ||||
| 		goto failure; | ||||
| 	} | ||||
| 
 | ||||
| 	TRACE(("matched type '%s'", type)); | ||||
| 
 | ||||
| 	/* create the channel */ | ||||
| 	channel = newchannel(remotechan, chantype, transwindow, transmaxpacket); | ||||
| 
 | ||||
|  | ||||
| @ -25,7 +25,7 @@ | ||||
| #include "chansession.h" | ||||
| 
 | ||||
| /* Mapping of signal values to ssh signal strings */ | ||||
| const extern struct SigMap signames[] = { | ||||
| const struct SigMap signames[] = { | ||||
| 	{SIGABRT, "ABRT"}, | ||||
| 	{SIGALRM, "ALRM"}, | ||||
| 	{SIGFPE, "FPE"}, | ||||
|  | ||||
							
								
								
									
										4
									
								
								debug.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								debug.h
									
									
									
									
									
								
							| @ -34,7 +34,9 @@ | ||||
| /* #define DEBUG_VALGRIND */ | ||||
| 
 | ||||
| /* 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
 | ||||
|  * CHECKCLEARTOWRITE() before writing. This is only really useful if you're | ||||
|  | ||||
| @ -1,14 +1,27 @@ | ||||
| #include "includes.h" | ||||
| #include "session.h" | ||||
| #include "dbutil.h" | ||||
| #include "channel.h" | ||||
| #include "localtcpfwd.h" | ||||
| 
 | ||||
| #ifndef DISABLE_LOCALTCPFWD | ||||
| static int newtcpdirect(struct Channel * channel); | ||||
| 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
 | ||||
|  * address */ | ||||
| int newtcpdirect(struct Channel * channel) { | ||||
| static int newtcpdirect(struct Channel * channel) { | ||||
| 
 | ||||
| 	unsigned char* desthost = NULL; | ||||
| 	unsigned int destport; | ||||
|  | ||||
| @ -28,7 +28,7 @@ | ||||
| #include "includes.h" | ||||
| #include "channel.h" | ||||
| 
 | ||||
| int newtcpdirect(struct Channel * channel); | ||||
| extern const struct ChanType chan_tcpdirect; | ||||
| 
 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| @ -90,6 +90,7 @@ static void acceptremote(struct TCPListener *listener) { | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	/* XXX XXX XXX - type here needs fixing */ | ||||
| 	if (send_msg_channel_open_init(fd, CHANNEL_ID_TCPFORWARDED,  | ||||
| 				"forwarded-tcpip") == DROPBEAR_SUCCESS) { | ||||
| 		buf_putstring(ses.writepayload, tcpinfo->addr, | ||||
|  | ||||
| @ -56,16 +56,6 @@ static void chansessionrequest(struct Channel *channel); | ||||
| static void send_exitsignalstatus(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 */ | ||||
| extern char** environ; | ||||
| @ -75,25 +65,6 @@ static int sesscheckclose(struct Channel *channel) { | ||||
| 	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 */ | ||||
| static void sesssigchild_handler(int dummy) { | ||||
| 
 | ||||
| @ -254,7 +225,7 @@ static void closechansess(struct Channel *channel) { | ||||
| 
 | ||||
| 	chansess = (struct ChanSess*)channel->typedata; | ||||
| 
 | ||||
| 	send_exitsignalstatus(chansess); | ||||
| 	send_exitsignalstatus(channel); | ||||
| 
 | ||||
| 	TRACE(("enter closechansess")); | ||||
| 	if (chansess == NULL) { | ||||
| @ -911,6 +882,35 @@ static void execchild(struct ChanSess *chansess) { | ||||
| 	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 */ | ||||
| void addnewvar(const char* param, const char* var) { | ||||
| 
 | ||||
|  | ||||
| @ -35,6 +35,7 @@ | ||||
| #include "channel.h" | ||||
| #include "chansession.h" | ||||
| #include "atomicio.h" | ||||
| #include "localtcpfwd.h" | ||||
| 
 | ||||
| static void svr_remoteclosed(); | ||||
| 
 | ||||
| @ -42,6 +43,7 @@ struct serversession svr_ses; | ||||
| 
 | ||||
| const struct ChanType *chantypes[] = { | ||||
| 	&svrchansess, | ||||
| 	&chan_tcpdirect, | ||||
| 	NULL /* Null termination is mandatory. */ | ||||
| }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user