aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client.c53
-rw-r--r--src/socket.c19
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.