summaryrefslogtreecommitdiffhomepage
path: root/svr-chansession.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2004-08-12 16:41:58 +0000
committerMatt Johnston <matt@ucc.asn.au>2004-08-12 16:41:58 +0000
commit8e1ec24f55be1a9af2595a58bb4b805bebd7fa9d (patch)
tree0b54a905a49358adc37ce32e3e80239dd6ebd736 /svr-chansession.c
parent538bc5a09e8a7aa6fdc7f38f0bac649efd6bd264 (diff)
Merging in the changes from 0.41-0.43 main Dropbear tree
--HG-- extra : convert_revision : 4c3428781bc8faf0fd7cadd7099fbd7f4ea386e7
Diffstat (limited to 'svr-chansession.c')
-rw-r--r--svr-chansession.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/svr-chansession.c b/svr-chansession.c
index a0e877c..01612f4 100644
--- a/svr-chansession.c
+++ b/svr-chansession.c
@@ -273,7 +273,7 @@ static void closechansess(struct Channel *channel) {
* or x11/authagent forwarding. These are passed to appropriate handlers */
static void chansessionrequest(struct Channel *channel) {
- unsigned char * type;
+ unsigned char * type = NULL;
unsigned int typelen;
unsigned char wantreply;
int ret = 1;
@@ -320,7 +320,7 @@ static void chansessionrequest(struct Channel *channel) {
out:
if (wantreply) {
- if (ret == 0) {
+ if (ret == DROPBEAR_SUCCESS) {
send_msg_channel_success(channel);
} else {
send_msg_channel_failure(channel);
@@ -336,7 +336,7 @@ out:
static int sessionsignal(struct ChanSess *chansess) {
int sig = 0;
- unsigned char* signame;
+ unsigned char* signame = NULL;
int i;
if (chansess->pid == 0) {
@@ -528,11 +528,14 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
int iscmd, int issubsys) {
unsigned int cmdlen;
+ int ret;
TRACE(("enter sessioncommand"));
if (chansess->cmd != NULL) {
- /* TODO - send error - multiple commands? */
+ /* Note that only one command can _succeed_. The client might try
+ * one command (which fails), then try another. Ie fallback
+ * from sftp to scp */
return DROPBEAR_FAILURE;
}
@@ -541,6 +544,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
chansess->cmd = buf_getstring(ses.payload, &cmdlen);
if (cmdlen > MAX_CMD_LEN) {
+ m_free(chansess->cmd);
/* TODO - send error - too long ? */
return DROPBEAR_FAILURE;
}
@@ -552,6 +556,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
} else
#endif
{
+ m_free(chansess->cmd);
return DROPBEAR_FAILURE;
}
}
@@ -559,11 +564,16 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
if (chansess->term == NULL) {
/* no pty */
- return noptycommand(channel, chansess);
+ ret = noptycommand(channel, chansess);
} else {
/* want pty */
- return ptycommand(channel, chansess);
+ ret = ptycommand(channel, chansess);
+ }
+
+ if (ret == DROPBEAR_FAILURE) {
+ m_free(chansess->cmd);
}
+ return ret;
}
/* Execute a command and set up redirection of stdin/stdout/stderr without a
@@ -650,7 +660,7 @@ static int noptycommand(struct Channel *channel, struct ChanSess *chansess) {
static int ptycommand(struct Channel *channel, struct ChanSess *chansess) {
pid_t pid;
- struct logininfo *li;
+ struct logininfo *li = NULL;
#ifdef DO_MOTD
buffer * motdbuf = NULL;
int len;
@@ -778,8 +788,8 @@ static void addchildpid(struct ChanSess *chansess, pid_t pid) {
static void execchild(struct ChanSess *chansess) {
char *argv[4];
- char * usershell;
- char * baseshell;
+ char * usershell = NULL;
+ char * baseshell = NULL;
unsigned int i;
/* wipe the hostkey */
@@ -863,6 +873,11 @@ static void execchild(struct ChanSess *chansess) {
agentset(chansess);
#endif
+ /* Re-enable SIGPIPE for the executed process */
+ if (signal(SIGPIPE, SIG_DFL) == SIG_ERR) {
+ dropbear_exit("signal() error");
+ }
+
baseshell = basename(usershell);
if (chansess->cmd != NULL) {
@@ -921,7 +936,7 @@ void svr_chansessinitialise() {
/* add a new environment variable, allocating space for the entry */
void addnewvar(const char* param, const char* var) {
- char* newvar;
+ char* newvar = NULL;
int plen, vlen;
plen = strlen(param);