1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-12-11 03:42:35 +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 */ /* client.c */
int ssh_send_banner(ssh_session session, int is_server); int ssh_send_banner(ssh_session session, int is_server);
void ssh_session_socket_close(ssh_session session);
/* connect.c */ /* connect.c */
socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host, 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; return;
error: error:
ssh_socket_close(session->socket); ssh_session_socket_close(session);
session->alive = 0;
session->session_state = SSH_SESSION_STATE_ERROR;
SSH_LOG(SSH_LOG_WARN, "%s", ssh_get_error(session)); SSH_LOG(SSH_LOG_WARN, "%s", ssh_get_error(session));
} }
@@ -798,10 +796,7 @@ ssh_disconnect(ssh_session session)
} }
ssh_packet_send(session); ssh_packet_send(session);
/* Do not close the socket, if the fd was set via options. */ ssh_session_socket_close(session);
if (session->opts.fd == SSH_INVALID_SOCKET) {
ssh_socket_close(session->socket);
}
} }
error: error:

View File

@@ -81,9 +81,7 @@ SSH_PACKET_CALLBACK(ssh_packet_disconnect_callback)
error != NULL ? error : "no error"); error != NULL ? error : "no error");
SAFE_FREE(error); SAFE_FREE(error);
ssh_socket_close(session->socket); ssh_session_socket_close(session);
session->alive = 0;
session->session_state = SSH_SESSION_STATE_ERROR;
/* correctly handle disconnect during authorization */ /* correctly handle disconnect during authorization */
session->auth.state = SSH_AUTH_STATE_FAILED; session->auth.state = SSH_AUTH_STATE_FAILED;

View File

@@ -495,6 +495,21 @@ const char* ssh_get_hmac_out(ssh_session session) {
return NULL; 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. * @brief Disconnect impolitely from a remote host by closing the socket.
* *
@@ -509,8 +524,7 @@ ssh_silent_disconnect(ssh_session session)
return; return;
} }
ssh_socket_close(session->socket); ssh_session_socket_close(session);
session->alive = 0;
ssh_disconnect(session); ssh_disconnect(session);
} }