mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2026-05-19 05:46:50 -04:00
fix mem API of new fmap
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 $< $@
|
||||
|
||||
@@ -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 $< $@
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user