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
This commit is contained in:
Andreas Schneider
2009-04-01 10:14:26 +00:00
parent 2634f45e11
commit f80efcc260
3 changed files with 28 additions and 3 deletions

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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);