diff options
-rw-r--r-- | include/libssh/priv.h | 1 | ||||
-rw-r--r-- | src/client.c | 9 | ||||
-rw-r--r-- | src/packet_cb.c | 4 | ||||
-rw-r--r-- | src/session.c | 18 |
4 files changed, 20 insertions, 12 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h index 596cc2d6..bfef771d 100644 --- a/include/libssh/priv.h +++ b/include/libssh/priv.h @@ -308,6 +308,7 @@ int ssh_auth_reply_success(ssh_session session, int partial); /* client.c */ int ssh_send_banner(ssh_session session, int is_server); +void ssh_session_socket_close(ssh_session session); /* connect.c */ socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host, diff --git a/src/client.c b/src/client.c index 9e1606a3..b3d0fe62 100644 --- a/src/client.c +++ b/src/client.c @@ -486,9 +486,7 @@ static void ssh_client_connection_callback(ssh_session session) return; error: - ssh_socket_close(session->socket); - session->alive = 0; - session->session_state = SSH_SESSION_STATE_ERROR; + ssh_session_socket_close(session); SSH_LOG(SSH_LOG_WARN, "%s", ssh_get_error(session)); } @@ -798,10 +796,7 @@ ssh_disconnect(ssh_session session) } ssh_packet_send(session); - /* Do not close the socket, if the fd was set via options. */ - if (session->opts.fd == SSH_INVALID_SOCKET) { - ssh_socket_close(session->socket); - } + ssh_session_socket_close(session); } error: diff --git a/src/packet_cb.c b/src/packet_cb.c index 363c605f..7edb6791 100644 --- a/src/packet_cb.c +++ b/src/packet_cb.c @@ -81,9 +81,7 @@ SSH_PACKET_CALLBACK(ssh_packet_disconnect_callback) error != NULL ? error : "no error"); SAFE_FREE(error); - ssh_socket_close(session->socket); - session->alive = 0; - session->session_state = SSH_SESSION_STATE_ERROR; + ssh_session_socket_close(session); /* correctly handle disconnect during authorization */ session->auth.state = SSH_AUTH_STATE_FAILED; diff --git a/src/session.c b/src/session.c index 5b12c16e..279352b6 100644 --- a/src/session.c +++ b/src/session.c @@ -496,6 +496,21 @@ const char* ssh_get_hmac_out(ssh_session session) { } /** + * @internal + * @brief Close the connection socket if it is a socket created by us. + * Does not close the sockets provided by the user through options API. + */ +void +ssh_session_socket_close(ssh_session session) +{ + if (session->opts.fd == SSH_INVALID_SOCKET) { + ssh_socket_close(session->socket); + } + session->alive = 0; + session->session_state = SSH_SESSION_STATE_ERROR; +} + +/** * @brief Disconnect impolitely from a remote host by closing the socket. * * Suitable if you forked and want to destroy this session. @@ -509,8 +524,7 @@ ssh_silent_disconnect(ssh_session session) return; } - ssh_socket_close(session->socket); - session->alive = 0; + ssh_session_socket_close(session); ssh_disconnect(session); } |