[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 00:59:57 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit db84a7e286971d48b91f98f2f7790c3ab7b7474e
Author: aCaB <acab at clamav.net>
Date:   Thu Aug 20 01:07:33 2009 +0200

    fmap_need, paged read

diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 249dcb4..d29e815 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -29,15 +29,22 @@
 #include <unistd.h>
 
 #include "others.h"
+#include "cltypes.h"
+
+#define FM_MASK_SCORE 0x0x3FFF
+#define FM_MASK_PAGED 0x4000
+#define FM_MASK_SEEN 0x8000
+#define FM_SCORE 8
 
 struct F_MAP {
     int fd;
     time_t mtime;
-    off_t offset;
+    size_t offset;
     size_t len;
     unsigned int pages;
     unsigned int hdrsz;
-    unsigned char bitmap[];
+    unsigned int pgsz;
+    uint16_t bitmap[];
 };
 
 
@@ -49,6 +56,33 @@ static unsigned int fmap_align_to(unsigned int sz, unsiggned int al) {
     return al * fmap_align_items(sz, al);
 }
 
+static unsigned int fmap_which_page(struct F_MAP *m, size_t at) {
+    return at / m->pgsz;
+}
+
+static unsigned int fmap_is_paged(struct F_MAP *m, unsigned int page) {
+    uint16_t s = m->bitmap[page];
+    return ((s & FM_MASK_PAGED) != 0);
+}
+
+static unsigned int fmap_is_seen(struct F_MAP *m, unsigned int page) {
+    uint16_t s = m->bitmap[page];
+    return ((s & FM_MASK_SEEN) != 0);
+}
+
+static unsigned int fmap_inc_paged(struct F_MAP *m, unsigned int page) {
+    uint16_t s = m->bitmap[page] & FM_MASK_SCORE;
+    if(s < FM_MASK_SCORE - FM_SCORE)
+	m->bitmap[page] += FM_SCORE;
+    else
+	m->bitmap[page] |= FM_MASK_SCORE;
+}
+
+static unsigned int fmap_dec_paged(struct F_MAP *m, unsigned int page) {
+    uint16_t s = m->bitmap[page] & FM_MASK_SCORE;
+    if(s) s->bitmap[page]--;
+}
+
 struct F_MAP *fmap(int fd, off_t offset, size_t len) {
     unsigned int pages, mapsz, hdrsz;
     int pgsz = cli_getpagesize();
@@ -73,7 +107,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) + fmap_align_items(2 * pages, 8), 16);
+    hdrsz = fmap_align_to(sizeof(struct F_MAP) + pages * sizeof(uint16_t), 16);
     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");
@@ -85,6 +119,52 @@ struct F_MAP *fmap(int fd, off_t offset, size_t len) {
     m->len = len;
     m->pages = pages;
     m->hdrsz = hdrsz;
+    m->pgsz = pgsz;
     memset(m->bitmap, 0, fmap_align_items(2 * pages, 8));
     return m;
 }
+
+static int fmap_readpage(struct F_MAP *m, unsigned int page) {
+    size_t readsz;
+    char *pptr;
+
+    fmap_inc_page(m, page);
+    if(fmap_is_paged(m, page))
+	return 0;
+    pptr = (char *)m;
+    pptr += page * m->pgsz + m->hdrsz;
+    if(page == m->pages - 1)
+	readsz = m->len % m->pgsz;
+    else
+	readsz = m->pgsz;
+    if(pread(m->fd, pptr, m->pgsz, m->offset + page * m->pgsz) != readsz)
+	return 1;
+    return 0;
+}
+
+void *fmap_need(struct F_MAP *m, size_t at, size_t len) {
+    unsigned int i, first_page, last_page;
+    char *ret;
+
+    if(!len) {
+	cli_warnmsg("fmap: attempted void need\n");
+	return NULL;
+    }
+
+    if(!CLI_ISCONTAINED(0, m->len, at, len)) {
+	cli_warnmsg("fmap: attempted oof need\n");
+	return NULL;
+    }
+    
+    first_page = fmap_which_page(m, at);
+    last_page = fmap_which_page(m, at + len);    
+
+    for(i=first_page; i<=last_page; i++) {
+	if(fmap_readpage(m, i))
+	    return NULL;
+    }
+    ret = (char *)m;
+    ret += at + m->hdrsz;
+    return (void *)ret;
+}
+

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list