summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-01 10:14:26 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-01 10:14:26 +0000
commitf80efcc26070bb6d42fca830d80aed3fca82206e (patch)
treed8f151c766b0b00fa14d916c6f274bbfd8d03950
parent2634f45e11020950f1c33b3793532850746d0023 (diff)
downloadlibssh-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.c22
-rw-r--r--libssh/messages.c4
-rw-r--r--libssh/sftp.c5
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);