From 5dff74109e566b3ed18298974c2d4d8afe6d817a Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Tue, 3 Mar 2015 20:53:00 +0800
Subject: [PATCH] Fix error handling for dbclient async connect

---
 cli-main.c | 6 +++++-
 netio.c    | 4 ++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/cli-main.c b/cli-main.c
index ff2b30fa..c7c90359 100644
--- a/cli-main.c
+++ b/cli-main.c
@@ -87,6 +87,7 @@ int main(int argc, char ** argv) {
 static void cli_dropbear_exit(int exitcode, const char* format, va_list param) {
 
 	char fmtbuf[300];
+	char exitmsg[500];
 
 	if (!sessinitdone) {
 		snprintf(fmtbuf, sizeof(fmtbuf), "Exited: %s",
@@ -98,12 +99,15 @@ static void cli_dropbear_exit(int exitcode, const char* format, va_list param) {
 				cli_opts.remoteport, format);
 	}
 
+	/* Arguments to the exit printout may be unsafe to use after session_cleanup() */
+	vsnprintf(exitmsg, sizeof(exitmsg), fmtbuf, param);
+
 	/* Do the cleanup first, since then the terminal will be reset */
 	session_cleanup();
 	/* Avoid printing onwards from terminal cruft */
 	fprintf(stderr, "\n");
 
-	_dropbear_log(LOG_INFO, fmtbuf, param);
+	dropbear_log(LOG_INFO, "%s", exitmsg);;
 	exit(exitcode);
 }
 
diff --git a/netio.c b/netio.c
index 9c84958a..5d1e9a46 100644
--- a/netio.c
+++ b/netio.c
@@ -104,6 +104,8 @@ static void connect_try_next(struct dropbear_progress_connection *c) {
 			message.msg_iovlen = iovlen;
 			res = sendmsg(c->sock, &message, MSG_FASTOPEN);
 			if (res < 0 && errno != EINPROGRESS) {
+				m_free(c->errstring);
+				c->errstring = m_strdup(strerror(errno));
 				/* Not entirely sure which kind of errors are normal - 2.6.32 seems to 
 				return EPIPE for any (nonblocking?) sendmsg(). just fall back */
 				TRACE(("sendmsg tcp_fastopen failed, falling back. %s", strerror(errno)));
@@ -124,6 +126,8 @@ static void connect_try_next(struct dropbear_progress_connection *c) {
 
 		if (res < 0 && errno != EINPROGRESS) {
 			/* failure */
+			m_free(c->errstring);
+			c->errstring = m_strdup(strerror(errno));
 			close(c->sock);
 			c->sock = -1;
 			continue;
-- 
GitLab