From 5c90e48a0d42dab634574be1b464457ba71a71a4 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Tue, 3 Mar 2015 20:53:00 +0800 Subject: 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 ff2b30f..c7c9035 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 9c84958..5d1e9a4 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; -- cgit v1.2.1