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