[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