mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-30 13:01:23 +03:00
Improve channel_free().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@388 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
@@ -485,11 +485,21 @@ int channel_open_forward(CHANNEL *channel,char *remotehost, int remoteport, char
|
|||||||
void channel_free(CHANNEL *channel) {
|
void channel_free(CHANNEL *channel) {
|
||||||
SSH_SESSION *session = channel->session;
|
SSH_SESSION *session = channel->session;
|
||||||
enter_function();
|
enter_function();
|
||||||
if(session->alive && channel->open)
|
|
||||||
|
if (channel == NULL) {
|
||||||
|
leave_function();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session->alive && channel->open) {
|
||||||
channel_close(channel);
|
channel_close(channel);
|
||||||
|
}
|
||||||
|
|
||||||
/* handle the "my channel is first on session list" case */
|
/* handle the "my channel is first on session list" case */
|
||||||
if(session->channels==channel)
|
if (session->channels == channel) {
|
||||||
session->channels = channel->next;
|
session->channels = channel->next;
|
||||||
|
}
|
||||||
|
|
||||||
/* handle the "my channel is the only on session list" case */
|
/* handle the "my channel is the only on session list" case */
|
||||||
if (channel->next == channel) {
|
if (channel->next == channel) {
|
||||||
session->channels = NULL;
|
session->channels = NULL;
|
||||||
@@ -497,13 +507,13 @@ void channel_free(CHANNEL *channel){
|
|||||||
channel->prev->next = channel->next;
|
channel->prev->next = channel->next;
|
||||||
channel->next->prev = channel->prev;
|
channel->next->prev = channel->prev;
|
||||||
}
|
}
|
||||||
if(channel->stdout_buffer)
|
|
||||||
buffer_free(channel->stdout_buffer);
|
buffer_free(channel->stdout_buffer);
|
||||||
if(channel->stderr_buffer)
|
|
||||||
buffer_free(channel->stderr_buffer);
|
buffer_free(channel->stderr_buffer);
|
||||||
|
|
||||||
/* debug trick to catch use after frees */
|
/* debug trick to catch use after frees */
|
||||||
memset(channel, 'X', sizeof(CHANNEL));
|
memset(channel, 'X', sizeof(CHANNEL));
|
||||||
free(channel);
|
SAFE_FREE(channel);
|
||||||
leave_function();
|
leave_function();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user