diff options
author | Matt Johnston <matt@ucc.asn.au> | 2021-03-06 23:06:43 +0800 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2021-03-06 23:06:43 +0800 |
commit | 67a8de30b7dfb627608226380366f824226350cc (patch) | |
tree | a22076b2f997391176f4c7aa8d75773c48428901 | |
parent | 6c571c54e59dc67d6504045f8d61b199eaea8576 (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.c | 9 |
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; |