diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-01 20:09:20 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-01 20:09:20 +0000 |
commit | cd4df00dff9b42c53a361ff041f856782deb9126 (patch) | |
tree | fbed59bbcf3fac023a5dba9aff5018d87b099b22 | |
parent | b2e50e8967b43dff023dda9689881ff2ddfeec92 (diff) | |
download | libssh-cd4df00dff9b42c53a361ff041f856782deb9126.tar.gz libssh-cd4df00dff9b42c53a361ff041f856782deb9126.tar.xz libssh-cd4df00dff9b42c53a361ff041f856782deb9126.zip |
Add memory error checks for sftp functions.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@325 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r-- | libssh/sftp.c | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c index 4f6896a..0c8db3b 100644 --- a/libssh/sftp.c +++ b/libssh/sftp.c @@ -44,8 +44,15 @@ static void sftp_message_free(SFTP_MESSAGE *msg); static void sftp_set_error(SFTP_SESSION *sftp, int errnum); SFTP_SESSION *sftp_new(SSH_SESSION *session){ - SFTP_SESSION *sftp=malloc(sizeof(SFTP_SESSION)); + SFTP_SESSION *sftp; + enter_function(); + + sftp = malloc(sizeof(SFTP_SESSION)); + if (sftp == NULL) { + return NULL; + } + memset(sftp,0,sizeof(SFTP_SESSION)); sftp->session=session; sftp->channel=channel_new(session); @@ -71,7 +78,13 @@ SFTP_SESSION *sftp_new(SSH_SESSION *session){ #ifdef WITH_SERVER SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan){ - SFTP_SESSION *sftp=malloc(sizeof(SFTP_SESSION)); + SFTP_SESSION *sftp; + + sftp = malloc(sizeof(SFTP_SESSION)); + if (sftp == NULL) { + return NULL; + } + memset(sftp,0,sizeof(SFTP_SESSION)); sftp->session=session; sftp->channel=chan; @@ -156,9 +169,15 @@ int sftp_packet_write(SFTP_SESSION *sftp,u8 type, BUFFER *payload){ } SFTP_PACKET *sftp_packet_read(SFTP_SESSION *sftp){ - SFTP_PACKET *packet=malloc(sizeof(SFTP_PACKET)); + SFTP_PACKET *packet; u32 size; + sftp_enter_function(); + packet = malloc(sizeof(SFTP_PACKET)); + if (packet == NULL) { + return NULL; + } + packet->sftp=sftp; packet->payload=buffer_new(); if(channel_read(sftp->channel,packet->payload,4,0)<=0){ @@ -204,9 +223,14 @@ int sftp_get_error(SFTP_SESSION *sftp) { static SFTP_MESSAGE *sftp_message_new(SFTP_SESSION *sftp){ SFTP_MESSAGE *msg; + sftp_enter_function(); - msg=malloc(sizeof(SFTP_MESSAGE)); + msg = malloc(sizeof(SFTP_MESSAGE)); + if (msg == NULL) { + return NULL; + } + memset(msg,0,sizeof(*msg)); msg->payload=buffer_new(); msg->sftp=sftp; @@ -325,7 +349,13 @@ int sftp_init(SFTP_SESSION *sftp){ } static REQUEST_QUEUE *request_queue_new(SFTP_MESSAGE *msg){ - REQUEST_QUEUE *queue=malloc(sizeof(REQUEST_QUEUE)); + REQUEST_QUEUE *queue; + + queue = malloc(sizeof(REQUEST_QUEUE)); + if (queue == NULL) { + return NULL; + } + memset(queue,0,sizeof(REQUEST_QUEUE)); queue->message=msg; return queue; @@ -397,7 +427,12 @@ static STATUS_MESSAGE *parse_status_msg(SFTP_MESSAGE *msg){ ssh_set_error(msg->sftp->session, SSH_FATAL,"Not a ssh_fxp_status message passed in !"); return NULL; } - status=malloc(sizeof(STATUS_MESSAGE)); + + status = malloc(sizeof(STATUS_MESSAGE)); + if (status == NULL) { + return NULL; + } + memset(status,0,sizeof(*status)); status->id=msg->id; if( (buffer_get_u32(msg->payload,&status->status)!= 4) @@ -434,7 +469,12 @@ static SFTP_FILE *parse_handle_msg(SFTP_MESSAGE *msg){ ssh_set_error(msg->sftp->session,SSH_FATAL,"Not a ssh_fxp_handle message passed in !"); return NULL; } - file=malloc(sizeof(SFTP_FILE)); + + file = malloc(sizeof(SFTP_FILE)); + if (file == NULL) { + return NULL; + } + memset(file,0,sizeof(*file)); file->sftp=msg->sftp; file->handle=buffer_get_ssh_string(msg->payload); @@ -482,8 +522,11 @@ SFTP_DIR *sftp_opendir(SFTP_SESSION *sftp, const char *path){ case SSH_FXP_HANDLE: file=parse_handle_msg(msg); sftp_message_free(msg); - if(file){ - dir=malloc(sizeof(SFTP_DIR)); + if (file) { + dir = malloc(sizeof(SFTP_DIR)); + if (dir == NULL) { + return NULL; + } memset(dir,0,sizeof(*dir)); dir->sftp=sftp; dir->name=strdup(path); @@ -506,7 +549,7 @@ SFTP_DIR *sftp_opendir(SFTP_SESSION *sftp, const char *path){ static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf, int expectnames) { u32 flags=0; - SFTP_ATTRIBUTES *attr=malloc(sizeof(SFTP_ATTRIBUTES)); + SFTP_ATTRIBUTES *attr; STRING *owner=NULL; STRING *group=NULL; int ok=0; @@ -514,6 +557,11 @@ static SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp, BUFFER *buf, /* unused member variable */ (void) expectnames; + attr = malloc(sizeof(SFTP_ATTRIBUTES)); + if (attr == NULL) { + return NULL; + } + memset(attr,0,sizeof(*attr)); /* it isn't really a loop, but i use it because it's like a try..catch.. construction in C */ do { @@ -632,8 +680,14 @@ static SFTP_ATTRIBUTES *sftp_parse_attr_3(SFTP_SESSION *sftp, BUFFER *buf, u32 flags=0; STRING *name; STRING *longname; - SFTP_ATTRIBUTES *attr=malloc(sizeof(SFTP_ATTRIBUTES)); + SFTP_ATTRIBUTES *attr; int ok=0; + + attr = malloc(sizeof(SFTP_ATTRIBUTES)); + if (attr == NULL) { + return NULL; + } + memset(attr,0,sizeof(*attr)); /* it isn't really a loop, but i use it because it's like a try..catch.. construction in C */ do { |