summaryrefslogtreecommitdiff
path: root/svr-chansession.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2018-11-14 22:57:56 +0800
committerMatt Johnston <matt@ucc.asn.au>2018-11-14 22:57:56 +0800
commit0457a76da104e49d0d3053ead9966655f633ff46 (patch)
treed0781a94f6f10e9c9b6ba0c48bd9d2b36030290b /svr-chansession.c
parent8d38abefa1d8de996644e6891000821e0738ba54 (diff)
downloaddropbear-0457a76da104e49d0d3053ead9966655f633ff46.tar.gz
Split ChanType closehandler() and cleanup() so that dbclient doesn't
lose exit status messages
Diffstat (limited to 'svr-chansession.c')
-rw-r--r--svr-chansession.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/svr-chansession.c b/svr-chansession.c
index faf62e5..038a0f2 100644
--- a/svr-chansession.c
+++ b/svr-chansession.c
@@ -51,6 +51,7 @@ static void execchild(const void *user_data_chansess);
static void addchildpid(struct ChanSess *chansess, pid_t pid);
static void sesssigchild_handler(int val);
static void closechansess(const struct Channel *channel);
+static void cleanupchansess(const struct Channel *channel);
static int newchansess(struct Channel *channel);
static void chansessionrequest(struct Channel *channel);
static int sesscheckclose(const struct Channel *channel);
@@ -69,6 +70,7 @@ const struct ChanType svrchansess = {
sesscheckclose, /* checkclosehandler */
chansessionrequest, /* reqhandler */
closechansess, /* closehandler */
+ cleanupchansess /* cleanup */
};
/* required to clear environment */
@@ -91,7 +93,7 @@ void svr_chansess_checksignal(void) {
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
unsigned int i;
struct exitinfo *ex = NULL;
- TRACE(("sigchld handler: pid %d", pid))
+ TRACE(("svr_chansess_checksignal : pid %d", pid))
ex = NULL;
/* find the corresponding chansess */
@@ -285,8 +287,25 @@ chansess_login_alloc(const struct ChanSess *chansess) {
return li;
}
-/* clean a session channel */
+/* send exit status message before the channel is closed */
static void closechansess(const struct Channel *channel) {
+ struct ChanSess *chansess;
+
+ TRACE(("enter closechansess"))
+
+ chansess = (struct ChanSess*)channel->typedata;
+
+ if (chansess == NULL) {
+ TRACE(("leave closechansess: chansess == NULL"))
+ return;
+ }
+
+ send_exitsignalstatus(channel);
+ TRACE(("leave closechansess"))
+}
+
+/* clean a session channel */
+static void cleanupchansess(const struct Channel *channel) {
struct ChanSess *chansess;
unsigned int i;
@@ -301,8 +320,6 @@ static void closechansess(const struct Channel *channel) {
return;
}
- send_exitsignalstatus(channel);
-
m_free(chansess->cmd);
m_free(chansess->term);