# HG changeset patch # User Matt Johnston # Date 1615043203 -28800 # Node ID f0cd000f3bca106b714d8dc6ca44c232fdda54c9 # Parent 837cc354b38815d201b93c99400499394add2119 Prevent multiple shells being spawned Existing shells would be leaked. The old check only caught multiple commands, not shells. diff -r 837cc354b388 -r f0cd000f3bca svr-chansession.c --- a/svr-chansession.c Sat Mar 06 23:05:17 2021 +0800 +++ b/svr-chansession.c Sat Mar 06 23:06:43 2021 +0800 @@ -658,12 +658,13 @@ 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 @@ 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 @@ #endif { m_free(chansess->cmd); + TRACE(("leave sessioncommand, unknown subsystem")) return DROPBEAR_FAILURE; } } @@ -743,6 +746,7 @@ if (ret == DROPBEAR_FAILURE) { m_free(chansess->cmd); } + TRACE(("leave sessioncommand, ret %d", ret)) return ret; } @@ -916,6 +920,7 @@ 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;