some leaks fixed

git-svn-id: file:///var/lib/svn/clamav-devel/branches/mpool@4280 77e5149b-7576-45b1-b177-96237e5ba77b
0.95
aCaB 17 years ago
parent 4284b788bc
commit 0d9dbdef21
  1. 10
      libclamav/filetypes.c
  2. 2
      libclamav/filetypes.h
  3. 32
      libclamav/matcher-ac.c
  4. 33
      libclamav/matcher-bm.c
  5. 3
      libclamav/matcher.h
  6. 15
      libclamav/mpool-2.1.0/mpool.c
  7. 4
      libclamav/mpool-2.1.0/mpool.h
  8. 6
      libclamav/phish_whitelist.c
  9. 4
      libclamav/phishcheck.c
  10. 39
      libclamav/readdb.c
  11. 12
      libclamav/regex_list.c

@ -100,16 +100,22 @@ cli_file_t cli_ftcode(const char *name)
return CL_TYPE_ERROR;
}
void cli_ftfree(struct cli_ftype *ftypes)
void cli_ftfree(const struct cl_engine *engine)
{
struct cli_ftype *pt;
struct cli_ftype *ftypes=engine->ftypes, *pt;
while(ftypes) {
pt = ftypes;
ftypes = ftypes->next;
#ifdef USE_MPOOL
mpool_free(engine->mempool, pt->magic);
mpool_free(engine->mempool, pt->tname);
mpool_free(engine->mempool, pt);
#else
free(pt->magic);
free(pt->tname);
free(pt);
#endif
}
}

@ -95,7 +95,7 @@ struct cli_matched_type {
};
cli_file_t cli_ftcode(const char *name);
void cli_ftfree(struct cli_ftype *ftypes);
void cli_ftfree(const struct cl_engine *engine);
cli_file_t cli_filetype(const unsigned char *buf, size_t buflen, const struct cl_engine *engine);
cli_file_t cli_filetype2(int desc, const struct cl_engine *engine);
int cli_addtypesigs(struct cl_engine *engine);

@ -406,8 +406,16 @@ void cli_ac_free(struct cli_matcher *root)
for(i = 0; i < root->ac_patterns; i++) {
patt = root->ac_pattable[i];
#ifdef USE_MPOOL
patt->prefix ? mpool_free(root->mempool, patt->prefix) : mpool_free(root->mempool, patt->pattern);
#else
patt->prefix ? free(patt->prefix) : free(patt->pattern);
#endif
#ifdef USE_MPOOL
mpool_free(root->mempool, patt->virname);
#else
free(patt->virname);
#endif
if(patt->offset)
#ifdef USE_MPOOL
mpool_free(root->mempool, patt->offset);
@ -420,23 +428,45 @@ void cli_ac_free(struct cli_matcher *root)
#else
ac_free_alt(patt);
#endif
#ifdef USE_MPOOL
mpool_free(root->mempool, patt);
#else
free(patt);
#endif
}
if(root->ac_pattable)
#ifdef USE_MPOOL
mpool_free(root->mempool, root->ac_pattable);
#else
free(root->ac_pattable);
#endif
for(i = 0; i < root->ac_nodes; i++) {
if(!root->ac_nodetable[i]->leaf)
#ifdef USE_MPOOL
mpool_free(root->mempool, root->ac_nodetable[i]->trans);
mpool_free(root->mempool, root->ac_nodetable[i]);
#else
free(root->ac_nodetable[i]->trans);
free(root->ac_nodetable[i]);
#endif
}
if(root->ac_nodetable)
#ifdef USE_MPOOL
mpool_free(root->mempool, root->ac_nodetable);
#else
free(root->ac_nodetable);
#endif
if(root->ac_root) {
#ifdef USE_MPOOL
mpool_free(root->mempool, root->ac_root->trans);
mpool_free(root->mempool, root->ac_root);
#else
free(root->ac_root->trans);
free(root->ac_root);
#endif
}
}

@ -108,7 +108,11 @@ int cli_bm_init(struct cli_matcher *root)
#endif
return CL_EMEM;
#ifdef USE_MPOOL
if(!(root->bm_suffix = (struct cli_bm_patt **) mpool_calloc(root->mempool, size, sizeof(struct cli_bm_patt *), NULL))) {
#else
if(!(root->bm_suffix = (struct cli_bm_patt **) cli_calloc(size, sizeof(struct cli_bm_patt *)))) {
#endif
#ifdef USE_MPOOL
mpool_free(root->mempool, root->bm_shift);
#else
@ -130,7 +134,11 @@ void cli_bm_free(struct cli_matcher *root)
if(root->bm_shift)
#ifdef USE_MPOOL
mpool_free(root->mempool, root->bm_shift);
#else
free(root->bm_shift);
#endif
if(root->bm_suffix) {
for(i = 0; i < size; i++) {
@ -139,17 +147,42 @@ void cli_bm_free(struct cli_matcher *root)
prev = patt;
patt = patt->next;
if(prev->prefix)
#ifdef USE_MPOOL
mpool_free(root->mempool, prev->prefix);
#else
free(prev->prefix);
#endif
else
#ifdef USE_MPOOL
mpool_free(root->mempool, prev->pattern);
#else
free(prev->pattern);
#endif
if(prev->virname)
#ifdef USE_MPOOL
mpool_free(root->mempool, prev->virname);
#else
free(prev->virname);
#endif
if(prev->offset)
#ifdef USE_MPOOL
mpool_free(root->mempool, prev->offset);
#else
free(prev->offset);
#endif
#ifdef USE_MPOOL
mpool_free(root->mempool, prev);
#else
free(prev);
#endif
}
}
#ifdef USE_MPOOL
mpool_free(root->mempool, root->bm_suffix);
#else
free(root->bm_suffix);
#endif
}
}

@ -58,6 +58,9 @@ struct cli_lsig_tdb {
const uint32_t *engine, *nos, *ep;
const uint32_t *sectoff, *sectrva, *sectvsz, *sectraw, *sectrsz,
*secturva, *sectuvsz, *secturaw, *sectursz;
#ifdef USE_MPOOL
mpool_t *mempool;
#endif
};
struct cli_ac_lsig {

@ -789,6 +789,7 @@ static void *alloc_mem(mpool_t *mp_p, const unsigned long byte_size,
}
SET_POINTER(error_p, MPOOL_ERROR_NONE);
// printf("^alloc'd %p::%p(%u)\n", mp_p, addr, byte_size);
return addr;
}
@ -819,6 +820,8 @@ static int free_mem(mpool_t *mp_p, void *addr, const unsigned long size)
unsigned long old_size, fence;
int ret;
mpool_block_t *block_p;
// printf("free'd %p::%p(%u)\n", mp_p, addr, size);
/*
* If the size is larger than a block then the allocation must be at
@ -862,7 +865,6 @@ static int free_mem(mpool_t *mp_p, void *addr, const unsigned long size)
/* adjust our stats */
mp_p->mp_alloc_c--;
return MPOOL_ERROR_NONE;
}
@ -1494,6 +1496,17 @@ void *mpool_resize(mpool_t *mp_p, void *old_addr,
return &new_frag->frag_ptr;
}
void *mpool_resize2(mpool_t *mp_p, void *old_addr,
const unsigned long new_byte_size,
int *error_p)
{
void *alloc = mpool_resize(mp_p, old_addr, new_byte_size, error_p);
if(!alloc && old_addr)
mpool_free(mp_p, old_addr);
return alloc;
}
/*
* int mpool_stats
*

@ -343,6 +343,10 @@ extern
void *mpool_resize(mpool_t *mp_p, void *old_addr,
const unsigned long new_byte_size,
int *error_p);
extern
void *mpool_resize2(mpool_t *mp_p, void *old_addr,
const unsigned long new_byte_size,
int *error_p);
/*
* int mpool_stats

@ -82,8 +82,10 @@ int is_whitelist_ok(const struct cl_engine* engine)
void whitelist_done(struct cl_engine* engine)
{
if(engine && engine->whitelist_matcher) {
regex_list_done(engine->whitelist_matcher);
#ifndef USE_MPOOL
regex_list_done(engine->whitelist_matcher);
#ifdef USE_MPOOL
mpool_free(engine->mempool, engine->whitelist_matcher);
#else
free(engine->whitelist_matcher);
#endif
engine->whitelist_matcher = NULL;

@ -907,7 +907,9 @@ void phishing_done(struct cl_engine* engine)
domainlist_done(engine);
if(pchk) {
cli_dbgmsg("Freeing phishcheck struct\n");
#ifndef USE_MPOOL
#ifdef USE_MPOOL
mpool_free(engine->mempool, pchk);
#else
free(pchk);
#endif
}

@ -867,7 +867,11 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
switch(apt->type) {
case CLI_TDB_UINT:
off[i] = cnt = tdb->cnt[CLI_TDB_UINT]++;
#ifdef USE_MPOOL
tdb->val = (uint32_t *) mpool_resize2(tdb->mempool, tdb->val, tdb->cnt[CLI_TDB_UINT] * sizeof(uint32_t), NULL);
#else
tdb->val = (uint32_t *) cli_realloc2(tdb->val, tdb->cnt[CLI_TDB_UINT] * sizeof(uint32_t));
#endif
if(!tdb->val) {
tdb->cnt[CLI_TDB_UINT] = 0;
return -1;
@ -883,7 +887,11 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
*pt2++ = 0;
off[i] = cnt = tdb->cnt[CLI_TDB_RANGE];
tdb->cnt[CLI_TDB_RANGE] += 2;
#ifdef USE_MPOOL
tdb->range = (uint32_t *) mpool_resize2(tdb->mempool, tdb->range, tdb->cnt[CLI_TDB_RANGE] * sizeof(uint32_t), NULL);
#else
tdb->range = (uint32_t *) cli_realloc2(tdb->range, tdb->cnt[CLI_TDB_RANGE] * sizeof(uint32_t));
#endif
if(!tdb->range) {
tdb->cnt[CLI_TDB_RANGE] = 0;
return -1;
@ -899,7 +907,11 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
}
off[i] = cnt = tdb->cnt[CLI_TDB_RANGE];
tdb->cnt[CLI_TDB_RANGE] += 3;
#ifdef USE_MPOOL
tdb->range = (uint32_t *) mpool_resize2(tdb->mempool, tdb->range, tdb->cnt[CLI_TDB_RANGE] * sizeof(uint32_t), NULL);
#else
tdb->range = (uint32_t *) cli_realloc2(tdb->range, tdb->cnt[CLI_TDB_RANGE] * sizeof(uint32_t));
#endif
if(!tdb->range) {
tdb->cnt[CLI_TDB_RANGE] = 0;
return -1;
@ -916,7 +928,11 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
case CLI_TDB_STR:
off[i] = cnt = tdb->cnt[CLI_TDB_STR];
tdb->cnt[CLI_TDB_STR] += strlen(pt) + 1;
#ifdef USE_MPOOL
tdb->str = (char *) mpool_resize2(tdb->mempool, tdb->str, tdb->cnt[CLI_TDB_STR] * sizeof(char), NULL);
#else
tdb->str = (char *) cli_realloc2(tdb->str, tdb->cnt[CLI_TDB_STR] * sizeof(char));
#endif
if(!tdb->str) {
cli_errmsg("lsigattribs: Can't allocate memory for tdb->str\n");
return -1;
@ -958,6 +974,16 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
return 0;
}
#ifdef USE_MPOOL
#define FREE_TDB(x) do { \
if(x.cnt[CLI_TDB_UINT]) \
mpool_free(x.mempool, x.val); \
if(x.cnt[CLI_TDB_RANGE]) \
mpool_free(x.mempool, x.range); \
if(x.cnt[CLI_TDB_STR]) \
mpool_free(x.mempool, x.str); \
} while(0);
#else
#define FREE_TDB(x) \
if(x.cnt[CLI_TDB_UINT]) \
free(x.val); \
@ -965,6 +991,7 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
free(x.range); \
if(x.cnt[CLI_TDB_STR]) \
free(x.str);
#endif
#define LDB_TOKENS 67
static int cli_loadldb(FILE *fs, struct cl_engine **engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
@ -1030,6 +1057,7 @@ static int cli_loadldb(FILE *fs, struct cl_engine **engine, unsigned int *signo,
/* TDB */
memset(&tdb, 0, sizeof(tdb));
tdb.mempool = (*engine)->mempool;
if(lsigattribs(tokens[1], &tdb) == -1) {
FREE_TDB(tdb);
@ -2458,10 +2486,9 @@ void cl_free(struct cl_engine *engine)
#ifdef CL_THREAD_SAFE
pthread_mutex_unlock(&cli_ref_mutex);
#endif
#ifdef USE_MPOOL
if(engine->mempool) mpool_close(engine->mempool);
#else
#define free(X) mpool_free(engine->mempool, X)
#endif
if(engine->root) {
for(i = 0; i < CLI_MTARGETS; i++) {
if((root = engine->root[i])) {
@ -2523,15 +2550,17 @@ void cl_free(struct cl_engine *engine)
if(((struct cli_dconf *) engine->dconf)->phishing & PHISHING_CONF_ENGINE)
phishing_done(engine);
if(engine->dconf)
free(engine->dconf);
if(engine->pua_cats)
free(engine->pua_cats);
cli_ftfree(engine->ftypes);
cli_ftfree(engine);
cli_freeign(engine);
#ifdef USE_MPOOL
#undef free(X)
if(engine->mempool) mpool_close(engine->mempool);
#endif /* USE_MPOOL */
free(engine);
}

@ -571,9 +571,7 @@ void regex_list_done(struct regex_matcher* matcher)
if(matcher->list_inited) {
size_t i;
#ifndef USE_MPOOL
cli_ac_free(&matcher->suffixes);
#endif
if(matcher->suffix_regexes) {
for(i=0;i<matcher->suffix_cnt;i++) {
struct regex_list *r = matcher->suffix_regexes[i].head;
@ -591,14 +589,20 @@ void regex_list_done(struct regex_matcher* matcher)
for(i=0;i<matcher->regex_cnt;i++) {
regex_t *r = matcher->all_pregs[i];
cli_regfree(r);
#ifdef USE_MPOOL
mpool_free(matcher->mempool, r);
#else
free(r);
#endif
}
#ifdef USE_MPOOL
mpool_free(matcher->mempool, matcher->all_pregs);
#else
free(matcher->all_pregs);
#endif
}
hashtab_free(&matcher->suffix_hash);
#ifndef USE_MPOOL
cli_bm_free(&matcher->md5_hashes);
#endif
}
}

Loading…
Cancel
Save