summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-07 14:10:45 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-07 14:10:45 +0000
commitaea8587586b768d053c2d57fc88fca519e67fdbf (patch)
tree20d9aec07c6f594a1d7ab9e30c1e4e05f17d207a
parent8d3a43db7ad387db6369cbf77323cf21b60c494a (diff)
downloadlibssh-aea8587586b768d053c2d57fc88fca519e67fdbf.tar.gz
libssh-aea8587586b768d053c2d57fc88fca519e67fdbf.tar.xz
libssh-aea8587586b768d053c2d57fc88fca519e67fdbf.zip
Add return values and error checking to channel_default_bufferize().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@414 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r--include/libssh/priv.h2
-rw-r--r--libssh/channels.c53
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)