1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-12-09 15:41:10 +03:00

Do not close socket passed through options on error conditions

Fixes: #244

Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Sahana Prasad <sahana@redhat.com>
This commit is contained in:
Jakub Jelen
2024-03-13 11:20:24 +01:00
parent 9d5c31205c
commit 07cb0be12f
4 changed files with 20 additions and 12 deletions

View File

@@ -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,

View File

@@ -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:

View File

@@ -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;

View File

@@ -495,6 +495,21 @@ const char* ssh_get_hmac_out(ssh_session session) {
return NULL;
}
/**
* @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.
*
@@ -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);
}