[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