diff options
-rw-r--r-- | include/libssh/priv.h | 2 | ||||
-rw-r--r-- | libssh/channels.c | 53 |
2 files changed, 39 insertions, 16 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h index 22b836b..31f6606 100644 --- a/include/libssh/priv.h +++ b/include/libssh/priv.h @@ -600,7 +600,7 @@ STRING *ssh_encrypt_rsa1(SSH_SESSION *session, STRING *data, PUBLIC_KEY *key); /* channel.c */ void channel_handle(SSH_SESSION *session, int type); CHANNEL *channel_new(SSH_SESSION *session); -void channel_default_bufferize(CHANNEL *channel, void *data, int len, +int channel_default_bufferize(CHANNEL *channel, void *data, int len, int is_stderr); u32 ssh_channel_new_id(SSH_SESSION *session); CHANNEL *ssh_channel_from_local(SSH_SESSION *session,u32 num); diff --git a/libssh/channels.c b/libssh/channels.c index c024799..315d8ea 100644 --- a/libssh/channels.c +++ b/libssh/channels.c @@ -271,7 +271,11 @@ static void channel_rcv_data(SSH_SESSION *session,int is_stderr){ "Data packet too big for our window(%zu vs %d)", string_len(str), channel->local_window); - channel_default_bufferize(channel,str->string,string_len(str), is_stderr); + if (channel_default_bufferize(channel,str->string,string_len(str), is_stderr) < 0) { + string_free(str); + leave_function(); + return; + } if(string_len(str)<=channel->local_window) channel->local_window-=string_len(str); else @@ -424,22 +428,41 @@ void channel_handle(SSH_SESSION *session, int type){ /* when data has been received from the ssh server, it can be applied to the known user function, with help of the callback, or inserted here */ /* XXX is the window changed ? */ -void channel_default_bufferize(CHANNEL *channel, void *data, int len, int is_stderr){ - struct ssh_session *session = channel->session; +int channel_default_bufferize(CHANNEL *channel, void *data, int len, + int is_stderr) { + struct ssh_session *session = channel->session; + + ssh_log(session, SSH_LOG_RARE, + "placing %d bytes into channel buffer (stderr=%d)", len, is_stderr); + if (! is_stderr) { + /* stdout */ + if(channel->stdout_buffer == NULL) { + channel->stdout_buffer = buffer_new(); + if (channel->stdout_buffer == NULL) { + return -1; + } + } - ssh_log(session, SSH_LOG_RARE, - "placing %d bytes into channel buffer (stderr=%d)", len, is_stderr); - if(!is_stderr){ - /* stdout */ - if(!channel->stdout_buffer) - channel->stdout_buffer=buffer_new(); - buffer_add_data(channel->stdout_buffer,data,len); - } else { - /* stderr */ - if(!channel->stderr_buffer) - channel->stderr_buffer=buffer_new(); - buffer_add_data(channel->stderr_buffer,data,len); + if (buffer_add_data(channel->stdout_buffer, data, len) < 0) { + buffer_free(channel->stdout_buffer); + return -1; + } + } else { + /* stderr */ + if (channel->stderr_buffer == NULL) { + channel->stderr_buffer = buffer_new(); + if (channel->stderr_buffer == NULL) { + return -1; + } + } + + if (buffer_add_data(channel->stderr_buffer, data, len) < 0) { + buffer_free(channel->stderr_buffer); + return -1; } + } + + return 0; } /** \brief open a session channel (suited for a shell. Not tcp Forwarding) |