diff --git a/src/channels.c b/src/channels.c index 4fbcec1d..8490a9a3 100644 --- a/src/channels.c +++ b/src/channels.c @@ -1150,13 +1150,15 @@ void ssh_channel_do_free(ssh_channel channel) ssh_list_remove(session->channels, it); } - ssh_buffer_free(channel->stdout_buffer); - ssh_buffer_free(channel->stderr_buffer); + SSH_BUFFER_FREE(channel->stdout_buffer); + SSH_BUFFER_FREE(channel->stderr_buffer); if (channel->callbacks != NULL) { ssh_list_free(channel->callbacks); + channel->callbacks = NULL; } + channel->session = NULL; SAFE_FREE(channel); } @@ -1194,7 +1196,7 @@ int ssh_channel_send_eof(ssh_channel channel) int rc = SSH_ERROR; int err; - if(channel == NULL) { + if (channel == NULL || channel->session == NULL) { return rc; } diff --git a/src/sftp.c b/src/sftp.c index 195089bd..d5934527 100644 --- a/src/sftp.c +++ b/src/sftp.c @@ -308,17 +308,20 @@ void sftp_free(sftp_session sftp) return; } - ssh_channel_send_eof(sftp->channel); - ptr = sftp->queue; - while(ptr) { - sftp_request_queue old; - sftp_message_free(ptr->message); - old = ptr->next; - SAFE_FREE(ptr); - ptr = old; - } + if (sftp->channel != NULL) { + ssh_channel_send_eof(sftp->channel); + ptr = sftp->queue; + while(ptr) { + sftp_request_queue old; + sftp_message_free(ptr->message); + old = ptr->next; + SAFE_FREE(ptr); + ptr = old; + } - ssh_channel_free(sftp->channel); + ssh_channel_free(sftp->channel); + sftp->channel = NULL; + } SAFE_FREE(sftp->handles); SSH_BUFFER_FREE(sftp->read_packet->payload);