diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client.c | 53 | ||||
-rw-r--r-- | src/socket.c | 19 |
2 files changed, 71 insertions, 1 deletions
diff --git a/src/client.c b/src/client.c index a737ba80..a7ef4132 100644 --- a/src/client.c +++ b/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); } +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; + } -error: leave_function(); } diff --git a/src/socket.c b/src/socket.c index 5553d49d..2404a2ec 100644 --- a/src/socket.c +++ b/src/socket.c @@ -159,6 +159,25 @@ ssh_socket ssh_socket_new(ssh_session session) { /** * @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 * upon a socket event. * @param s socket to set callbacks on. |