summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2015-03-03 20:53:00 +0800
committerMatt Johnston <matt@ucc.asn.au>2015-03-03 20:53:00 +0800
commit5c90e48a0d42dab634574be1b464457ba71a71a4 (patch)
tree80952d7e06fd18611c32d2d591e6bf1b2fed0436
parentdf7a814da94619dc131803973992eb76284b9640 (diff)
downloaddropbear-5c90e48a0d42dab634574be1b464457ba71a71a4.tar.gz
Fix error handling for dbclient async connect
-rw-r--r--cli-main.c6
-rw-r--r--netio.c4
2 files changed, 9 insertions, 1 deletions
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;