aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2024-03-13 11:20:24 +0100
committerJakub Jelen <jjelen@redhat.com>2024-03-23 11:48:50 +0100
commit07cb0be12f4a3d5691f6a580343cb94d658decf5 (patch)
treeee94018f79f741f41aa509f0687a3da1e2343046 /src
parent9d5c31205c8b87970a1efa2d5d8c3ec9b872bc87 (diff)
downloadlibssh-master.tar.gz
libssh-master.tar.xz
libssh-master.zip
Do not close socket passed through options on error conditionsHEADmaster
Fixes: #244 Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Sahana Prasad <sahana@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/client.c9
-rw-r--r--src/packet_cb.c4
-rw-r--r--src/session.c18
3 files changed, 19 insertions, 12 deletions
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);
}