diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-01 10:14:26 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-01 10:14:26 +0000 |
commit | f80efcc26070bb6d42fca830d80aed3fca82206e (patch) | |
tree | d8f151c766b0b00fa14d916c6f274bbfd8d03950 | |
parent | 2634f45e11020950f1c33b3793532850746d0023 (diff) | |
download | libssh-f80efcc26070bb6d42fca830d80aed3fca82206e.tar.gz libssh-f80efcc26070bb6d42fca830d80aed3fca82206e.tar.xz libssh-f80efcc26070bb6d42fca830d80aed3fca82206e.zip |
Add checks for memory errors in channel functions.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@314 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r-- | libssh/channels.c | 22 | ||||
-rw-r--r-- | libssh/messages.c | 4 | ||||
-rw-r--r-- | libssh/sftp.c | 5 |
3 files changed, 28 insertions, 3 deletions
diff --git a/libssh/channels.c b/libssh/channels.c index 457f1dd..3fb3723 100644 --- a/libssh/channels.c +++ b/libssh/channels.c @@ -48,6 +48,10 @@ */ CHANNEL *channel_new(SSH_SESSION *session){ CHANNEL *channel=malloc(sizeof(CHANNEL)); + + if (channel == NULL) { + return NULL; + } memset(channel,0,sizeof(CHANNEL)); channel->session=session; channel->version=session->version; @@ -1107,9 +1111,21 @@ int channel_select(CHANNEL **readchans, CHANNEL **writechans, CHANNEL **exceptch return 0; } /* prepare the outgoing temporary arrays */ - rchans=malloc(sizeof(CHANNEL *) * (count_ptrs(readchans)+1)); - wchans=malloc(sizeof(CHANNEL *) * (count_ptrs(writechans)+1)); - echans=malloc(sizeof(CHANNEL *) * (count_ptrs(exceptchans)+1)); + rchans = malloc(sizeof(CHANNEL *) * (count_ptrs(readchans) + 1)); + if (rchans == NULL) { + return SSH_ERROR; + } + wchans = malloc(sizeof(CHANNEL *) * (count_ptrs(writechans) + 1)); + if (wchans == NULL) { + SAFE_FREE(rchans); + return SSH_ERROR; + } + echans = malloc(sizeof(CHANNEL *) * (count_ptrs(exceptchans) + 1)); + if (echans == NULL) { + SAFE_FREE(rchans); + SAFE_FREE(wchans); + return SSH_ERROR; + } /* first, try without doing network stuff */ /* then, select and redo the networkless stuff */ diff --git a/libssh/messages.c b/libssh/messages.c index edd898b..3a8356a 100644 --- a/libssh/messages.c +++ b/libssh/messages.c @@ -215,6 +215,10 @@ CHANNEL *ssh_message_channel_request_open_reply_accept(SSH_MESSAGE *msg){ enter_function(); chan=channel_new(session); + if (chan == NULL) { + leave_function(); + return NULL; + } chan->local_channel=ssh_channel_new_id(session); chan->local_maxpacket=35000; chan->local_window=32000; diff --git a/libssh/sftp.c b/libssh/sftp.c index 927d71c..4f6896a 100644 --- a/libssh/sftp.c +++ b/libssh/sftp.c @@ -49,6 +49,11 @@ SFTP_SESSION *sftp_new(SSH_SESSION *session){ memset(sftp,0,sizeof(SFTP_SESSION)); sftp->session=session; sftp->channel=channel_new(session); + if (sftp->channel == NULL) { + SAFE_FREE(sftp); + leave_function(); + return NULL; + } if(channel_open_session(sftp->channel)){ channel_free(sftp->channel); free(sftp); |