[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:07 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit f52b5724b41206a8d303d06e595c5792ac0aa55a
Author: aCaB <acab at clamav.net>
Date:   Mon Aug 24 10:17:45 2009 +0200

    fmap some fixes

diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 1ddc56e..462e141 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -47,7 +47,7 @@
 11 -    N/A   -   paged   - locked
 */
 
-/* FIXME: tune shis stuff */
+/* FIXME: tune this stuff */
 #define UNPAGE_THRSHLD_HI 1*1024*1024
 #define UNPAGE_THRSHLD_LO 4*1024*1024
 
@@ -101,7 +101,7 @@ struct F_MAP *fmap(int fd, off_t offset, size_t len) {
 	return NULL;
     }
     pages = fmap_align_items(len, pgsz);
-    hdrsz = fmap_align_to(sizeof(struct F_MAP) + pages * sizeof(uint16_t), pgsz);
+    hdrsz = fmap_align_to(sizeof(struct F_MAP) + pages * sizeof(uint32_t), pgsz);
     mapsz = pages * pgsz + hdrsz;
     if ((m = (struct F_MAP *)mmap(NULL, mapsz, PROT_READ | PROT_WRITE, MAP_PRIVATE|ANONYMOUS_MAP, -1, 0)) == MAP_FAILED) {
 	cli_warnmsg("fmap: mmap() failed\n");
@@ -115,7 +115,8 @@ struct F_MAP *fmap(int fd, off_t offset, size_t len) {
     m->hdrsz = hdrsz;
     m->pgsz = pgsz;
     m->paged = 0;
-    memset(m->bitmap, 0, fmap_align_items(2 * pages, 8));
+    memset(m->bitmap, 0, sizeof(uint32_t) * pages);
+    cli_errmsg("FMAPDBG: created %p - len %u pages %u hdrsz %u\n", m, len, pages, hdrsz);
     return m;
 }
 
@@ -257,36 +258,41 @@ static void *fmap_need(struct F_MAP *m, size_t at, size_t len, int lock) {
 	cli_warnmsg("fmap: attempted oof need\n");
 	return NULL;
     }
-    
+
+    fmap_aging(m);
+
     first_page = fmap_which_page(m, at);
     last_page = fmap_which_page(m, at + len - 1);
 
+    cli_errmsg("FMAPDBG: +++ map %p - len %u lock: %d (page %u to %u)\n", m, len, lock, first_page, last_page);
+
     for(i=first_page; i<=last_page; i++) {
 	if(fmap_readpage(m, i, lock))
 	    return NULL;
     }
 
-    fmap_aging(m);
-
     ret = (char *)m;
     ret += at + m->hdrsz;
     return (void *)ret;
 }
 
 void *fmap_need_off(struct F_MAP *m, size_t at, size_t len) {
+    cli_errmsg("FMAPDBG: need_off map %p at %u len %u\n", m, at, len);
     return fmap_need(m, at, len, 1);
 }
 void *fmap_need_off_once(struct F_MAP *m, size_t at, size_t len) {
+    cli_errmsg("FMAPDBG: need_off_once map %p at %u len %u\n", m, at, len);
     return fmap_need(m, at, len, 0);
 }
 void *fmap_need_ptr(struct F_MAP *m, void *ptr, size_t len) {
+    cli_errmsg("FMAPDBG: need_ptr map %p at %p len %u\n", m, ptr, len);
     return fmap_need_off(m, (char *)ptr - (char *)m - m->hdrsz, len);
 }
 void *fmap_need_ptr_once(struct F_MAP *m, void *ptr, size_t len) {
+    cli_errmsg("FMAPDBG: need_ptr_once map %p at %p len %u\n", m, ptr, len);
     return fmap_need_off_once(m, (char *)ptr - (char *)m - m->hdrsz, len);
 }
 
-/* FIXME: unneeding a string is trickier */
 void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
     const size_t at = (char *)ptr - (char *)m - m->hdrsz;
     unsigned int i, first_page, last_page;
@@ -299,13 +305,16 @@ void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
 	return NULL;
     }
 
+    cli_errmsg("FMAPDBG: need_str map %p at %p len %u\n", m, ptr, len);
     first_page = fmap_which_page(m, at);
     last_page = fmap_which_page(m, at + len - 1);
 
     for(i=first_page; i<=last_page; i++) {
-	char *thispage = (char *)m + m->hdrsz;
+	char *thispage = (char *)m + m->hdrsz + i * m->pgsz;
 	unsigned int scanat, scansz;
-	
+
+	cli_errmsg("FMAPDBG: +s+ map %p - (page %u)\n", m, i);
+
 	if(fmap_readpage(m, i, 1))
 	    return NULL;
 	if(i == first_page) {
@@ -313,7 +322,7 @@ void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
 	    scansz = m->pgsz - scanat;
 	} else {
 	    scanat = 0;
-	    scansz = m->pgsz - scanat;
+	    scansz = m->pgsz;
 	}
 	if(memchr(&thispage[scanat], 0, scansz))
 	    return ptr;
@@ -324,6 +333,9 @@ void *fmap_need_str(struct F_MAP *m, void *ptr, size_t len) {
 
 static void fmap_unneed_page(struct F_MAP *m, unsigned int page) {
     uint32_t s = m->bitmap[page];
+
+    cli_errmsg("FMAPDBG: --- map %p - page %u status %u count %u\n", m, page, s>>30, s & FM_MASK_COUNT);
+
     if((s & (FM_MASK_PAGED | FM_MASK_LOCKED)) == (FM_MASK_PAGED | FM_MASK_LOCKED)) {
 	/* page is paged and locked: check lock count */
 	s &= FM_MASK_COUNT;
@@ -350,7 +362,9 @@ void fmap_unneed_off(struct F_MAP *m, size_t at, size_t len) {
 	cli_warnmsg("fmap: attempted oof need\n");
 	return;
     }
-    
+
+    cli_errmsg("FMAPDBG: unneed_off map %p at %u len %u\n", m, at, len);
+
     first_page = fmap_which_page(m, at);
     last_page = fmap_which_page(m, at + len - 1);
 
@@ -360,6 +374,7 @@ 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) {
+    cli_errmsg("FMAPDBG: unneed_ptr map %p at %p len %u\n", m, ptr, len);
     return fmap_unneed_off(m, (char *)ptr - (char *)m - m->hdrsz, len);
 }
 
diff --git a/libclamav/ishield.c b/libclamav/ishield.c
index 76f9a35..57662da 100644
--- a/libclamav/ishield.c
+++ b/libclamav/ishield.c
@@ -582,7 +582,7 @@ static int is_parse_hdr(int desc, cli_ctx *ctx, struct IS_CABSTUFF *c) {
 
 	    memcpy(hash, file->md5, 16);
 	    md5str((uint8_t *)hash);
-	    if(fmap_need_ptr(map, &hdr[dir_rel], 4)) {
+	    if(fmap_need_ptr_once(map, &hdr[dir_rel], 4)) {
 		dir_rel = cli_readint32(&hdr[dir_rel]) + h1_data_off + objs_dirs_off;
 		if(fmap_need_str(map, &hdr[dir_rel], c->hdrsz - dir_rel))
 		    dir_name = &hdr[dir_rel];
@@ -659,11 +659,11 @@ static int is_parse_hdr(int desc, cli_ctx *ctx, struct IS_CABSTUFF *c) {
 		fmap_unneed_ptr(map, file_name, strlen(file_name)+1);
 	    if(dir_name != emptyname)
 		fmap_unneed_ptr(map, dir_name, strlen(dir_name)+1);
+	    fmap_unneed_ptr(map, file, sizeof(*file));
 	} 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