fmap some fixes

0.96
aCaB 17 years ago
parent 1ae65c298a
commit f52b5724b4
  1. 37
      libclamav/fmap.c
  2. 4
      libclamav/ishield.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);
}

@ -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);

Loading…
Cancel
Save