From 81e57728597ec69acf08cb7897e9308452a31ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edvin?= Date: Tue, 14 Jun 2011 22:54:44 +0300 Subject: [PATCH] fix mem API of new fmap --- libclamav/fmap.c | 12 +++++++++--- libclamav/fmap.h | 17 ++++++++++++----- libclamav/scanners.c | 2 +- unit_tests/Makefile.am | 2 +- unit_tests/Makefile.in | 2 +- unit_tests/check_clamav.c | 27 +++++++++++++++++++-------- 6 files changed, 43 insertions(+), 19 deletions(-) diff --git a/libclamav/fmap.c b/libclamav/fmap.c index 8355a4c4e..767f2540e 100644 --- a/libclamav/fmap.c +++ b/libclamav/fmap.c @@ -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); } diff --git a/libclamav/fmap.h b/libclamav/fmap.h index da940e61e..a47992704 100644 --- a/libclamav/fmap.h +++ b/libclamav/fmap.h @@ -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 */ diff --git a/libclamav/scanners.c b/libclamav/scanners.c index 3da04443e..fd3babe31 100644 --- a/libclamav/scanners.c +++ b/libclamav/scanners.c @@ -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; } diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index f07fda294..c0f47b719 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -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 $< $@ diff --git a/unit_tests/Makefile.in b/unit_tests/Makefile.in index 9e4e5c908..d22003085 100644 --- a/unit_tests/Makefile.in +++ b/unit_tests/Makefile.in @@ -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 $< $@ diff --git a/unit_tests/check_clamav.c b/unit_tests/check_clamav.c index 0eb1cb716..64c879f87 100644 --- a/unit_tests/check_clamav.c +++ b/unit_tests/check_clamav.c @@ -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);