aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/priv.h1
-rw-r--r--src/client.c9
-rw-r--r--src/packet_cb.c4
-rw-r--r--src/session.c18
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);
}