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... | ... |
@@ -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) { |
... | ... |
@@ -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; |