[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

aCaB acab at clamav.net
Sun Apr 4 01:01:02 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 1ae65c298a31c1b6b7b48f42edcda19acef9d00a
Author: aCaB <acab at clamav.net>
Date:   Sun Aug 23 21:21:13 2009 +0200

    wrap unneed, unneed in ishield - warning: code is buggy

diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 01bfa0e..1ddc56e 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -32,7 +32,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/mman.h>
-#include <stdlib.h>
 
 #include "others.h"
 #include "cltypes.h"
@@ -150,6 +149,7 @@ static void fmap_aging(struct F_MAP *m) {
     if(m->paged * m->pgsz > UNPAGE_THRSHLD_LO) { /* we alloc'd too much */
 	unsigned int i, avail = 0, *freeme;
 	freeme = cli_malloc(sizeof(unsigned int) * m->pages);
+	if(!freeme) return;
 	for(i=0; i<m->pages; i++) {
 	    uint32_t s = m->bitmap[i];
 	    if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == FM_MASK_PAGED ) {
@@ -189,15 +189,24 @@ static int fmap_readpage(struct F_MAP *m, unsigned int page, int lock) {
     if(s & FM_MASK_PAGED) {
 	/* page already paged */
 	if(lock) {
+	    /* we want locking */
 	    if(s & FM_MASK_LOCKED) {
 		/* page already locked */
 		s &= FM_MASK_COUNT;
-		if(s == FM_MASK_COUNT) /* lock count already at max: FIXME fail heavilly here */
+		if(s == FM_MASK_COUNT) { /* lock count already at max: fial! */
 		    cli_errmsg("fmap_readpage: lock count exceeded\n");
-		else /* acceptable lock count: inc lock count */
-		    m->bitmap[page]++;
+		    return 1;
+		}
+		/* acceptable lock count: inc lock count */
+		m->bitmap[page]++;
 	    } else /* page not currently locked: set lock count = 1 */
 		m->bitmap[page] = 1 | FM_MASK_LOCKED | FM_MASK_PAGED;
+	} else {
+	    /* we don't want locking */
+	    if(!(s & FM_MASK_LOCKED)) {
+		/* page is not locked: we reset aging to max */
+		m->bitmap[page] = FM_MASK_PAGED | FM_MASK_COUNT;
+	    }
 	}
 	return 0;
     }
@@ -313,7 +322,7 @@ void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
 }
 
 
-void fmap_unneed(struct F_MAP *m, unsigned int page) {
+static void fmap_unneed_page(struct F_MAP *m, unsigned int page) {
     uint32_t s = m->bitmap[page];
     if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == (FM_MASK_PAGED | FM_MASK_LOCKED)) {
 	/* page is paged and locked: check lock count */
@@ -330,6 +339,30 @@ void fmap_unneed(struct F_MAP *m, unsigned int page) {
     return;
 }
 
+void fmap_unneed_off(struct F_MAP *m, size_t at, size_t len) {
+    unsigned int i, first_page, last_page;
+    if(!len) {
+	cli_warnmsg("fmap_unneed: attempted void unneed\n");
+	return;
+    }
+
+    if(!CLI_ISCONTAINED(0, m->len, at, len)) {
+	cli_warnmsg("fmap: attempted oof need\n");
+	return;
+    }
+    
+    first_page = fmap_which_page(m, at);
+    last_page = fmap_which_page(m, at + len - 1);
+
+    for(i=first_page; i<=last_page; i++) {
+	fmap_unneed_page(m, i);
+    }
+}
+
+void fmap_unneed_ptr(struct F_MAP *m, void *ptr, size_t len) {
+    return fmap_unneed_off(m, (char *)ptr - (char *)m - m->hdrsz, len);
+}
+
 void fmunmap(struct F_MAP *m) {
     void *p = (void *)m;
     size_t len = m->pages * m->pgsz + m->hdrsz;
diff --git a/libclamav/fmap.h b/libclamav/fmap.h
index 265b31a..fa9889f 100644
--- a/libclamav/fmap.h
+++ b/libclamav/fmap.h
@@ -24,10 +24,11 @@
 struct F_MAP;
 
 struct F_MAP *fmap(int fd, off_t offset, size_t len);
-void *fmunmap(struct F_MAP *m);
+void fmunmap(struct F_MAP *m);
 void *fmap_need_off(struct F_MAP *m, size_t at, size_t len);
 void *fmap_need_off_once(struct F_MAP *m, size_t at, size_t len);
 void *fmap_need_ptr(struct F_MAP *m, void *ptr, size_t len);
 void *fmap_need_ptr_once(struct F_MAP *m, void *ptr, size_t len);
-void fmap_unneed(struct F_MAP *m, unsigned int page);
+void fmap_unneed_off(struct F_MAP *m, size_t at, size_t len);
+void fmap_unneed_ptr(struct F_MAP *m, void *ptr, size_t len);
 #endif
diff --git a/libclamav/htmlnorm.c b/libclamav/htmlnorm.c
index 66038f4..79cfdb8 100644
--- a/libclamav/htmlnorm.c
+++ b/libclamav/htmlnorm.c
@@ -186,7 +186,7 @@ static unsigned char *cli_readchunk(FILE *stream, m_area_t *m_area, unsigned int
 			return NULL;
 		}
 		if(m_area->map)
-		    ptr = (unsigned char *)fmap_need_off(m_area->map, m_area->offset, chunk_len); /* FIXME: make this need_once */
+		    ptr = (unsigned char *)fmap_need_off_once(m_area->map, m_area->offset, chunk_len);
 		else
 		    ptr = m_area->buffer + m_area->offset;
 		start = ptr;
@@ -216,7 +216,7 @@ static unsigned char *cli_readchunk(FILE *stream, m_area_t *m_area, unsigned int
 				ptr = start;
 			}
 			if(m_area->map)
-			    ptr = (unsigned char *)fmap_need_ptr(m_area->map, ptr, end - ptr); /* FIXME: make this need_once */
+			    ptr = (unsigned char *)fmap_need_ptr_once(m_area->map, ptr, end - ptr);
 			/* we have unknown number of NULL chars,
 			 * copy char-by-char and skip them */
 			while((ptr < end) && (chunk_len < max_len-1)) {
diff --git a/libclamav/ishield.c b/libclamav/ishield.c
index 33dc3de..76f9a35 100644
--- a/libclamav/ishield.c
+++ b/libclamav/ishield.c
@@ -531,6 +531,8 @@ static int is_parse_hdr(int desc, cli_ctx *ctx, struct IS_CABSTUFF *c) {
 	return CL_CLEAN;
     }
 
+    fmap_unneed_ptr(map, h1, sizeof(*h1));
+
 /*     cli_errmsg("COMPONENTS\n"); */
 /*     off = le32_to_host(objs->comps_off) + h1_data_off; */
 /*     for(i=1;  ; i++) { */
@@ -567,11 +569,12 @@ static int is_parse_hdr(int desc, cli_ctx *ctx, struct IS_CABSTUFF *c) {
 
     objs_files_cnt = le32_to_host(objs->files_cnt);
     off = h1_data_off + objs_dirs_off + le32_to_host(objs->dir_sz2);
+    fmap_unneed_ptr(map, objs, sizeof(*objs));
     for(i=0; i<objs_files_cnt ;i++) {
 	struct IS_FILEITEM *file = (struct IS_FILEITEM *)fmap_need_ptr(map, &hdr[off], sizeof(*file));
 
 	if(file) {
-	    const char *dir_name = "", *file_name = "";
+	    const char *emptyname = "", *dir_name = emptyname, *file_name = emptyname;
 	    uint32_t dir_rel = h1_data_off + objs_dirs_off + 4 * le32_to_host(file->dir_id); /* rel off of dir entry from array of rel ptrs */
 	    uint32_t file_rel = objs_dirs_off + h1_data_off + le32_to_host(file->str_name_off); /* rel off of fname */
 	    uint64_t file_stream_off, file_size, file_csize;
@@ -652,10 +655,15 @@ static int is_parse_hdr(int desc, cli_ctx *ctx, struct IS_CABSTUFF *c) {
 	    default:
 		cli_dbgmsg("is_parse_hdr: skipped unknown file entry %u\n", i);
 	    }
+	    if(file_name != emptyname)
+		fmap_unneed_ptr(map, file_name, strlen(file_name)+1);
+	    if(dir_name != emptyname)
+		fmap_unneed_ptr(map, dir_name, strlen(dir_name)+1);
 	} else {
 	    ret = CL_CLEAN;
 	    cli_dbgmsg("is_parse_hdr: FILEITEM out of bounds\n");
 	}
+	fmap_unneed_ptr(map, file, sizeof(*file));
 	off += sizeof(*file);
     }
     fmunmap(map);

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list