Browse code

fix mem API of new fmap

Török Edvin authored on 2011/06/15 04:54:44
Showing 6 changed files
... ...
@@ -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 */
... ...
@@ -2549,7 +2549,7 @@ static int cli_map_scandesc(cl_fmap_t *map, cli_ctx *ctx)
2549 2549
 
2550 2550
     ret = magic_scandesc(ctx, CL_TYPE_ANY);
2551 2551
 
2552
-    *ctx->fmap--;
2552
+    ctx->fmap--;
2553 2553
     return ret;
2554 2554
 }
2555 2555
 
... ...
@@ -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);