mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-08-10 06:23:01 +03:00
Fix double-connect testcase
This commit is contained in:
@@ -32,6 +32,7 @@ typedef struct ssh_socket_struct* ssh_socket;
|
||||
int ssh_socket_init(void);
|
||||
void ssh_socket_cleanup(void);
|
||||
ssh_socket ssh_socket_new(ssh_session session);
|
||||
void ssh_socket_reset(ssh_socket s);
|
||||
void ssh_socket_free(ssh_socket s);
|
||||
void ssh_socket_set_fd(ssh_socket s, socket_t fd);
|
||||
socket_t ssh_socket_get_fd_in(ssh_socket s);
|
||||
|
55
src/client.c
55
src/client.c
@@ -745,6 +745,7 @@ int ssh_get_openssh_version(ssh_session session) {
|
||||
*/
|
||||
void ssh_disconnect(ssh_session session) {
|
||||
ssh_string str = NULL;
|
||||
int i;
|
||||
|
||||
if (session == NULL) {
|
||||
return;
|
||||
@@ -775,9 +776,59 @@ void ssh_disconnect(ssh_session session) {
|
||||
packet_send(session);
|
||||
ssh_socket_close(session->socket);
|
||||
}
|
||||
session->alive = 0;
|
||||
|
||||
error:
|
||||
session->alive = 0;
|
||||
if(session->socket){
|
||||
ssh_socket_reset(session->socket);
|
||||
}
|
||||
session->fd = SSH_INVALID_SOCKET;
|
||||
session->session_state=SSH_SESSION_STATE_DISCONNECTED;
|
||||
while (session->channels) {
|
||||
ssh_channel_free(session->channels);
|
||||
}
|
||||
if(session->current_crypto){
|
||||
crypto_free(session->current_crypto);
|
||||
session->current_crypto=NULL;
|
||||
}
|
||||
if(session->in_buffer)
|
||||
buffer_reinit(session->in_buffer);
|
||||
if(session->out_buffer)
|
||||
buffer_reinit(session->out_buffer);
|
||||
if(session->in_hashbuf)
|
||||
buffer_reinit(session->in_hashbuf);
|
||||
if(session->out_hashbuf)
|
||||
buffer_reinit(session->out_hashbuf);
|
||||
session->auth_methods = 0;
|
||||
SAFE_FREE(session->serverbanner);
|
||||
SAFE_FREE(session->clientbanner);
|
||||
if (session->client_kex.methods) {
|
||||
for (i = 0; i < 10; i++) {
|
||||
SAFE_FREE(session->client_kex.methods[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (session->server_kex.methods) {
|
||||
for (i = 0; i < 10; i++) {
|
||||
SAFE_FREE(session->server_kex.methods[i]);
|
||||
}
|
||||
}
|
||||
SAFE_FREE(session->client_kex.methods);
|
||||
SAFE_FREE(session->server_kex.methods);
|
||||
if(session->ssh_message_list){
|
||||
ssh_message msg;
|
||||
while((msg=ssh_list_pop_head(ssh_message ,session->ssh_message_list))
|
||||
!= NULL){
|
||||
ssh_message_free(msg);
|
||||
}
|
||||
ssh_list_free(session->ssh_message_list);
|
||||
session->ssh_message_list=NULL;
|
||||
}
|
||||
|
||||
if (session->packet_callbacks){
|
||||
ssh_list_free(session->packet_callbacks);
|
||||
session->packet_callbacks=NULL;
|
||||
}
|
||||
|
||||
leave_function();
|
||||
}
|
||||
|
||||
|
19
src/socket.c
19
src/socket.c
@@ -157,6 +157,25 @@ ssh_socket ssh_socket_new(ssh_session session) {
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @brief Reset the state of a socket so it looks brand-new
|
||||
* @param[in] s socket to rest
|
||||
*/
|
||||
void ssh_socket_reset(ssh_socket s){
|
||||
s->fd_in = SSH_INVALID_SOCKET;
|
||||
s->fd_out= SSH_INVALID_SOCKET;
|
||||
s->last_errno = -1;
|
||||
s->fd_is_socket = 1;
|
||||
buffer_reinit(s->in_buffer);
|
||||
buffer_reinit(s->out_buffer);
|
||||
s->read_wontblock = 0;
|
||||
s->write_wontblock = 0;
|
||||
s->data_except = 0;
|
||||
s->poll_in=s->poll_out=NULL;
|
||||
s->state=SSH_SOCKET_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @brief the socket callbacks, i.e. callbacks to be called
|
||||
|
Reference in New Issue
Block a user