fix mem API of new fmap

This commit is contained in:
Török Edvin
2011-06-14 22:54:44 +03:00
parent 62ee12b2f8
commit 81e5772859
6 changed files with 43 additions and 19 deletions

View File

@@ -642,6 +642,7 @@ static void unmap_none(fmap_t *m) {}
extern cl_fmap_t *cl_fmap_open_memory(const void *start, size_t len)
{
int pgsz = cli_getpagesize();
cl_fmap_t *m = cli_calloc(1, sizeof(*m));
if (!m) {
cli_warnmsg("fmap: map allocation failed\n");
@@ -649,20 +650,25 @@ extern cl_fmap_t *cl_fmap_open_memory(const void *start, size_t len)
}
m->data = start;
m->len = len;
m->pgsz = pgsz;
m->pages = fmap_align_items(len, pgsz);
m->unmap = unmap_none;
m->need = mem_need;
m->need_offstr = mem_need_offstr;
m->gets = mem_gets;
m->unneed_off = mem_unneed_off;
return m;
}
static const void *mem_need(fmap_t *m, size_t at, size_t len, int lock) { /* WIN32 */
if(!CLI_ISCONTAINED(0, m->len, at, len))
if(!len) {
return NULL;
}
if(!CLI_ISCONTAINED(0, m->len, at, len)) {
return NULL;
}
if(!len)
return NULL;
return (void *)((char *)m->data + at);
}

View File

@@ -86,14 +86,21 @@ static inline const void *fmap_need_off_once(fmap_t *m, size_t at, size_t len)
return m->need(m, at, len, 0);
}
static inline size_t fmap_ptr2off(const fmap_t *m, const void *ptr)
{
return m->data ?
(const char*)ptr - (const char*)m->data
:(const char*)ptr - (const char*)m - m->hdrsz;
}
static inline const void *fmap_need_ptr(fmap_t *m, void *ptr, size_t len)
{
return m->need(m, (char *)ptr - (char *)m - m->hdrsz, len, 1);
return m->need(m, fmap_ptr2off(m, ptr), len, 1);
}
static inline const void *fmap_need_ptr_once(fmap_t *m, void *ptr, size_t len)
{
return m->need(m, (char *)ptr - (char *)m - m->hdrsz, len, 0);
return m->need(m, fmap_ptr2off(m, ptr), len, 0);
}
static inline void fmap_unneed_off(fmap_t *m, size_t at, size_t len)
@@ -103,7 +110,7 @@ static inline void fmap_unneed_off(fmap_t *m, size_t at, size_t len)
static inline void fmap_unneed_ptr(fmap_t *m, void *ptr, size_t len)
{
fmap_unneed_off(m, (char *)ptr - (char *)m - m->hdrsz, len);
fmap_unneed_off(m, fmap_ptr2off(m, ptr), len);
}
static inline int fmap_readn(fmap_t *m, void *dst, size_t at, size_t len)
@@ -125,7 +132,7 @@ static inline int fmap_readn(fmap_t *m, void *dst, size_t at, size_t len)
static inline const void *fmap_need_str(fmap_t *m, void *ptr, size_t len_hint)
{
return m->need_offstr(m, (char *)ptr - (char *)m - m->hdrsz, len_hint);
return m->need_offstr(m, fmap_ptr2off(m, ptr), len_hint);
}
static inline const void *fmap_need_offstr(fmap_t *m, size_t at, size_t len_hint)
@@ -153,7 +160,7 @@ static inline const void *fmap_need_off_once_len(fmap_t *m, size_t at, size_t le
static inline const void *fmap_need_ptr_once_len(fmap_t *m, const void *ptr, size_t len, size_t *lenout)
{
return fmap_need_off_once_len(m, (char*)ptr - (char*)m - m->hdrsz, len, lenout);
return fmap_need_off_once_len(m, fmap_ptr2off(m, ptr), len, lenout);
}
/* deprecated */

View File

@@ -2549,7 +2549,7 @@ static int cli_map_scandesc(cl_fmap_t *map, cli_ctx *ctx)
ret = magic_scandesc(ctx, CL_TYPE_ANY);
*ctx->fmap--;
ctx->fmap--;
return ret;
}

View File

@@ -43,7 +43,7 @@ check_clamd_SOURCES = check_clamav_skip.c
check_clamav_SOURCES = check_clamav_skip.c
endif
check_clamav.o: check_clamav.c $(top_builddir)/test/clam.exe clamav.hdb
check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb
clamav.hdb: input/clamav.hdb
cp $< $@

View File

@@ -1097,7 +1097,7 @@ check10_clamd_hg.sh: $(FILES)
$(FILES) :
cat $(SPLIT_DIR)/split.$@aa $(SPLIT_DIR)/split.$@ab > $@
check_clamav.o: check_clamav.c $(top_builddir)/test/clam.exe clamav.hdb
check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb
clamav.hdb: input/clamav.hdb
cp $< $@

View File

@@ -190,6 +190,8 @@ static void init_testfiles(void)
fail_unless(!!d, "opendir");
if (!d)
return;
testfiles = NULL;
testfiles_n = 0;
while ((dirent = readdir(d))) {
if (strncmp(dirent->d_name, "clam", 4))
continue;
@@ -210,19 +212,25 @@ static void free_testfiles(void)
free(testfiles[i]);
}
free(testfiles);
testfiles = NULL;
testfiles_n = 0;
}
static struct cl_engine *g_engine;
static int inited = 0;
static void engine_setup(void)
{
unsigned int sigs = 0;
const char *hdb = OBJDIR"/clamav.hdb";
init_testfiles();
fail_unless(cl_init(CL_INIT_DEFAULT) == 0, "cl_init");
if (!inited)
fail_unless(cl_init(CL_INIT_DEFAULT) == 0, "cl_init");
inited = 1;
g_engine = cl_engine_new();
fail_unless(!!g_engine, "engine");
fail_unless(cl_load(OBJDIR"/clamav.hdb", g_engine, &sigs, CL_DB_STDOPT) == 0, "cl_load");
fail_unless_fmt(cl_load(hdb, g_engine, &sigs, CL_DB_STDOPT) == 0, "cl_load %s", hdb);
fail_unless(sigs == 1, "sigs");
fail_unless(cl_engine_compile(g_engine) == 0, "cl_engine_compile");
}
@@ -244,7 +252,7 @@ START_TEST (test_cl_scanmap_callback_handle)
char file[256];
struct stat st;
const char *virname = NULL;
unsigned long int scanned;
unsigned long int scanned = 0;
cl_fmap_t *map;
int ret;
@@ -258,10 +266,12 @@ START_TEST (test_cl_scanmap_callback_handle)
map = cl_fmap_open_handle(&fd, 0, st.st_size, pread_cb, 1);
fail_unless(!!map, "cl_fmap_open_handle");
cli_dbgmsg("scanning (handle) %s\n", file);
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
cli_dbgmsg("scan end (handle) %s\n", file);
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
fail_unless(scanned > 0, "scanned");
fail_unless_fmt(!strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
close(fd);
}
END_TEST
@@ -272,7 +282,7 @@ START_TEST (test_cl_scanmap_callback_mem)
char file[256];
struct stat st;
const char *virname = NULL;
unsigned long int scanned;
unsigned long int scanned = 0;
cl_fmap_t *map;
int ret;
void *mem;
@@ -291,10 +301,11 @@ START_TEST (test_cl_scanmap_callback_mem)
map = cl_fmap_open_memory(mem, st.st_size);
fail_unless(!!map, "cl_fmap_open_mem");
cli_dbgmsg("scanning (mem) %s\n", file);
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
cli_dbgmsg("scan end (mem) %s\n", file);
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
fail_unless(scanned > 0, "scanned %d for %s", scanned, virname);
fail_unless_fmt(!strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file);
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file);
close(fd);
munmap(mem, st.st_size);