... | ... |
@@ -642,6 +642,7 @@ static void unmap_none(fmap_t *m) {} |
642 | 642 |
|
643 | 643 |
extern cl_fmap_t *cl_fmap_open_memory(const void *start, size_t len) |
644 | 644 |
{ |
645 |
+ int pgsz = cli_getpagesize(); |
|
645 | 646 |
cl_fmap_t *m = cli_calloc(1, sizeof(*m)); |
646 | 647 |
if (!m) { |
647 | 648 |
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) |
649 | 649 |
} |
650 | 650 |
m->data = start; |
651 | 651 |
m->len = len; |
652 |
+ m->pgsz = pgsz; |
|
653 |
+ m->pages = fmap_align_items(len, pgsz); |
|
652 | 654 |
m->unmap = unmap_none; |
653 | 655 |
m->need = mem_need; |
654 | 656 |
m->need_offstr = mem_need_offstr; |
655 | 657 |
m->gets = mem_gets; |
656 | 658 |
m->unneed_off = mem_unneed_off; |
659 |
+ return m; |
|
657 | 660 |
} |
658 | 661 |
|
659 | 662 |
|
660 | 663 |
static const void *mem_need(fmap_t *m, size_t at, size_t len, int lock) { /* WIN32 */ |
661 |
- if(!CLI_ISCONTAINED(0, m->len, at, len)) |
|
664 |
+ if(!len) { |
|
662 | 665 |
return NULL; |
663 |
- |
|
664 |
- if(!len) |
|
666 |
+ } |
|
667 |
+ if(!CLI_ISCONTAINED(0, m->len, at, len)) { |
|
665 | 668 |
return NULL; |
669 |
+ } |
|
670 |
+ |
|
666 | 671 |
return (void *)((char *)m->data + at); |
667 | 672 |
} |
668 | 673 |
|
... | ... |
@@ -86,14 +86,21 @@ static inline const void *fmap_need_off_once(fmap_t *m, size_t at, size_t len) |
86 | 86 |
return m->need(m, at, len, 0); |
87 | 87 |
} |
88 | 88 |
|
89 |
+static inline size_t fmap_ptr2off(const fmap_t *m, const void *ptr) |
|
90 |
+{ |
|
91 |
+ return m->data ? |
|
92 |
+ (const char*)ptr - (const char*)m->data |
|
93 |
+ :(const char*)ptr - (const char*)m - m->hdrsz; |
|
94 |
+} |
|
95 |
+ |
|
89 | 96 |
static inline const void *fmap_need_ptr(fmap_t *m, void *ptr, size_t len) |
90 | 97 |
{ |
91 |
- return m->need(m, (char *)ptr - (char *)m - m->hdrsz, len, 1); |
|
98 |
+ return m->need(m, fmap_ptr2off(m, ptr), len, 1); |
|
92 | 99 |
} |
93 | 100 |
|
94 | 101 |
static inline const void *fmap_need_ptr_once(fmap_t *m, void *ptr, size_t len) |
95 | 102 |
{ |
96 |
- return m->need(m, (char *)ptr - (char *)m - m->hdrsz, len, 0); |
|
103 |
+ return m->need(m, fmap_ptr2off(m, ptr), len, 0); |
|
97 | 104 |
} |
98 | 105 |
|
99 | 106 |
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) |
103 | 103 |
|
104 | 104 |
static inline void fmap_unneed_ptr(fmap_t *m, void *ptr, size_t len) |
105 | 105 |
{ |
106 |
- fmap_unneed_off(m, (char *)ptr - (char *)m - m->hdrsz, len); |
|
106 |
+ fmap_unneed_off(m, fmap_ptr2off(m, ptr), len); |
|
107 | 107 |
} |
108 | 108 |
|
109 | 109 |
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) |
125 | 125 |
|
126 | 126 |
static inline const void *fmap_need_str(fmap_t *m, void *ptr, size_t len_hint) |
127 | 127 |
{ |
128 |
- return m->need_offstr(m, (char *)ptr - (char *)m - m->hdrsz, len_hint); |
|
128 |
+ return m->need_offstr(m, fmap_ptr2off(m, ptr), len_hint); |
|
129 | 129 |
} |
130 | 130 |
|
131 | 131 |
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 |
153 | 153 |
|
154 | 154 |
static inline const void *fmap_need_ptr_once_len(fmap_t *m, const void *ptr, size_t len, size_t *lenout) |
155 | 155 |
{ |
156 |
- return fmap_need_off_once_len(m, (char*)ptr - (char*)m - m->hdrsz, len, lenout); |
|
156 |
+ return fmap_need_off_once_len(m, fmap_ptr2off(m, ptr), len, lenout); |
|
157 | 157 |
} |
158 | 158 |
|
159 | 159 |
/* deprecated */ |
... | ... |
@@ -43,7 +43,7 @@ check_clamd_SOURCES = check_clamav_skip.c |
43 | 43 |
check_clamav_SOURCES = check_clamav_skip.c |
44 | 44 |
endif |
45 | 45 |
|
46 |
-check_clamav.o: check_clamav.c $(top_builddir)/test/clam.exe clamav.hdb |
|
46 |
+check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb |
|
47 | 47 |
|
48 | 48 |
clamav.hdb: input/clamav.hdb |
49 | 49 |
cp $< $@ |
... | ... |
@@ -1097,7 +1097,7 @@ check10_clamd_hg.sh: $(FILES) |
1097 | 1097 |
$(FILES) : |
1098 | 1098 |
cat $(SPLIT_DIR)/split.$@aa $(SPLIT_DIR)/split.$@ab > $@ |
1099 | 1099 |
|
1100 |
-check_clamav.o: check_clamav.c $(top_builddir)/test/clam.exe clamav.hdb |
|
1100 |
+check_clamav.c: $(top_builddir)/test/clam.exe clamav.hdb |
|
1101 | 1101 |
|
1102 | 1102 |
clamav.hdb: input/clamav.hdb |
1103 | 1103 |
cp $< $@ |
... | ... |
@@ -190,6 +190,8 @@ static void init_testfiles(void) |
190 | 190 |
fail_unless(!!d, "opendir"); |
191 | 191 |
if (!d) |
192 | 192 |
return; |
193 |
+ testfiles = NULL; |
|
194 |
+ testfiles_n = 0; |
|
193 | 195 |
while ((dirent = readdir(d))) { |
194 | 196 |
if (strncmp(dirent->d_name, "clam", 4)) |
195 | 197 |
continue; |
... | ... |
@@ -210,19 +212,25 @@ static void free_testfiles(void) |
210 | 210 |
free(testfiles[i]); |
211 | 211 |
} |
212 | 212 |
free(testfiles); |
213 |
+ testfiles = NULL; |
|
214 |
+ testfiles_n = 0; |
|
213 | 215 |
} |
214 | 216 |
|
215 | 217 |
static struct cl_engine *g_engine; |
218 |
+static int inited = 0; |
|
216 | 219 |
|
217 | 220 |
static void engine_setup(void) |
218 | 221 |
{ |
219 | 222 |
unsigned int sigs = 0; |
223 |
+ const char *hdb = OBJDIR"/clamav.hdb"; |
|
220 | 224 |
|
221 | 225 |
init_testfiles(); |
222 |
- fail_unless(cl_init(CL_INIT_DEFAULT) == 0, "cl_init"); |
|
226 |
+ if (!inited) |
|
227 |
+ fail_unless(cl_init(CL_INIT_DEFAULT) == 0, "cl_init"); |
|
228 |
+ inited = 1; |
|
223 | 229 |
g_engine = cl_engine_new(); |
224 | 230 |
fail_unless(!!g_engine, "engine"); |
225 |
- fail_unless(cl_load(OBJDIR"/clamav.hdb", g_engine, &sigs, CL_DB_STDOPT) == 0, "cl_load"); |
|
231 |
+ fail_unless_fmt(cl_load(hdb, g_engine, &sigs, CL_DB_STDOPT) == 0, "cl_load %s", hdb); |
|
226 | 232 |
fail_unless(sigs == 1, "sigs"); |
227 | 233 |
fail_unless(cl_engine_compile(g_engine) == 0, "cl_engine_compile"); |
228 | 234 |
} |
... | ... |
@@ -244,7 +252,7 @@ START_TEST (test_cl_scanmap_callback_handle) |
244 | 244 |
char file[256]; |
245 | 245 |
struct stat st; |
246 | 246 |
const char *virname = NULL; |
247 |
- unsigned long int scanned; |
|
247 |
+ unsigned long int scanned = 0; |
|
248 | 248 |
cl_fmap_t *map; |
249 | 249 |
int ret; |
250 | 250 |
|
... | ... |
@@ -258,10 +266,12 @@ START_TEST (test_cl_scanmap_callback_handle) |
258 | 258 |
map = cl_fmap_open_handle(&fd, 0, st.st_size, pread_cb, 1); |
259 | 259 |
fail_unless(!!map, "cl_fmap_open_handle"); |
260 | 260 |
|
261 |
+ cli_dbgmsg("scanning (handle) %s\n", file); |
|
261 | 262 |
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL); |
263 |
+ cli_dbgmsg("scan end (handle) %s\n", file); |
|
264 |
+ |
|
262 | 265 |
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret)); |
263 |
- fail_unless(scanned > 0, "scanned"); |
|
264 |
- fail_unless_fmt(!strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); |
|
266 |
+ fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname); |
|
265 | 267 |
close(fd); |
266 | 268 |
} |
267 | 269 |
END_TEST |
... | ... |
@@ -272,7 +282,7 @@ START_TEST (test_cl_scanmap_callback_mem) |
272 | 272 |
char file[256]; |
273 | 273 |
struct stat st; |
274 | 274 |
const char *virname = NULL; |
275 |
- unsigned long int scanned; |
|
275 |
+ unsigned long int scanned = 0; |
|
276 | 276 |
cl_fmap_t *map; |
277 | 277 |
int ret; |
278 | 278 |
void *mem; |
... | ... |
@@ -291,10 +301,11 @@ START_TEST (test_cl_scanmap_callback_mem) |
291 | 291 |
map = cl_fmap_open_memory(mem, st.st_size); |
292 | 292 |
fail_unless(!!map, "cl_fmap_open_mem"); |
293 | 293 |
|
294 |
+ cli_dbgmsg("scanning (mem) %s\n", file); |
|
294 | 295 |
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL); |
296 |
+ cli_dbgmsg("scan end (mem) %s\n", file); |
|
295 | 297 |
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret)); |
296 |
- fail_unless(scanned > 0, "scanned %d for %s", scanned, virname); |
|
297 |
- fail_unless_fmt(!strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file); |
|
298 |
+ fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file); |
|
298 | 299 |
close(fd); |
299 | 300 |
|
300 | 301 |
munmap(mem, st.st_size); |