aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Southwell <joseph@southwell.org>2014-02-02 19:25:16 +0100
committerAndreas Schneider <asn@cryptomilk.org>2014-02-02 22:21:07 +0100
commit0d82186503185bebe44145e31f057c0a1a120011 (patch)
treec0b798a805ccc129b1b1a05f86b09af0ebe6e826
parent5157d96958773bbaec0d52866d076f14d97d3b9e (diff)
downloadlibssh-0d82186503185bebe44145e31f057c0a1a120011.tar.gz
libssh-0d82186503185bebe44145e31f057c0a1a120011.tar.xz
libssh-0d82186503185bebe44145e31f057c0a1a120011.zip
client: Fix EOF session error reporting.
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r--src/client.c3
-rw-r--r--src/session.c9
2 files changed, 9 insertions, 3 deletions
diff --git a/src/client.c b/src/client.c
index 611fc3ab..18bf9cb5 100644
--- a/src/client.c
+++ b/src/client.c
@@ -536,7 +536,8 @@ pending:
}
SSH_LOG(SSH_LOG_PACKET,"ssh_connect: Actual timeout : %d", timeout);
ret = ssh_handle_packets_termination(session, timeout, ssh_connect_termination, session);
- if (ret == SSH_ERROR || !ssh_connect_termination(session)) {
+ if (session->session_state != SSH_SESSION_STATE_ERROR &&
+ (ret == SSH_ERROR || !ssh_connect_termination(session))) {
ssh_set_error(session, SSH_FATAL,
"Timeout connecting to %s", session->opts.host);
session->session_state = SSH_SESSION_STATE_ERROR;
diff --git a/src/session.c b/src/session.c
index 71d4548e..4d63a19d 100644
--- a/src/session.c
+++ b/src/session.c
@@ -695,8 +695,13 @@ void ssh_socket_exception_callback(int code, int errno_code, void *user){
ssh_session session=(ssh_session)user;
SSH_LOG(SSH_LOG_RARE,"Socket exception callback: %d (%d)",code, errno_code);
- session->session_state=SSH_SESSION_STATE_ERROR;
- ssh_set_error(session,SSH_FATAL,"Socket error: %s",strerror(errno_code));
+ session->session_state = SSH_SESSION_STATE_ERROR;
+ if (errno_code == 0 && code == SSH_SOCKET_EXCEPTION_EOF) {
+ ssh_set_error(session, SSH_FATAL, "Socket error: disconnected");
+ } else {
+ ssh_set_error(session, SSH_FATAL, "Socket error: %s", strerror(errno_code));
+ }
+
session->ssh_connection_callback(session);
}