Browse code

(hoepfully) completed db load, regexes and hashes missing need to recheck strlen(hex2string) bugs, need to figure how to hangle regexes and hashes: edwiiiiiiin!!! :D

git-svn-id: file:///var/lib/svn/clamav-devel/branches/mpool@4268 77e5149b-7576-45b1-b177-96237e5ba77b

aCaB authored on 2008/10/18 09:16:23
Showing 9 changed files
... ...
@@ -1,6 +1,5 @@
1 1
 TBD
2 2
 - engine->root[x]->ac_lsigtable and childreen
3
-- engine->md5_hdb
4 3
 - engine->md5_mdb + soff + md5_sizes
5 4
 - engine->md5_fp
6 5
 - engine->zip_mlist
... ...
@@ -10,3 +9,6 @@ TBD
10 10
 - engine->ftypes
11 11
 - engine->ignored
12 12
 
13
+- pchk->preg_numeric ??
14
+- load_regex_matcher
15
+- hashset_init / hashset_addkey / ??
13 16
\ No newline at end of file
... ...
@@ -30,6 +30,10 @@
30 30
 #include "others.h"
31 31
 #include "hashtab.h"
32 32
 
33
+#ifdef USE_MPOOL
34
+#include "mpool.h"
35
+#endif
36
+
33 37
 #define MODULE_NAME "hashtab: "
34 38
 
35 39
 static const char DELETED_KEY[] = "";
... ...
@@ -168,7 +172,11 @@ static inline void PROFILE_REPORT(const struct hashtable *s)
168 168
 #define PROFILE_REPORT(s)
169 169
 #endif
170 170
 
171
+#ifdef USE_MPOOL
172
+int hashtab_init(struct hashtable *s,size_t capacity, mpool_t *mempool)
173
+#else
171 174
 int hashtab_init(struct hashtable *s,size_t capacity)
175
+#endif
172 176
 {
173 177
 	if(!s)
174 178
 		return CL_ENULLARG;
... ...
@@ -176,7 +184,11 @@ int hashtab_init(struct hashtable *s,size_t capacity)
176 176
 	PROFILE_INIT(s);
177 177
 
178 178
 	capacity = nearest_power(capacity);
179
+#ifdef USE_MPOOL
180
+	s->htable = mpool_calloc(mempool, capacity,sizeof(*s->htable), NULL);
181
+#else
179 182
 	s->htable = cli_calloc(capacity,sizeof(*s->htable));
183
+#endif
180 184
 	if(!s->htable)
181 185
 		return CL_EMEM;
182 186
 	s->capacity = capacity;
... ...
@@ -25,6 +25,11 @@
25 25
 #include <stdio.h>
26 26
 #include <stddef.h>
27 27
 #include "cltypes.h"
28
+
29
+#ifdef USE_MPOOL
30
+#include "mpool.h"
31
+#endif
32
+
28 33
 typedef long element_data;
29 34
 
30 35
 /* define this for debugging/profiling purposes only, NOT in production/release code */
... ...
@@ -78,7 +83,11 @@ struct hashtable {
78 78
 
79 79
 int hashtab_generate_c(const struct hashtable *s,const char* name);
80 80
 struct element* hashtab_find(const struct hashtable *s, const char* key, const size_t len);
81
+#ifdef USE_MPOOL
82
+int hashtab_init(struct hashtable *s,size_t capacity, mpool_t *mempool);
83
+#else
81 84
 int hashtab_init(struct hashtable *s,size_t capacity);
85
+#endif
82 86
 const struct element* hashtab_insert(struct hashtable *s, const char* key, const size_t len, const element_data data);
83 87
 void hashtab_delete(struct hashtable *s,const char* key,const size_t len);
84 88
 void hashtab_clear(struct hashtable *s);
... ...
@@ -1445,7 +1445,7 @@ int cli_ac_addsig(struct cli_matcher *root, const char *virname, const char *hex
1445 1445
     } else new->pattern = NULL;
1446 1446
 }
1447 1447
 #else
1448
-    new->pattern = cli_hex2ui(hex ? hex : hexsig)
1448
+    new->pattern = cli_hex2ui(hex ? hex : hexsig);
1449 1449
 #endif
1450 1450
 
1451 1451
     if(new->pattern == NULL) {
... ...
@@ -85,7 +85,9 @@ struct cli_matcher {
85 85
 
86 86
     uint16_t maxpatlen;
87 87
     uint8_t ac_only;
88
-    mpool_t mempool;
88
+#ifdef USE_MPOOL
89
+	mpool_t *mempool;
90
+#endif
89 91
 };
90 92
 
91 93
 struct cli_meta_node {
... ...
@@ -45,6 +45,10 @@
45 45
 #include "phish_whitelist.h"
46 46
 #include "regex_list.h"
47 47
 
48
+#ifdef USE_MPOOL
49
+#include "mpool.h"
50
+#endif
51
+
48 52
 int whitelist_match(const struct cl_engine* engine,char* real_url,const char* display_url,int hostOnly)
49 53
 {
50 54
 	const char* info;/*unused*/
... ...
@@ -55,7 +59,12 @@ int whitelist_match(const struct cl_engine* engine,char* real_url,const char* di
55 55
 int init_whitelist(struct cl_engine* engine)
56 56
 {
57 57
 	if(engine) {
58
+#ifdef USE_MPOOL
59
+		engine->whitelist_matcher = (struct regex_matcher *) mpool_malloc(engine->mempool, sizeof(struct regex_matcher), NULL);
60
+		engine->whitelist_matcher->mempool = engine->mempool;
61
+#else
58 62
 		engine->whitelist_matcher = (struct regex_matcher *) cli_malloc(sizeof(struct regex_matcher));
63
+#endif
59 64
 		if(!engine->whitelist_matcher)
60 65
 			return CL_EMEM;
61 66
 		return	init_regex_list(engine->whitelist_matcher);
... ...
@@ -302,8 +302,8 @@ int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hex
302 302
     } else bm_new->pattern = NULL;
303 303
 }
304 304
 #else
305
-        bm_new->pattern = (unsigned char *) cli_hex2str(hexsig)
306
-#end
305
+        bm_new->pattern = (unsigned char *) cli_hex2str(hexsig);
306
+#endif
307 307
 	if(!bm_new->pattern) {
308 308
 #ifdef USE_MPOOL
309 309
 	    mpool_free(root->mempool, bm_new);
... ...
@@ -326,7 +326,7 @@ int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hex
326 326
 }
327 327
 #else
328 328
 	bm_new->virname = cli_virname((char *) virname, options & CL_DB_OFFICIAL, 0);
329
-#end
329
+#endif
330 330
 	if(!bm_new->virname) {
331 331
 #ifdef USE_MPOOL
332 332
 	    mpool_free(root->mempool, bm_new->pattern);
... ...
@@ -1064,20 +1064,32 @@ static int cli_loadldb(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1064 1064
 	}
1065 1065
 
1066 1066
 	root = (*engine)->root[tdb.target[0]];
1067
-
1067
+#ifdef USE_MPOOL
1068
+	lsig = (struct cli_ac_lsig *) mpool_calloc((*engine)->mempool, 1, sizeof(struct cli_ac_lsig), NULL);
1069
+#else
1068 1070
 	lsig = (struct cli_ac_lsig *) cli_calloc(1, sizeof(struct cli_ac_lsig));
1071
+#endif
1069 1072
 	if(!lsig) {
1070 1073
 	    cli_errmsg("cli_loadldb: Can't allocate memory for lsig\n");
1071 1074
 	    FREE_TDB(tdb);
1072 1075
 	    ret = CL_EMEM;
1073 1076
 	    break;
1074 1077
 	}
1078
+#ifdef USE_MPOOL
1079
+	if((lsig->logic = mpool_alloc((*engine)->mempool, strlen(logic)+1, NULL)))
1080
+	    strcpy(lsig->logic, logic);
1081
+#else
1075 1082
 	lsig->logic = cli_strdup(logic);
1083
+#endif
1076 1084
 	if(!lsig->logic) {
1077 1085
 	    cli_errmsg("cli_loadldb: Can't allocate memory for lsig->logic\n");
1078 1086
 	    FREE_TDB(tdb);
1079 1087
 	    ret = CL_EMEM;
1088
+#ifdef USE_MPOOL
1089
+	    mpool_free((*engine)->mempool, lsig);
1090
+#else
1080 1091
 	    free(lsig);
1092
+#endif
1081 1093
 	    break;
1082 1094
 	}
1083 1095
 
... ...
@@ -1085,12 +1097,20 @@ static int cli_loadldb(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1085 1085
 	memcpy(&lsig->tdb, &tdb, sizeof(tdb));
1086 1086
 
1087 1087
 	root->ac_lsigs++;
1088
+#ifdef USE_MPOOL
1089
+	newtable = (struct cli_ac_lsig **) mpool_realloc((*engine)->mempool, root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
1090
+#else
1088 1091
 	newtable = (struct cli_ac_lsig **) cli_realloc(root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
1092
+#endif
1089 1093
 	if(!newtable) {
1090 1094
 	    root->ac_lsigs--;
1091 1095
 	    cli_errmsg("cli_loadldb: Can't realloc root->ac_lsigtable\n");
1092 1096
 	    FREE_TDB(tdb);
1097
+#ifdef USE_MPOOL
1098
+	    mpool_free((*engine)->mempool, lsig);
1099
+#else
1093 1100
 	    free(lsig);
1101
+#endif
1094 1102
 	    ret = CL_EMEM;
1095 1103
 	    break;
1096 1104
 	}
... ...
@@ -1215,25 +1235,60 @@ static int cli_loadftm(FILE *fs, struct cl_engine **engine, unsigned int options
1215 1215
 		break;
1216 1216
 
1217 1217
 	} else if(atoi(tokens[0]) == 0) { /* memcmp() */
1218
+#ifdef USE_MPOOL
1219
+	    new = (struct cli_ftype *) mpool_alloc((*engine)->mempool, sizeof(struct cli_ftype), NULL);
1220
+#else
1218 1221
 	    new = (struct cli_ftype *) cli_malloc(sizeof(struct cli_ftype));
1222
+#endif
1219 1223
 	    if(!new) {
1220 1224
 		ret = CL_EMEM;
1221 1225
 		break;
1222 1226
 	    }
1223 1227
 	    new->type = type;
1224 1228
 	    new->offset = atoi(tokens[1]);
1229
+#ifdef USE_MPOOL
1230
+{
1231
+    unsigned char *mpoolmagic = cli_hex2str(tokens[2]);
1232
+    if(mpoolmagic) {
1233
+        if((new->magic = mpool_alloc((*engine)->mempool, strlen(mpoolmagic) + 1, NULL)))
1234
+	    strcpy(new->magic, mpoolmagic);
1235
+	free(mpoolmagic);
1236
+    } else new->magic = NULL;
1237
+}
1238
+#else
1225 1239
 	    new->magic = (unsigned char *) cli_hex2str(tokens[2]);
1240
+#endif
1226 1241
 	    if(!new->magic) {
1227 1242
 		cli_errmsg("cli_loadftm: Can't decode the hex string\n");
1228 1243
 		ret = CL_EMALFDB;
1244
+#ifdef USE_MPOOL
1245
+		mpool_free((*engine)->mempool, new);
1246
+#else
1229 1247
 		free(new);
1248
+#endif
1230 1249
 		break;
1231 1250
 	    }
1232 1251
 	    new->length = strlen(tokens[2]) / 2;
1252
+#ifdef USE_MPOOL
1253
+{
1254
+    unsigned char *mpooltname = cli_hex2str(tokens[3]);
1255
+    if(mpooltname) {
1256
+        if((new->tname = mpool_alloc((*engine)->mempool, strlen(mpooltname) + 1, NULL)))
1257
+	    strcpy(new->tname, mpooltname);
1258
+	free(mpooltname);
1259
+    } else new->tname = NULL;
1260
+}
1261
+#else
1233 1262
 	    new->tname = cli_strdup(tokens[3]);
1263
+#endif
1234 1264
 	    if(!new->tname) {
1265
+#ifdef USE_MPOOL
1266
+		mpool_free((*engine)->mempool, new->magic);
1267
+		mpool_free((*engine)->mempool, new);
1268
+#else
1235 1269
 		free(new->magic);
1236 1270
 		free(new);
1271
+#endif
1237 1272
 		ret = CL_EMEM;
1238 1273
 		break;
1239 1274
 	    }
... ...
@@ -1288,22 +1343,46 @@ static int cli_loadign(FILE *fs, struct cl_engine **engine, unsigned int options
1288 1288
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
1289 1289
 	line++;
1290 1290
 	cli_chomp(buffer);
1291
-
1291
+#ifdef USE_MPOOL
1292
+	new = (struct cli_ignsig *) mpool_calloc((*engine)->mempool, 1, sizeof(struct cli_ignsig), NULL);
1293
+#else
1292 1294
 	new = (struct cli_ignsig *) cli_calloc(1, sizeof(struct cli_ignsig));
1295
+#endif
1293 1296
 	if(!new) {
1294 1297
 	    ret = CL_EMEM;
1295 1298
 	    break;
1296 1299
 	}
1297 1300
 
1298
-	if(!(new->dbname = cli_strtok(buffer, 0, ":"))) {
1301
+#ifdef USE_MPOOL
1302
+{
1303
+    unsigned char *mpooldbname = cli_strtok(buffer, 0, ":");
1304
+    if(mpooldbname) {
1305
+        if((new->dbname = mpool_alloc((*engine)->mempool, strlen(mpooldbname) + 1, NULL)))
1306
+	    strcpy(new->dbname, mpooldbname);
1307
+	free(mpooldbname);
1308
+    } else new->dbname = NULL;
1309
+}
1310
+#else
1311
+	new->dbname = cli_strtok(buffer, 0, ":");
1312
+#endif
1313
+	if(!new->dbname) {
1314
+#ifdef USE_MPOOL
1315
+	  mpool_free((*engine)->mempool, new);
1316
+#else
1299 1317
 	    free(new);
1318
+#endif
1300 1319
 	    ret = CL_EMALFDB;
1301 1320
 	    break;
1302 1321
 	}
1303 1322
 
1304 1323
 	if(!(pt = cli_strtok(buffer, 1, ":"))) {
1324
+#ifdef USE_MPOOL
1325
+	    mpool_free((*engine)->mempool, new->dbname);
1326
+	    mpool_free((*engine)->mempool, new);
1327
+#else
1305 1328
 	    free(new->dbname);
1306 1329
 	    free(new);
1330
+#endif
1307 1331
 	    ret = CL_EMALFDB;
1308 1332
 	    break;
1309 1333
 	} else {
... ...
@@ -1314,9 +1393,26 @@ static int cli_loadign(FILE *fs, struct cl_engine **engine, unsigned int options
1314 1314
 	if((ret = hashset_addkey(&ignored->hs, new->line)))
1315 1315
 	    break;
1316 1316
 
1317
-	if(!(new->signame = cli_strtok(buffer, 2, ":"))) {
1317
+#ifdef USE_MPOOL
1318
+{
1319
+    unsigned char *mpoolsigname = cli_strtok(buffer, 2, ":");
1320
+    if(mpoolsigname) {
1321
+        if((new->signame = mpool_alloc((*engine)->mempool, strlen(mpoolsigname) + 1, NULL)))
1322
+	    strcpy(new->signame, mpoolsigname);
1323
+	free(mpoolsigname);
1324
+    } else new->signame = NULL;
1325
+}
1326
+#else
1327
+	new->signame = cli_strtok(buffer, 2, ":");
1328
+#endif
1329
+	if(!new->signame) {
1330
+#ifdef USE_MPOOL
1331
+	    mpool_free((*engine)->mempool, new->dbname);
1332
+	    mpool_free((*engine)->mempool, new);
1333
+#else
1318 1334
 	    free(new->dbname);
1319 1335
 	    free(new);
1336
+#endif
1320 1337
 	    ret = CL_EMALFDB;
1321 1338
 	    break;
1322 1339
 	}
... ...
@@ -1373,16 +1469,30 @@ static int cli_md5db_init(struct cl_engine **engine, unsigned int mode)
1373 1373
 
1374 1374
 
1375 1375
     if(mode == MD5_HDB) {
1376
+#ifdef USE_MPOOL
1377
+	bm = (*engine)->md5_hdb = (struct cli_matcher *) mpool_calloc((*engine)->mempool, sizeof(struct cli_matcher), 1, NULL);
1378
+#else
1376 1379
 	bm = (*engine)->md5_hdb = (struct cli_matcher *) cli_calloc(sizeof(struct cli_matcher), 1);
1380
+#endif
1377 1381
     } else if(mode == MD5_MDB) {
1382
+#ifdef USE_MPOOL
1383
+	bm = (*engine)->md5_mdb = (struct cli_matcher *) mpool_calloc((*engine)->mempool, sizeof(struct cli_matcher), 1, NULL);
1384
+#else
1378 1385
 	bm = (*engine)->md5_mdb = (struct cli_matcher *) cli_calloc(sizeof(struct cli_matcher), 1);
1386
+#endif
1379 1387
     } else {
1388
+#ifdef USE_MPOOL
1389
+	bm = (*engine)->md5_fp = (struct cli_matcher *) mpool_calloc((*engine)->mempool, sizeof(struct cli_matcher), 1, NULL);
1390
+#else
1380 1391
 	bm = (*engine)->md5_fp = (struct cli_matcher *) cli_calloc(sizeof(struct cli_matcher), 1);
1392
+#endif
1381 1393
     }
1382 1394
 
1383 1395
     if(!bm)
1384 1396
 	return CL_EMEM;
1385
-
1397
+#ifdef USE_MPOOL
1398
+    bm->mempool = (*engine)->mempool;
1399
+#endif
1386 1400
     if((ret = cli_bm_init(bm))) {
1387 1401
 	cli_errmsg("cli_md5db_init: Failed to initialize B-M\n");
1388 1402
 	return ret;
... ...
@@ -1438,47 +1548,100 @@ static int cli_loadmd5(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1438 1438
 	if((*engine)->ignored && cli_chkign((*engine)->ignored, dbname, line, pt))
1439 1439
 	    continue;
1440 1440
 
1441
-
1441
+#ifdef USE_MPOOL
1442
+	new = (struct cli_bm_patt *) mpool_calloc((*engine)->mempool, 1, sizeof(struct cli_bm_patt), NULL);
1443
+#else
1442 1444
 	new = (struct cli_bm_patt *) cli_calloc(1, sizeof(struct cli_bm_patt));
1445
+#endif
1443 1446
 	if(!new) {
1444 1447
 	    ret = CL_EMEM;
1445 1448
 	    break;
1446 1449
 	}
1447 1450
 
1448 1451
 	if(!(pt = tokens[md5_field])) {
1452
+#ifdef USE_MPOOL
1453
+	  mpool_free((*engine)->mempool, new);
1454
+#else
1449 1455
 	    free(new);
1456
+#endif
1450 1457
 	    ret = CL_EMALFDB;
1451 1458
 	    break;
1452 1459
 	}
1453 1460
 
1461
+#ifdef USE_MPOOL
1462
+	if(strlen(pt) == 32) {
1463
+	    unsigned char *mpoolhex = (unsigned char *) cli_hex2str(pt);
1464
+	    if(mpoolhex) {
1465
+	        if((new->pattern = mpool_alloc((*engine)->mempool, 17, NULL)))
1466
+		    memcpy(new->pattern, mpoolhex, 17);
1467
+		free(mpoolhex);
1468
+	    } else new->pattern = NULL;
1469
+	} else new->pattern = NULL;
1470
+	if(new->pattern == NULL) {
1471
+	    cli_errmsg("cli_loadmd5: Malformed MD5 string at line %u\n", line);
1472
+	    mpool_free((*engine)->mempool, new);
1473
+	    ret = CL_EMALFDB;
1474
+	    break;
1475
+	}
1476
+#else
1454 1477
 	if(strlen(pt) != 32 || !(new->pattern = (unsigned char *) cli_hex2str(pt))) {
1455 1478
 	    cli_errmsg("cli_loadmd5: Malformed MD5 string at line %u\n", line);
1456 1479
 	    free(new);
1457 1480
 	    ret = CL_EMALFDB;
1458 1481
 	    break;
1459 1482
 	}
1483
+#endif
1460 1484
 	new->length = 16;
1461 1485
 
1462 1486
 	if(!(pt = tokens[size_field])) {
1487
+#ifdef USE_MPOOL
1488
+	    mpool_free((*engine)->mempool, new->pattern);
1489
+	    mpool_free((*engine)->mempool, new);
1490
+#else
1463 1491
 	    free(new->pattern);
1464 1492
 	    free(new);
1493
+#endif
1465 1494
 	    ret = CL_EMALFDB;
1466 1495
 	    break;
1467 1496
 	}
1468 1497
 	size = atoi(pt);
1469 1498
 
1470
-	if(!(new->virname = cli_virname((char *) tokens[2], options & CL_DB_OFFICIAL, 0))) {
1499
+#ifdef USE_MPOOL
1500
+	{
1501
+	  char *mpoolvname = cli_virname((char *) tokens[2], options & CL_DB_OFFICIAL, 0);
1502
+	  if(mpoolvname) {
1503
+	    if((new->virname = mpool_alloc((*engine)->mempool, strlen(mpoolvname) + 1, NULL)))
1504
+	      strcpy(new->virname, mpoolvname);
1505
+	    free(mpoolvname);
1506
+	  } else new->virname = NULL;
1507
+	}
1508
+#else
1509
+	new->virname = cli_virname((char *) tokens[2], options & CL_DB_OFFICIAL, 0);
1510
+#endif
1511
+	if(!new->virname) {
1512
+#ifdef USE_MPOOL
1513
+	    mpool_free((*engine)->mempool, new->pattern);
1514
+	    mpool_free((*engine)->mempool, new);
1515
+#else
1471 1516
 	    free(new->pattern);
1472 1517
 	    free(new);
1518
+#endif
1473 1519
 	    ret = CL_EMALFDB;
1474 1520
 	    break;
1475 1521
 	}
1476 1522
 
1477 1523
 	MD5_DB;
1478 1524
 	if(!db && (ret = cli_md5db_init(engine, mode))) {
1525
+#ifdef USE_MPOOL
1526
+	    mpool_free((*engine)->mempool, new->pattern);
1527
+	    mpool_free((*engine)->mempool, new->virname);
1528
+	    mpool_free((*engine)->mempool, new);
1529
+#else
1530
+
1479 1531
 	    free(new->pattern);
1480 1532
 	    free(new->virname);
1481 1533
 	    free(new);
1534
+#endif
1482 1535
 	    break;
1483 1536
 	} else {
1484 1537
 	    MD5_DB;
... ...
@@ -1486,9 +1649,16 @@ static int cli_loadmd5(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1486 1486
 
1487 1487
 	if((ret = cli_bm_addpatt(db, new))) {
1488 1488
 	    cli_errmsg("cli_loadmd5: Error adding BM pattern\n");
1489
+#ifdef USE_MPOOL
1490
+	    mpool_free((*engine)->mempool, new->pattern);
1491
+	    mpool_free((*engine)->mempool, new->virname);
1492
+	    mpool_free((*engine)->mempool, new);
1493
+#else
1494
+
1489 1495
 	    free(new->pattern);
1490 1496
 	    free(new->virname);
1491 1497
 	    free(new);
1498
+#endif
1492 1499
 	    break;
1493 1500
 	}
1494 1501
 
... ...
@@ -1540,27 +1710,57 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1540 1540
 
1541 1541
 	cli_chomp(buffer);
1542 1542
 
1543
+#ifdef USE_MPOOL
1544
+	new = (struct cli_meta_node *) mpool_calloc((*engine)->mempool, 1, sizeof(struct cli_meta_node));
1545
+#else
1543 1546
 	new = (struct cli_meta_node *) cli_calloc(1, sizeof(struct cli_meta_node));
1547
+#endif
1544 1548
 	if(!new) {
1545 1549
 	    ret = CL_EMEM;
1546 1550
 	    break;
1547 1551
 	}
1548 1552
 
1549
-	if(!(new->virname = cli_virname(cli_strtok(buffer, 0, ":"), options & CL_DB_OFFICIAL, 1))) {
1553
+#ifdef USE_MPOOL
1554
+	{
1555
+	  char *mpoolvname = cli_virname(cli_strtok(buffer, 0, ":"), options & CL_DB_OFFICIAL, 1);
1556
+	  if(mpoolvname) {
1557
+	      if((new->virname = mpool_alloc((*engine)->mempool, strlen(mpoolvname) + 1, NULL)))
1558
+		  strcpy(new->virname, mpoolvname);
1559
+	      free(mpoolvname);
1560
+	  } else new->virname = NULL;
1561
+	}
1562
+#else
1563
+	new->virname = cli_virname(cli_strtok(buffer, 0, ":"), options & CL_DB_OFFICIAL, 1);
1564
+#endif
1565
+	if(!new->virname) {
1566
+#ifdef USE_MPOOL
1567
+	  mpool_free((*engine)->mempool, new);
1568
+#else
1550 1569
 	    free(new);
1570
+#endif
1551 1571
 	    ret = CL_EMEM;
1552 1572
 	    break;
1553 1573
 	}
1554 1574
 
1555 1575
 	if((*engine)->ignored && cli_chkign((*engine)->ignored, dbname, line, new->virname)) {
1576
+#ifdef USE_MPOOL
1577
+	  mpool_free((*engine)->mempool, new->virname);
1578
+	  mpool_free((*engine)->mempool, new);
1579
+#else
1556 1580
 	    free(new->virname);
1557 1581
 	    free(new);
1582
+#endif
1558 1583
 	    continue;
1559 1584
 	}
1560 1585
 
1561 1586
 	if(!(pt = cli_strtok(buffer, 1, ":"))) {
1587
+#ifdef USE_MPOOL
1588
+	  mpool_free((*engine)->mempool, new->virname);
1589
+	  mpool_free((*engine)->mempool, new);
1590
+#else
1562 1591
 	    free(new->virname);
1563 1592
 	    free(new);
1593
+#endif
1564 1594
 	    ret = CL_EMALFDB;
1565 1595
 	    break;
1566 1596
 	} else {
... ...
@@ -1568,22 +1768,49 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1568 1568
 	    free(pt);
1569 1569
 	}
1570 1570
 
1571
-	if(!(new->filename = cli_strtok(buffer, 2, ":"))) {
1571
+#ifdef USE_MPOOL
1572
+	{
1573
+	  char *mpoolfname = cli_strtok(buffer, 2, ":");
1574
+	  if(mpoolfname) {
1575
+	      if((new->filename = mpool_alloc((*engine)->mempool, strlen(mpoolfname) + 1, NULL)))
1576
+		  strcpy(new->filename, mpoolfname);
1577
+	      free(mpoolfname);
1578
+	  } else new->filename = NULL;
1579
+	}
1580
+#else
1581
+	new->filename = cli_strtok(buffer, 2, ":");
1582
+#endif
1583
+	if(!new->filename) {
1584
+#ifdef USE_MPOOL
1585
+	    mpool_free((*engine)->mempool, new->virname);
1586
+	    mpool_free((*engine)->mempool, new);
1587
+#else
1572 1588
 	    free(new->virname);
1573 1589
 	    free(new);
1590
+#endif
1574 1591
 	    ret = CL_EMALFDB;
1575 1592
 	    break;
1576 1593
 	} else {
1577 1594
 	    if(!strcmp(new->filename, "*")) {
1595
+#ifdef USE_MPOOL
1596
+	        mpool_free((*engine)->mempool, new->filename);
1597
+#else
1578 1598
 		free(new->filename);
1599
+#endif
1579 1600
 		new->filename = NULL;
1580 1601
 	    }
1581 1602
 	}
1582 1603
 
1583 1604
 	if(!(pt = cli_strtok(buffer, 3, ":"))) {
1584
-	    free(new->filename);
1605
+#ifdef USE_MPOOL
1606
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1607
+	    mpool_free((*engine)->mempool, new->virname);
1608
+	    mpool_free((*engine)->mempool, new);
1609
+#else
1610
+	    if(new->filename) free(new->filename);
1585 1611
 	    free(new->virname);
1586 1612
 	    free(new);
1613
+#endif
1587 1614
 	    ret = CL_EMALFDB;
1588 1615
 	    break;
1589 1616
 	} else {
... ...
@@ -1595,9 +1822,15 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1595 1595
 	}
1596 1596
 
1597 1597
 	if(!(pt = cli_strtok(buffer, 4, ":"))) {
1598
-	    free(new->filename);
1598
+#ifdef USE_MPOOL
1599
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1600
+	    mpool_free((*engine)->mempool, new->virname);
1601
+	    mpool_free((*engine)->mempool, new);
1602
+#else
1603
+	    if(new->filename) free(new->filename);
1599 1604
 	    free(new->virname);
1600 1605
 	    free(new);
1606
+#endif
1601 1607
 	    ret = CL_EMALFDB;
1602 1608
 	    break;
1603 1609
 	} else {
... ...
@@ -1609,9 +1842,15 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1609 1609
 	}
1610 1610
 
1611 1611
 	if(!(pt = cli_strtok(buffer, 5, ":"))) {
1612
-	    free(new->filename);
1612
+#ifdef USE_MPOOL
1613
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1614
+	    mpool_free((*engine)->mempool, new->virname);
1615
+	    mpool_free((*engine)->mempool, new);
1616
+#else
1617
+	    if(new->filename) free(new->filename);
1613 1618
 	    free(new->virname);
1614 1619
 	    free(new);
1620
+#endif
1615 1621
 	    ret = CL_EMALFDB;
1616 1622
 	    break;
1617 1623
 	} else {
... ...
@@ -1629,9 +1868,15 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1629 1629
 	}
1630 1630
 
1631 1631
 	if(!(pt = cli_strtok(buffer, 6, ":"))) {
1632
-	    free(new->filename);
1632
+#ifdef USE_MPOOL
1633
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1634
+	    mpool_free((*engine)->mempool, new->virname);
1635
+	    mpool_free((*engine)->mempool, new);
1636
+#else
1637
+	    if(new->filename) free(new->filename);
1633 1638
 	    free(new->virname);
1634 1639
 	    free(new);
1640
+#endif
1635 1641
 	    ret = CL_EMALFDB;
1636 1642
 	    break;
1637 1643
 	} else {
... ...
@@ -1643,9 +1888,15 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1643 1643
 	}
1644 1644
 
1645 1645
 	if(!(pt = cli_strtok(buffer, 7, ":"))) {
1646
-	    free(new->filename);
1646
+#ifdef USE_MPOOL
1647
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1648
+	    mpool_free((*engine)->mempool, new->virname);
1649
+	    mpool_free((*engine)->mempool, new);
1650
+#else
1651
+	    if(new->filename) free(new->filename);
1647 1652
 	    free(new->virname);
1648 1653
 	    free(new);
1654
+#endif
1649 1655
 	    ret = CL_EMALFDB;
1650 1656
 	    break;
1651 1657
 	} else {
... ...
@@ -1657,9 +1908,15 @@ static int cli_loadmd(FILE *fs, struct cl_engine **engine, unsigned int *signo,
1657 1657
 	}
1658 1658
 
1659 1659
 	if(!(pt = cli_strtok(buffer, 8, ":"))) {
1660
-	    free(new->filename);
1660
+#ifdef USE_MPOOL
1661
+	    if(new->filename) mpool_free((*engine)->mempool, new->filename);
1662
+	    mpool_free((*engine)->mempool, new->virname);
1663
+	    mpool_free((*engine)->mempool, new);
1664
+#else
1665
+	    if(new->filename) free(new->filename);
1661 1666
 	    free(new->virname);
1662 1667
 	    free(new);
1668
+#endif
1663 1669
 	    ret = CL_EMALFDB;
1664 1670
 	    break;
1665 1671
 	} else {
... ...
@@ -57,6 +57,11 @@
57 57
 #include "readdb.h"
58 58
 #include "jsparse/textbuf.h"
59 59
 #include "regex_suffix.h"
60
+
61
+#ifdef USE_MPOOL
62
+#include "mpool.h"
63
+#endif
64
+
60 65
 /* Prototypes */
61 66
 static regex_t *new_preg(struct regex_matcher *matcher);
62 67
 static size_t reverse_string(char *pattern);
... ...
@@ -350,8 +355,13 @@ int init_regex_list(struct regex_matcher* matcher)
350 350
 	matcher->list_inited=1;
351 351
 	matcher->list_built=0;
352 352
 	matcher->list_loaded=0;
353
-
353
+#ifdef USE_MPOOL
354
+	hashtab_init(&matcher->suffix_hash, 10, matcher->mempool);
355
+	matcher->suffixes->mempool = matcher->mempool;
356
+	matcher->md5_hashes->mempool = matcher->mempool;
357
+#else
354 358
 	hashtab_init(&matcher->suffix_hash, 10);
359
+#endif
355 360
 	if((rc = cli_ac_init(&matcher->suffixes, 2, 32))) {
356 361
 		return rc;
357 362
 	}
... ...
@@ -704,10 +714,18 @@ static size_t reverse_string(char *pattern)
704 704
 static regex_t *new_preg(struct regex_matcher *matcher)
705 705
 {
706 706
 	regex_t *r;
707
+#ifdef USE_MPOOL
708
+	matcher->all_pregs = mpool_realloc(matcher->mempool, matcher->all_pregs, ++matcher->regex_cnt * sizeof(*matcher->all_pregs), NULL);
709
+#else
707 710
 	matcher->all_pregs = cli_realloc(matcher->all_pregs, ++matcher->regex_cnt * sizeof(*matcher->all_pregs));
711
+#endif
708 712
 	if(!matcher->all_pregs)
709 713
 		return NULL;
714
+#ifdef USE_MPOOL
715
+	r = mpool_alloc(matcher->mempool, sizeof(*r), NULL);
716
+#else
710 717
 	r = cli_malloc(sizeof(*r));
718
+#endif
711 719
 	if(!r)
712 720
 		return NULL;
713 721
 	matcher->all_pregs[matcher->regex_cnt-1] = r;
... ...
@@ -29,6 +29,10 @@
29 29
 #include "matcher.h"
30 30
 #include <zlib.h> /* for gzFile */
31 31
 
32
+#ifdef USE_MPOOL
33
+#include "mpool.h"
34
+#endif
35
+
32 36
 struct filter {
33 37
 	uint32_t B[65536];
34 38
 	uint32_t end_fast[256];
... ...
@@ -51,6 +55,9 @@ struct regex_matcher {
51 51
 	struct cli_matcher md5_hashes;
52 52
 	struct filter md5_filter;
53 53
 	struct filter filter;
54
+#ifdef USE_MPOOL
55
+	mpool_t *mempool;
56
+#endif
54 57
 	int list_inited:2;
55 58
 	int list_loaded:2;
56 59
 	int list_built:2;