summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2021-03-06 23:06:43 +0800
committerMatt Johnston <matt@ucc.asn.au>2021-03-06 23:06:43 +0800
commit67a8de30b7dfb627608226380366f824226350cc (patch)
treea22076b2f997391176f4c7aa8d75773c48428901
parent6c571c54e59dc67d6504045f8d61b199eaea8576 (diff)
Prevent multiple shells being spawned
Existing shells would be leaked. The old check only caught multiple commands, not shells.
-rw-r--r--svr-chansession.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/svr-chansession.c b/svr-chansession.c
index 2060141..65b8b26 100644
--- a/svr-chansession.c
+++ b/svr-chansession.c
@@ -658,12 +658,13 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
unsigned int cmdlen = 0;
int ret;
- TRACE(("enter sessioncommand"))
+ TRACE(("enter sessioncommand %d", channel->index))
- if (chansess->cmd != NULL) {
+ if (chansess->pid != 0) {
/* Note that only one command can _succeed_. The client might try
* one command (which fails), then try another. Ie fallback
* from sftp to scp */
+ TRACE(("leave sessioncommand, already have a command"))
return DROPBEAR_FAILURE;
}
@@ -675,6 +676,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
if (cmdlen > MAX_CMD_LEN) {
m_free(chansess->cmd);
/* TODO - send error - too long ? */
+ TRACE(("leave sessioncommand, command too long %d", cmdlen))
return DROPBEAR_FAILURE;
}
}
@@ -687,6 +689,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
#endif
{
m_free(chansess->cmd);
+ TRACE(("leave sessioncommand, unknown subsystem"))
return DROPBEAR_FAILURE;
}
}
@@ -743,6 +746,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
if (ret == DROPBEAR_FAILURE) {
m_free(chansess->cmd);
}
+ TRACE(("leave sessioncommand, ret %d", ret))
return ret;
}
@@ -916,6 +920,7 @@ static void addchildpid(struct ChanSess *chansess, pid_t pid) {
svr_ses.childpidsize++;
}
+ TRACE(("addchildpid %d pid %d for chansess %p", i, pid, chansess))
svr_ses.childpids[i].pid = pid;
svr_ses.childpids[i].chansess = chansess;