[prev in list] [next in list] [prev in thread] [next in thread] 

List:       clamav-devel
Subject:    Re: [Clamav-devel] cli_malloc does NOT exit and MAY return NULL
From:       Joe Maimon <jmaimon () ttec ! com>
Date:       2004-05-13 19:32:55
Message-ID: 40A3CD67.3000507 () ttec ! com
[Download RAW message or body]

Never mind,

This patch is not stable yet.

Joe Maimon wrote:

> Return value checks for 
> cli_malloc/cli_calloc/cli_realloc/malloc/calloc/realloc
> 
> Some of the reactions may not be wholly apropriate but are certainly 
> no worse than a segfault?
> 
> Joe
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Only in clamav-devel.jm-pl4: autom4te.cache
> Only in clamav-devel.jm-pl4: backup-051220042311-pre-clamav-devel.jm-pl4.tgz
> diff -ur --exclude=*config* clamav-devel-jm4/clamscan/manager.c \
>                 clamav-devel.jm-pl4/clamscan/manager.c
> --- clamav-devel-jm4/clamscan/manager.c	Thu May 13 13:12:35 2004
> +++ clamav-devel.jm-pl4/clamscan/manager.c	Thu May 13 13:08:26 2004
> @@ -164,12 +164,16 @@
> /* set (default) limits */
> 
> limits = (struct cl_limits *) calloc(1, sizeof(struct cl_limits));
> +    if(!limits)
> +	exit(60);
> 
> if(optl(opt, "max-space")) {
> 	char *cpy, *ptr;
> 	ptr = getargl(opt, "max-space");
> 	if(tolower(ptr[strlen(ptr) - 1]) == 'm') {
> 	    cpy = mcalloc(strlen(ptr), sizeof(char));
> +	    if(!cpy)
> +		exit(60);
> 	    strncpy(cpy, ptr, strlen(ptr) - 1);
> 	    limits->maxfilesize = atoi(cpy) * 1024 * 1024;
> 	    free(cpy);
> Only in clamav-devel.jm-pl4: description-pak
> Only in clamav-devel.jm-pl4: doc-pak
> Only in clamav-devel.jm-pl4/libclamav: .message.c.swp
> Only in clamav-devel.jm-pl4/libclamav: .vba_extract.c.swp
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/blob.c \
>                 clamav-devel.jm-pl4/libclamav/blob.c
> --- clamav-devel-jm4/libclamav/blob.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/blob.c	Thu May 13 13:08:09 2004
> @@ -166,8 +166,12 @@
> 		b->size = len * 4;
> 		b->data = cli_malloc(b->size);
> 	} else if(b->size < b->len + len) {
> +		void * p = NULL;
> 		b->size += len * 4;
> -		b->data = cli_realloc(b->data, b->size);
> +		p = cli_realloc(b->data, b->size);
> +		if(!p)
> +		    return;
> +		b->data = p;
> 	}
> 
> 	if(b->data) {
> @@ -200,8 +204,13 @@
> 	b->isClosed = 1;
> 
> 	if(b->size != b->len) {
> +		void * p = NULL;
> +		
> 		b->size = b->len;
> -		b->data = cli_realloc(b->data, b->size);
> +		p = cli_realloc(b->data, b->size);
> +		if(!p)
> +		    return;
> +		b->data = p;
> 	}
> }
> 
> @@ -252,7 +261,11 @@
> 		b->size = len;
> 		b->data = cli_malloc(len);
> 	} else {
> +		void * p = NULL;
> 		b->size += len;
> -		b->data = cli_realloc(b->data, b->size);
> +		p = cli_realloc(b->data, b->size);
> +		if(!p)
> +		    return;
> +		b->data = p;
> 	}
> }
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/cvd.c \
>                 clamav-devel.jm-pl4/libclamav/cvd.c
> --- clamav-devel-jm4/libclamav/cvd.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/cvd.c	Thu May 13 13:08:29 2004
> @@ -55,6 +55,8 @@
> 
> 
> fullname = (char *) calloc(sizeof(char), strlen(destdir) + 100 + 5);
> +    if(!fullname)
> +	return -1;
> 
> while(1) {
> 
> @@ -163,6 +165,8 @@
> }
> 
> cvd = (struct cl_cvd *) cli_calloc(1, sizeof(struct cl_cvd));
> +    if(!cvd)
> +	return NULL;
> 
> if(!(cvd->time = cli_strtok(head, 1, ":"))) {
> 	cli_errmsg("CVD -> Can't extract time from header.\n");
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/dsig.c \
>                 clamav-devel.jm-pl4/libclamav/dsig.c
> --- clamav-devel-jm4/libclamav/dsig.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/dsig.c	Thu May 13 13:08:29 2004
> @@ -83,6 +83,8 @@
> 
> mpz_init(p);
> decoded = (char *) calloc(plainlen + 1, sizeof(char));
> +    if(!decoded)
> +	return NULL;
> 
> mpz_powm(p, c, e, n); /* plain = cipher^e mod n */
> mpz_clear(c);
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/message.c \
>                 clamav-devel.jm-pl4/libclamav/message.c
> --- clamav-devel-jm4/libclamav/message.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/message.c	Thu May 13 13:10:55 2004
> @@ -250,6 +250,8 @@
> messageCreate(void)
> {
> 	message *m = (message *)cli_calloc(1, sizeof(message));
> +	if(!m)
> +	   return NULL;
> 
> 	m->mimeType = NOMIME;
> 	m->encodingType = NOENCODING;
> @@ -443,8 +445,13 @@
> 			return;	/* already in there */
> 
> 	if(offset == m->numberOfArguments) {
> +		void * p = NULL;
> +
> 		m->numberOfArguments++;
> -		m->mimeArguments = (char **)cli_realloc(m->mimeArguments, m->numberOfArguments * \
> sizeof(char *)); +		p = cli_realloc(m->mimeArguments, m->numberOfArguments * \
> sizeof(char *)); +		if(!p)
> +		    return;
> +		m->mimeArguments = (char **) p;
> 	}
> 
> 	m->mimeArguments[offset] = strdup(arg);
> @@ -572,6 +579,8 @@
> 			*ptr = '\0';
> 
> 			field = cli_malloc(strlen(key) + strlen(data) + 2);
> +			if(!field)
> +			    return;
> 			sprintf(field, "%s=%s", key, data);
> 
> 			free((char *)key);
> @@ -593,6 +602,8 @@
> 
> 			len = (size_t)string - (size_t)key + 1;
> 			field = cli_malloc(len);
> +			if(!field)
> +			    return;
> 
> 			memcpy(field, key, len - 1);
> 			field[len - 1] = '\0';
> @@ -900,6 +911,12 @@
> 		 *
> 		 * See RFC1741
> 		 */
> +		
> +		if(!tmp) {
> +		   blobDestroy(b);
> +		   return NULL;
> +		}
> +
> 		while((t_line = t_line->t_next) != NULL)
> 			blobAddData(tmp, (unsigned char *)t_line->t_text, strlen(t_line->t_text));
> 
> @@ -934,6 +951,11 @@
> 		cli_dbgmsg("decode HQX7 message (%lu bytes)\n", len);
> 
> 		ptr = cli_malloc(len);
> +		if(!ptr) {
> +		    blobDestroy(tmp);
> +		    blobDestroy(b);
> +		    return NULL;
> +		}
> 		memcpy(ptr, data, len);
> 		bytenumber = 0;
> 
> @@ -998,6 +1020,11 @@
> 		 */
> 		if(memchr(data, 0x90, newlen)) {
> 			blob *u = blobCreate();	/* uncompressed data */
> +			if(!u) {
> +			    blobDestroy(tmp);
> +			    blobDestroy(b);
> +			    return NULL;
> +			}
> 
> 			/*
> 			 * Includes compression
> @@ -1053,10 +1080,20 @@
> 		 */
> 		byte = data[0];
> 		filename = cli_malloc(byte + 1);
> +		if(!filename) {
> +		   blobDestroy(tmp);
> +		   blobDestroy(b);
> +		   return NULL;
> +		}
> 		memcpy(filename, &data[1], byte);
> 		filename[byte] = '\0';
> 		blobSetFilename(b, filename);
> 		ptr = cli_malloc(strlen(filename) + 6);
> +		if(!ptr) {
> +		   blobDestroy(tmp);
> +		   blobDestroy(b);
> +		   return NULL;
> +		}
> 		sprintf(ptr, "name=%s", filename);
> 		messageAddArgument(m, ptr);
> 		free(ptr);
> @@ -1177,8 +1214,12 @@
> 		for(t_line = messageGetBody(m); t_line; t_line = t_line->t_next) {
> 			if(first == NULL)
> 				first = last = cli_malloc(sizeof(text));
> +				if(!first)
> +				    return NULL;
> 			else {
> 				last->t_next = cli_malloc(sizeof(text));
> +				if(!last->t_next)
> +			            return NULL;
> 				last = last->t_next;
> 			}
> 
> @@ -1221,8 +1262,12 @@
> 
> 			if(first == NULL)
> 				first = last = cli_malloc(sizeof(text));
> +				if(!first)
> +				    return(NULL);
> 			else {
> 				last->t_next = cli_malloc(sizeof(text));
> +				if(!last->t_next)
> +				    return NULL;
> 				last = last->t_next;
> 			}
> 
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/ole2_extract.c \
>                 clamav-devel.jm-pl4/libclamav/ole2_extract.c
> --- clamav-devel-jm4/libclamav/ole2_extract.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/ole2_extract.c	Thu May 13 13:08:29 2004
> @@ -536,7 +536,7 @@
> {
> 	unsigned char buff[(1 << hdr->log2_big_block_size)];
> 	int32_t current_block, ofd, len, offset;
> -	char *name, *newname;
> +	char *name = NULL, *newname = NULL;
> 
> 	if (prop->type != 2) {
> 		/* Not a file */
> @@ -561,6 +561,11 @@
> 	}
> 
> 	newname = (char *) cli_malloc(strlen(name) + strlen(dir) + 2);
> +	if(!newname) {
> +	    if(name)
> +	       free(name);
> +	    return FALSE;
> +	}
> 	sprintf(newname, "%s/%s", dir, name);
> 	free(name);
> 
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/others.c \
>                 clamav-devel.jm-pl4/libclamav/others.c
> --- clamav-devel-jm4/libclamav/others.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/others.c	Thu May 13 13:08:29 2004
> @@ -174,6 +174,8 @@
> fclose(fd);
> 
> md5str = (char*) calloc(32 + 1, sizeof(char));
> +    if(!md5str)
> +	return NULL;
> 
> for(i=0; i<16; i++)
> 	cnt += sprintf(md5str + cnt, "%02x", buffer[i]);
> @@ -190,6 +192,8 @@
> md5_stream(fd, &buffer);
> 
> md5str = (char*) calloc(32 + 1, sizeof(char));
> +    if(!md5str)
> +	return NULL;
> 
> for(i=0; i<16; i++)
> 	cnt += sprintf(md5str + cnt, "%02x", buffer[i]);
> @@ -211,6 +215,8 @@
> memcpy(oldmd5buff, md5buff, 16);
> 
> md5str = (char*) cli_calloc(32 + 1, sizeof(char));
> +    if(!md5str)
> +	return NULL;
> 
> for(i=0; i<16; i++)
> 	cnt += sprintf(md5str + cnt, "%02x", md5buff[i]);
> @@ -332,6 +338,8 @@
> 		if(dent->d_ino) {
> 		    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..")) {
> 			fname = cli_calloc(strlen(dirname) + strlen(dent->d_name) + 2, sizeof(char));
> +			if(!fname)
> +			    return 0;
> 			sprintf(fname, "%s/%s", dirname, dent->d_name);
> 
> 			/* stat the file */
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/readdb.c \
>                 clamav-devel.jm-pl4/libclamav/readdb.c
> --- clamav-devel-jm4/libclamav/readdb.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/readdb.c	Thu May 13 13:08:29 2004
> @@ -295,9 +295,16 @@
> 	if(dent->d_ino) {
> 	    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && \
> (cli_strbcasestr(dent->d_name, ".db") || cli_strbcasestr(dent->d_name, ".db2") || \
> cli_strbcasestr(dent->d_name, ".cvd"))) { 
> +		void * p = NULL;
> +		
> 		dbstat->no++;
> -		dbstat->stattab = (struct stat *) realloc(dbstat->stattab, dbstat->no * \
> sizeof(struct stat)); +		p = (struct stat *) realloc(dbstat->stattab, dbstat->no * \
> sizeof(struct stat)); +		if(!p)	
> +		    return CL_EMEM;
> +		dbstat->stattab = p;
> fname = cli_calloc(strlen(dirname) + strlen(dent->d_name) + 2, sizeof(char));
> +		if(!fname)
> +		    return CL_EMEM;
> 		sprintf(fname, "%s/%s", dirname, dent->d_name);
> 		stat(fname, &dbstat->stattab[dbstat->no - 1]);
> 		free(fname);
> @@ -335,6 +342,8 @@
> 	    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && \
> (cli_strbcasestr(dent->d_name, ".db") || cli_strbcasestr(dent->d_name, ".db2") || \
> cli_strbcasestr(dent->d_name, ".cvd"))) { 
> fname = cli_calloc(strlen(dbstat->dir) + strlen(dent->d_name) + 2, sizeof(char));
> +		if(!fname)
> +		    return CL_EMEM;
> 		sprintf(fname, "%s/%s", dbstat->dir, dent->d_name);
> 		stat(fname, &sb);
> 		free(fname);
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/scanners.c \
>                 clamav-devel.jm-pl4/libclamav/scanners.c
> --- clamav-devel-jm4/libclamav/scanners.c	Thu May 13 13:12:35 2004
> +++ clamav-devel.jm-pl4/libclamav/scanners.c	Thu May 13 13:08:29 2004
> @@ -722,6 +722,10 @@
> 		if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..")) {
> 		    /* build the full name */
> 		    fname = cli_calloc(strlen(dirname) + strlen(dent->d_name) + 2, sizeof(char));
> +		    if(!fname) {
> +			closedir(dd);    
> +			return(CL_EMEM);
> +		    }
> 		    sprintf(fname, "%s/%s", dirname, dent->d_name);
> 
> 		    /* stat the file */
> @@ -769,6 +773,10 @@
> 
> 	for(i = 0; i < vba_project->count; i++) {
> 	    fullname = (char *) cli_malloc(strlen(vba_project->dir) + \
> strlen(vba_project->name[i]) + 2); +	    if(!fullname) {
> +		ret = CL_EMEM;
> +		break;
> +	    }
> 	    sprintf(fullname, "%s/%s", vba_project->dir, vba_project->name[i]);
> 	    fd = open(fullname, O_RDONLY);
> 	    if(fd == -1) {
> @@ -804,6 +812,10 @@
> } else if ((vba_project = (vba_project_t *) wm_dir_read(dirname))) {
> 	for (i = 0; i < vba_project->count; i++) {
> 		fullname = (char *) cli_malloc(strlen(vba_project->dir) + \
> strlen(vba_project->name[i]) + 2); +		if(!fullname) {
> +		    ret = CL_EMEM;
> +		    break;
> +		}
> 		sprintf(fullname, "%s/%s", vba_project->dir, vba_project->name[i]);
> 		fd = open(fullname, O_RDONLY);
> 		if(fd == -1) {
> @@ -847,6 +859,10 @@
> 		if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..")) {
> 		    /* build the full name */
> 		    fname = cli_calloc(strlen(dirname) + strlen(dent->d_name) + 2, sizeof(char));
> +		    if(!fname) {
> +			closedir(dd);
> +			return CL_EMEM;
> +		    }
> 		    sprintf(fname, "%s/%s", dirname, dent->d_name);
> 
> 		    /* stat the file */
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/str.c \
>                 clamav-devel.jm-pl4/libclamav/str.c
> --- clamav-devel-jm4/libclamav/str.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/str.c	Thu May 13 13:08:29 2004
> @@ -179,6 +179,8 @@
> 	return NULL;
> }
> buffer = malloc(j-i+1);
> +    if(!buffer)
> +	return NULL;
> strncpy(buffer, line+i, j-i);
> buffer[j-i] = '\0';
> 
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/unrarlib.c \
>                 clamav-devel.jm-pl4/libclamav/unrarlib.c
> --- clamav-devel-jm4/libclamav/unrarlib.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/unrarlib.c	Thu May 13 13:08:29 2004
> @@ -553,6 +553,12 @@
> if((void*)(*(DWORD*)list) == NULL)      /* first entry                  */
> {
> tmp_List = malloc(sizeof(ArchiveList_struct));
> +      if(!tmp_List) {
> +	  fclose(ArcPtr);
> +	  free(UnpMemory);
> +	  return FALSE;
> +      }
> +	  
> tmp_List->next = NULL;
> 
> (*(DWORD*)list) = (DWORD)tmp_List;
> @@ -560,11 +566,24 @@
> } else                                  /* add entry                    */
> {
> tmp_List->next = malloc(sizeof(ArchiveList_struct));
> +      if(!tmp_List) {
> +	  fclose(ArcPtr);
> +	  free(UnpMemory);
> +	  return FALSE;
> +      }
> +	  
> tmp_List = (ArchiveList_struct*) tmp_List->next;
> tmp_List->next = NULL;
> }
> 
> tmp_List->item.Name = malloc(NewLhd.NameSize + 1);
> +    if(!tmp_List->item.Name) {
> +	fclose(ArcPtr);
> +	free(UnpMemory);
> +	free(tmp_List);
> +	return FALSE;
> +    }
> +	  
> strcpy(tmp_List->item.Name, ArcFileName);
> tmp_List->item.NameSize = NewLhd.NameSize;
> tmp_List->item.PackSize = NewLhd.PackSize;
> diff -ur --exclude=*config* clamav-devel-jm4/libclamav/vba_extract.c \
>                 clamav-devel.jm-pl4/libclamav/vba_extract.c
> --- clamav-devel-jm4/libclamav/vba_extract.c	Thu May 13 13:12:18 2004
> +++ clamav-devel.jm-pl4/libclamav/vba_extract.c	Thu May 13 13:11:43 2004
> @@ -219,9 +219,10 @@
> 				continue;
> 			}
> 			buff = (unsigned char *) cli_malloc(10);
> -			if (cli_readn(fd, buff, 10) != 10) {
> +			if (!buff || (cli_readn(fd, buff, 10) != 10) ) {
> 				cli_errmsg("failed to read blob\n");
> -				free(buff);
> +				if(buff)
> +				    free(buff);
> 				free(name);
> 				close(fd);
> 				return FALSE;
> @@ -269,6 +270,8 @@
> 	cli_dbgmsg("in vba56_dir_read()\n");
> 
> 	fullname = (char *) cli_malloc(strlen(dir) + 15);
> +	if(!fullname)
> +	    return NULL;
> 	sprintf(fullname, "%s/_VBA_PROJECT", dir);
> fd = open(fullname, O_RDONLY);
> 
> @@ -424,10 +427,23 @@
> 	cli_dbgmsg("\nVBA Record count: %d\n", record_count);
> 	
> 	vba_project = (vba_project_t *) cli_malloc(sizeof(struct vba_project_tag));
> +	if(!vba_project) {
> +	    close(fd);
> +	    return NULL;
> +	}
> 	vba_project->name = (char **) cli_malloc(sizeof(char *) * record_count);
> +	if(vba_project->name) {
> +	    free(vba_project);
> +	    return NULL;
> +	}
> 	vba_project->dir = strdup(dir);
> 	vba_project->offset = (uint32_t *) cli_malloc (sizeof(uint32_t) *
> 					record_count);
> +	if(vba_project->offset) {
> +	    free(vba_project->name);
> +	    free(vba_project);
> +	    return NULL;
> +	}
> 	vba_project->count = record_count;
> 	for (i=0 ; i < record_count ; i++) {
> 		if (cli_readn(fd, &length, 2) != 2) {
> @@ -524,10 +540,16 @@
> {
> 	if (array->length == 0) {
> 		array->data = (unsigned char *) cli_malloc(len);
> +		if(!array->data)
> +		    return;
> 		array->length = len;
> 		memcpy(array->data, src, len);
> 	} else {
> -		array->data = realloc(array->data, array->length+len);
> +		void * p = NULL;
> +		p = realloc(array->data, array->length+len);
> +		if(!p)
> +		    return;
> +		array->data = p;
> 		memcpy(array->data+array->length, src, len);
> 		array->length += len;
> 	}
> @@ -1004,14 +1026,16 @@
> 
> 	offset_end += size;
> 	while (lseek(fd, 0, SEEK_CUR) < offset_end) {
> +		macro_extname_t * p = NULL;
> +		
> 		macro_extnames->count++;
> -		macro_extnames->macro_extname = (macro_extname_t *)
> -			cli_realloc(macro_extnames->macro_extname,
> +		p = (macro_extname_t *) cli_realloc(macro_extnames->macro_extname,
> 				sizeof(macro_extname_t) * macro_extnames->count);
> -		if (macro_extnames->macro_extname == NULL) {
> +		if (p == NULL) {
> 			cli_dbgmsg("read macro_extnames failed\n");
> 			goto abort;;
> 		}
> +		macro_extnames->macro_extname = p;
> 
> 		macro_extname = &macro_extnames->macro_extname[macro_extnames->count-1];
> 		if (is_unicode) {
> Only in clamav-devel.jm-pl4: target.h
> 
> 


-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
_______________________________________________
Clamav-devel mailing list
Clamav-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/clamav-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic