[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

Tomasz Kojm tkojm at clamav.net
Sun Apr 4 01:06:07 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 04133ff998767d0f37495a1b58b064ca6ecfe3c9
Author: Tomasz Kojm <tkojm at clamav.net>
Date:   Mon Sep 28 19:33:59 2009 +0200

    libclamav: new signature blacklisting format (bb#1625)
    libclamav: allow arbitrary names for .ign/.ign2 files (bb#1683)

diff --git a/ChangeLog b/ChangeLog
index 8c01fe1..f5bc2c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Sep 28 19:29:32 CEST 2009 (tk)
+----------------------------------
+ * libclamav: new signature blacklisting format (bb#1625)
+ * libclamav: allow arbitrary names for .ign/.ign2 files (bb#1683)
+
 Fri Sep 25 15:13:25 CEST 2009 (acab)
 ------------------------------------
  * sigtool/vba.c: s/cli_errmsg/logg/
diff --git a/libclamav/matcher-ac.c b/libclamav/matcher-ac.c
index 5de9211..ed70693 100644
--- a/libclamav/matcher-ac.c
+++ b/libclamav/matcher-ac.c
@@ -1032,7 +1032,7 @@ int cli_ac_scanbuff(const unsigned char *buffer, uint32_t length, const char **v
     if(!root->ac_root)
 	return CL_CLEAN;
 
-    if(!mdata) {
+    if(!mdata && (root->ac_partsigs || root->ac_lsigs || root->ac_reloff_num)) {
 	cli_errmsg("cli_ac_scanbuff: mdata == NULL\n");
 	return CL_ENULLARG;
     }
diff --git a/libclamav/matcher-bm.c b/libclamav/matcher-bm.c
index 1ba1021..7b4892b 100644
--- a/libclamav/matcher-bm.c
+++ b/libclamav/matcher-bm.c
@@ -339,6 +339,13 @@ int cli_bm_scanbuff(const unsigned char *buffer, uint32_t length, const char **v
 		    }
 		}
 
+		if(found && (p->boundary & BM_BOUNDARY_EOL)) {
+		    if(off != length) {
+			p = p->next;
+			continue;
+		    }
+		}
+
 		if(found && p->length + p->prefix_length == j) {
 		    if(!offdata && (p->offset_min != CLI_OFF_ANY)) {
 			if(p->offdata[0] != CLI_OFF_ABSOLUTE) {
diff --git a/libclamav/matcher-bm.h b/libclamav/matcher-bm.h
index 5cca947..2b62dd0 100644
--- a/libclamav/matcher-bm.h
+++ b/libclamav/matcher-bm.h
@@ -25,6 +25,8 @@
 #include "filetypes.h"
 #include "cltypes.h"
 
+#define BM_BOUNDARY_EOL	1
+
 struct cli_bm_patt {
     unsigned char *pattern, *prefix;
     char *virname;
@@ -33,6 +35,7 @@ struct cli_bm_patt {
     uint16_t length, prefix_length;
     uint16_t cnt;
     unsigned char pattern0;
+    uint32_t boundary;
 };
 
 struct cli_bm_off {
diff --git a/libclamav/others.h b/libclamav/others.h
index 09a48ce..0661ae6 100644
--- a/libclamav/others.h
+++ b/libclamav/others.h
@@ -170,7 +170,7 @@ struct cl_engine {
     struct cli_ftype *ftypes;
 
     /* Ignored signatures */
-    struct cli_ignored *ignored;
+    struct cli_matcher *ignored;
 
     /* PUA categories (to be included or excluded) */
     char *pua_cats;
diff --git a/libclamav/readdb.c b/libclamav/readdb.c
index 0caa2e6..5885fd5 100644
--- a/libclamav/readdb.c
+++ b/libclamav/readdb.c
@@ -55,6 +55,7 @@
 #include "readdb.h"
 #include "cltypes.h"
 #include "default.h"
+#include "md5.h"
 
 #include "phishcheck.h"
 #include "phish_whitelist.h"
@@ -74,17 +75,6 @@
 static pthread_mutex_t cli_ref_mutex = PTHREAD_MUTEX_INITIALIZER;
 #endif
 
-struct cli_ignsig {
-    char *dbname, *signame;
-    unsigned int line;
-    struct cli_ignsig *next;
-};
-
-struct cli_ignored {
-    struct cli_hashset hs;
-    struct cli_ignsig *list;
-};
-
 char *cli_virname(char *virname, unsigned int official)
 {
 	char *newname, *pt;
@@ -407,22 +397,25 @@ char *cli_dbgets(char *buff, unsigned int size, FILE *fs, struct cli_dbio *dbio)
     }
 }
 
-static int cli_chkign(const struct cli_ignored *ignored, const char *dbname, unsigned int line, const char *signame)
+static int cli_chkign(const struct cli_matcher *ignored, const char *signame, const char *entry)
 {
-	struct cli_ignsig *pt;
+	const char *md5_expected = NULL;
+        cli_md5_ctx md5ctx;
+        unsigned char digest[16];
 
-    if(!ignored || !dbname || !signame)
+    if(!ignored || !signame || !entry)
 	return 0;
 
-    if(cli_hashset_contains(&ignored->hs, line)) {
-	pt = ignored->list;
-	while(pt) {
-	    if(pt->line == line && !strcmp(pt->dbname, dbname) && !strcmp(pt->signame, signame)) {
-		cli_dbgmsg("Skipping signature %s @ %s:%u\n", signame, dbname, line);
-		return 1;
-	    }
-	    pt = pt->next;
+    if(cli_bm_scanbuff(signame, strlen(signame), &md5_expected, ignored, 0, -1, NULL) == CL_VIRUS) {
+	if(md5_expected) {
+	    cli_md5_init(&md5ctx);
+            cli_md5_update(&md5ctx, entry, strlen(entry));
+	    cli_md5_final(digest, &md5ctx);
+	    if(memcmp(digest, (const unsigned char *) md5_expected, 16))
+		return 0;
 	}
+	cli_dbgmsg("Ignoring signature %s\n", signame);
+	return 1;
     }
 
     return 0;
@@ -466,7 +459,7 @@ static int cli_chkpua(const char *signame, const char *pua_cats, unsigned int op
 
 static int cli_loaddb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
 {
-	char buffer[FILEBUFF], *pt, *start;
+	char buffer[FILEBUFF], *buffer_cpy, *pt, *start;
 	unsigned int line = 0, sigs = 0;
 	int ret = 0;
 	struct cli_matcher *root;
@@ -477,9 +470,15 @@ static int cli_loaddb(FILE *fs, struct cl_engine *engine, unsigned int *signo, u
 
     root = engine->root[0];
 
+    if(engine->ignored)
+	if(!(buffer_cpy = cli_malloc(FILEBUFF)))
+	    return CL_EMEM;
+
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
 	line++;
 	cli_chomp(buffer);
+	if(engine->ignored)
+	    strcpy(buffer_cpy, buffer);
 
 	pt = strchr(buffer, '=');
 	if(!pt) {
@@ -491,7 +490,7 @@ static int cli_loaddb(FILE *fs, struct cl_engine *engine, unsigned int *signo, u
 	start = buffer;
 	*pt++ = 0;
 
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, start))
+	if(engine->ignored && cli_chkign(engine->ignored, start, buffer_cpy))
 	    continue;
 
 	if(*pt == '=') continue;
@@ -503,6 +502,9 @@ static int cli_loaddb(FILE *fs, struct cl_engine *engine, unsigned int *signo, u
 	sigs++;
     }
 
+    if(engine->ignored)
+	free(buffer_cpy);
+
     if(!line) {
 	cli_errmsg("Empty database file\n");
 	return CL_EMALFDB;
@@ -565,7 +567,7 @@ static int cli_loadpdb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 static int cli_loadndb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned short sdb, unsigned int options, struct cli_dbio *dbio, const char *dbname)
 {
 	const char *tokens[NDB_TOKENS + 1];
-	char buffer[FILEBUFF];
+	char buffer[FILEBUFF], *buffer_cpy;
 	const char *sig, *virname, *offset, *pt;
 	struct cli_matcher *root;
 	int line = 0, sigs = 0, ret = 0, tokens_count;
@@ -576,6 +578,10 @@ static int cli_loadndb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
     if((ret = cli_initroots(engine, options)))
 	return ret;
 
+    if(engine->ignored)
+	if(!(buffer_cpy = cli_malloc(FILEBUFF)))
+	    return CL_EMEM;
+
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
 	line++;
 
@@ -587,6 +593,8 @@ static int cli_loadndb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 		continue;
 
 	cli_chomp(buffer);
+	if(engine->ignored)
+	    strcpy(buffer_cpy, buffer);
 
 	tokens_count = cli_strtokenize(buffer, ':', NDB_TOKENS + 1, tokens);
 	/* FIXME: re-enable after fixing invalid sig @ main.ndb:53467 */
@@ -601,7 +609,7 @@ static int cli_loadndb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	    if(cli_chkpua(virname, engine->pua_cats, options))
 		continue;
 
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, virname))
+	if(engine->ignored && cli_chkign(engine->ignored, virname, buffer_cpy))
 	    continue;
 
 	if(tokens_count > 4) { /* min version */
@@ -652,6 +660,8 @@ static int cli_loadndb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	}
 	sigs++;
     }
+    if(engine->ignored)
+	free(buffer_cpy);
 
     if(!line) {
 	cli_errmsg("Empty database file\n");
@@ -847,7 +857,7 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
 static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
 {
 	char *tokens[LDB_TOKENS];
-	char buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1], *pt;
+	char buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1], *buffer_cpy, *pt;
 	const char *sig, *virname, *offset, *logic;
 	struct cli_matcher *root;
 	unsigned int line = 0, sigs = 0;
@@ -861,10 +871,16 @@ static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
     if((ret = cli_initroots(engine, options)))
 	return ret;
 
+    if(engine->ignored)
+	if(!(buffer_cpy = cli_malloc(sizeof(buffer))))
+	    return CL_EMEM;
+
     while(cli_dbgets(buffer, sizeof(buffer), fs, dbio)) {
 	line++;
 	sigs++;
 	cli_chomp(buffer);
+	if(engine->ignored)
+	    strcpy(buffer_cpy, buffer);
 
 	tokens_count = cli_strtokenize(buffer, ';', LDB_TOKENS, (const char **) tokens);
 	if(tokens_count < 4) {
@@ -879,7 +895,7 @@ static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	    if(cli_chkpua(virname, engine->pua_cats, options))
 		continue;
 
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, virname))
+	if(engine->ignored && cli_chkign(engine->ignored, virname, buffer_cpy))
 	    continue;
 
 	subsigs = cli_ac_chklsig(logic, logic + strlen(logic), NULL, NULL, NULL, 1);
@@ -993,6 +1009,8 @@ static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	if(ret)
 	    break;
     }
+    if(engine->ignored)
+	free(buffer_cpy);
 
     if(!line) {
 	cli_errmsg("Empty database file\n");
@@ -1133,66 +1151,82 @@ static int cli_loadftm(FILE *fs, struct cl_engine *engine, unsigned int options,
     return CL_SUCCESS;
 }
 
-#define IGN_TOKENS 3
+#define IGN_MAX_TOKENS   3
 static int cli_loadign(FILE *fs, struct cl_engine *engine, unsigned int options, struct cli_dbio *dbio)
 {
-	const char *tokens[IGN_TOKENS + 1];
+	const char *tokens[IGN_MAX_TOKENS + 1], *signame, *hash = NULL;
 	char buffer[FILEBUFF];
-	unsigned int line = 0, tokens_count;
-	struct cli_ignsig *new;
+	unsigned int line = 0, tokens_count, i, len;
+        struct cli_bm_patt *new;
 	int ret = CL_SUCCESS;
 
-
     if(!engine->ignored) {
-	engine->ignored = (struct cli_ignored *) cli_calloc(sizeof(struct cli_ignored), 1);
-	if(!engine->ignored || cli_hashset_init(&engine->ignored->hs, 64, 50))
+	engine->ignored = (struct cli_matcher *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_matcher));
+	if(!engine->ignored)
 	    return CL_EMEM;
+#ifdef USE_MPOOL
+	engine->ignored->mempool = engine->mempool;
+#endif
+	if((ret = cli_bm_init(engine->ignored))) {
+	    cli_errmsg("cli_loadign: Can't initialise AC pattern matcher\n");
+	    return ret;
+	}
     }
 
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
 	line++;
 	cli_chomp(buffer);
-	tokens_count = cli_strtokenize(buffer, ':', IGN_TOKENS + 1, tokens);
-	if(tokens_count != IGN_TOKENS) {
+
+	tokens_count = cli_strtokenize(buffer, ':', IGN_MAX_TOKENS + 1, tokens);
+	if(tokens_count > IGN_MAX_TOKENS) {
 	    ret = CL_EMALFDB;
 	    break;
 	}
 
-	if(!cli_isnumber(tokens[1])) {
-	    cli_errmsg("cli_loadign: Invalid entry for line number\n");
+	if(tokens_count == 1) {
+	    signame = buffer;
+	} else if(tokens_count == 2) {
+	    signame = tokens[0];
+	    hash = tokens[1];
+	} else { /* old mode */
+	    signame = tokens[2];
+	}
+	if(!(len = strlen(signame))) {
+	    cli_errmsg("cli_loadign: No signature name provided\n");
 	    ret = CL_EMALFDB;
 	    break;
 	}
 
-	new = (struct cli_ignsig *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_ignsig));
+        new = (struct cli_bm_patt *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_bm_patt));
 	if(!new) {
 	    ret = CL_EMEM;
 	    break;
 	}
-
-	new->dbname = cli_mpool_strdup(engine->mempool, tokens[0]);
-
-	if(!new->dbname) {
+	new->pattern = cli_mpool_strdup(engine->mempool, signame);
+	if(!new->pattern) {
 	    mpool_free(engine->mempool, new);
-	    ret = CL_EMALFDB;
+	    ret = CL_EMEM;
 	    break;
 	}
+	if(hash) {
+	    if(strlen(hash) != 32 || !(new->virname = (unsigned char *) cli_mpool_hex2str(engine->mempool, hash))) {
+		cli_errmsg("cli_loadign: Malformed MD5 string at line %u\n", line);
+		mpool_free(engine->mempool, new->pattern);
+		mpool_free(engine->mempool, new);
+		ret = CL_EMALFDB;
+		break;
+	    }
+	}
+	new->length = len;
+	new->boundary |= BM_BOUNDARY_EOL;
 
-	new->line = atoi(tokens[1]);
-
-	if((ret = cli_hashset_addkey(&engine->ignored->hs, new->line)))
-	    break;
-
-	new->signame = cli_mpool_strdup(engine->mempool, tokens[2]);
-	if(!new->signame) {
-	    mpool_free(engine->mempool, new->dbname);
+        if((ret = cli_bm_addpatt(engine->ignored, new, "0"))) {
+	    if(hash)
+		mpool_free(engine->mempool, new->virname);
+	    mpool_free(engine->mempool, new->pattern);
 	    mpool_free(engine->mempool, new);
-	    ret = CL_EMALFDB;
 	    break;
 	}
-
-	new->next = engine->ignored->list;
-	engine->ignored->list = new;
     }
 
     if(ret) {
@@ -1203,25 +1237,6 @@ static int cli_loadign(FILE *fs, struct cl_engine *engine, unsigned int options,
     return CL_SUCCESS;
 }
 
-static void cli_freeign(struct cl_engine *engine)
-{
-	struct cli_ignsig *pt;
-	struct cli_ignored *ignored;
-
-    if((ignored = engine->ignored)) {
-	while(ignored->list) {
-	    pt = ignored->list;
-	    ignored->list = ignored->list->next;
-	    mpool_free(engine->mempool, pt->dbname);
-	    mpool_free(engine->mempool, pt->signame);
-	    mpool_free(engine->mempool,pt);
-	}
-	cli_hashset_destroy(&ignored->hs);
-	free(engine->ignored);
-	engine->ignored = NULL;
-    }
-}
-
 static int scomp(const void *a, const void *b)
 {
     return *(const uint32_t *)a - *(const uint32_t *)b;
@@ -1270,7 +1285,7 @@ static int cli_md5db_init(struct cl_engine *engine, unsigned int mode)
 static int cli_loadmd5(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int mode, unsigned int options, struct cli_dbio *dbio, const char *dbname)
 {
 	const char *tokens[MD5_TOKENS + 1];
-	char buffer[FILEBUFF];
+	char buffer[FILEBUFF], *buffer_cpy;
 	const char *pt;
 	int ret = CL_SUCCESS;
 	unsigned int size_field = 1, md5_field = 0, line = 0, sigs = 0, tokens_count;
@@ -1284,9 +1299,16 @@ static int cli_loadmd5(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	md5_field = 1;
     }
 
+    if(engine->ignored)
+	if(!(buffer_cpy = cli_malloc(FILEBUFF)))
+	    return CL_EMEM;
+
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
 	line++;
 	cli_chomp(buffer);
+	if(engine->ignored)
+	    strcpy(buffer_cpy, buffer);
+
 	tokens_count = cli_strtokenize(buffer, ':', MD5_TOKENS + 1, tokens);
 	if(tokens_count != MD5_TOKENS) {
 	    ret = CL_EMALFDB;
@@ -1303,7 +1325,7 @@ static int cli_loadmd5(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 	    if(cli_chkpua(pt, engine->pua_cats, options))
 		continue;
 
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, pt))
+	if(engine->ignored && cli_chkign(engine->ignored, pt, buffer_cpy))
 	    continue;
 
 	new = (struct cli_bm_patt *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_bm_patt));
@@ -1358,6 +1380,8 @@ static int cli_loadmd5(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 
 	sigs++;
     }
+    if(engine->ignored)
+	free(buffer_cpy);
 
     if(!line) {
 	cli_errmsg("cli_loadmd5: Empty database file\n");
@@ -1379,18 +1403,25 @@ static int cli_loadmd5(FILE *fs, struct cl_engine *engine, unsigned int *signo,
 static int cli_loadmd(FILE *fs, struct cl_engine *engine, unsigned int *signo, int type, unsigned int options, struct cli_dbio *dbio, const char *dbname)
 {
 	const char *tokens[MD_TOKENS + 1];
-	char buffer[FILEBUFF];
+	char buffer[FILEBUFF], *buffer_cpy;
 	unsigned int line = 0, sigs = 0, tokens_count;
 	int ret = CL_SUCCESS, crc;
 	struct cli_meta_node *new;
 
 
+    if(engine->ignored)
+	if(!(buffer_cpy = cli_malloc(FILEBUFF)))
+	    return CL_EMEM;
+
     while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
 	line++;
 	if(buffer[0] == '#')
 	    continue;
 
 	cli_chomp(buffer);
+	if(engine->ignored)
+	    strcpy(buffer_cpy, buffer);
+
 	tokens_count = cli_strtokenize(buffer, ':', MD_TOKENS + 1, tokens);
 	if(tokens_count != MD_TOKENS) {
 	    ret = CL_EMALFDB;
@@ -1441,7 +1472,7 @@ static int cli_loadmd(FILE *fs, struct cl_engine *engine, unsigned int *signo, i
 	    break;
 	}
 
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, new->virname)) {
+	if(engine->ignored && cli_chkign(engine->ignored, new->virname, buffer/*_cpy*/)) {
 	    mpool_free(engine->mempool, new->virname);
 	    mpool_free(engine->mempool, new);
 	    continue;
@@ -1507,6 +1538,8 @@ static int cli_loadmd(FILE *fs, struct cl_engine *engine, unsigned int *signo, i
 
 	sigs++;
     }
+    if(engine->ignored)
+	free(buffer_cpy);
 
     if(!line) {
 	cli_errmsg("Empty database file\n");
@@ -1625,7 +1658,7 @@ int cli_load(const char *filename, struct cl_engine *engine, unsigned int *signo
     } else if(cli_strbcasestr(dbname, ".ftm")) {
 	ret = cli_loadftm(fs, engine, options, 0, dbio);
 
-    } else if(cli_strbcasestr(dbname, ".ign")) {
+    } else if(cli_strbcasestr(dbname, ".ign") || cli_strbcasestr(dbname, ".ign2")) {
 	ret = cli_loadign(fs, engine, options, dbio);
 
     } else {
@@ -1663,15 +1696,47 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
 
 
     cli_dbgmsg("Loading databases from %s\n", dirname);
+
+    if((dd = opendir(dirname)) == NULL) {
+        cli_errmsg("cli_loaddbdir(): Can't open directory %s\n", dirname);
+        return CL_EOPEN;
+    }
+
+    /* first round - load .ign and .ign2 files */
+#ifdef HAVE_READDIR_R_3
+    while(!readdir_r(dd, &result.d, &dent) && dent) {
+#elif defined(HAVE_READDIR_R_2)
+    while((dent = (struct dirent *) readdir_r(dd, &result.d))) {
+#else
+    while((dent = readdir(dd))) {
+#endif
+	if(dent->d_ino)
+	{
+	    if(cli_strbcasestr(dent->d_name, ".ign") || cli_strbcasestr(dent->d_name, ".ign2")) {
+		dbfile = (char *) cli_malloc(strlen(dent->d_name) + strlen(dirname) + 2);
+		if(!dbfile) {
+		    cli_dbgmsg("cli_loaddbdir(): dbfile == NULL\n");
+		    closedir(dd);
+		    return CL_EMEM;
+		}
+		sprintf(dbfile, "%s"PATHSEP"%s", dirname, dent->d_name);
+		ret = cli_load(dbfile, engine, signo, options, NULL);
+		if(ret) {
+		    cli_dbgmsg("cli_loaddbdir(): error loading database %s\n", dbfile);
+		    free(dbfile);
+		    closedir(dd);
+		    return ret;
+		}
+		free(dbfile);
+	    }
+	}
+    }
+
+    /* the daily db must be loaded before main */
     dbfile = (char *) cli_malloc(strlen(dirname) + 20);
-    if(!dbfile)
+    if(!dbfile) {
+	closedir(dd);
 	return CL_EMEM;
-
-    /* try to load local.ign and daily.cvd/daily.ign first */
-    sprintf(dbfile, "%s"PATHSEP"local.ign", dirname);
-    if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
-	free(dbfile);
-	return ret;
     }
 
     sprintf(dbfile, "%s"PATHSEP"daily.cld", dirname);
@@ -1679,12 +1744,7 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
 	sprintf(dbfile, "%s"PATHSEP"daily.cvd", dirname);
     if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
 	free(dbfile);
-	return ret;
-    }
-
-    sprintf(dbfile, "%s"PATHSEP"daily.ign", dirname);
-    if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
-	free(dbfile);
+	closedir(dd);
 	return ret;
     }
 
@@ -1692,6 +1752,7 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
     sprintf(dbfile, "%s"PATHSEP"local.gdb", dirname);
     if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
 	free(dbfile);
+	closedir(dd);
 	return ret;
     }
 
@@ -1699,15 +1760,13 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
     sprintf(dbfile, "%s"PATHSEP"daily.cfg", dirname);
     if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
 	free(dbfile);
+	closedir(dd);
 	return ret;
     }
     free(dbfile);
 
-    if((dd = opendir(dirname)) == NULL) {
-        cli_errmsg("cli_loaddbdir(): Can't open directory %s\n", dirname);
-        return CL_EOPEN;
-    }
-
+    /* second round - load everything else */
+    rewinddir(dd);
 #ifdef HAVE_READDIR_R_3
     while(!readdir_r(dd, &result.d, &dent) && dent) {
 #elif defined(HAVE_READDIR_R_2)
@@ -1717,10 +1776,8 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
 #endif
 	if(dent->d_ino)
 	{
-	    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && strcmp(dent->d_name, "daily.cvd") && strcmp(dent->d_name, "daily.cld") && strcmp(dent->d_name, "daily.ign") && strcmp(dent->d_name, "daily.cfg") && strcmp(dent->d_name, "local.ign") && CLI_DBEXT(dent->d_name)) {
-
+	    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") && strcmp(dent->d_name, "daily.cvd") && strcmp(dent->d_name, "daily.cld") && strcmp(dent->d_name, "daily.cfg") && CLI_DBEXT(dent->d_name)) {
 		dbfile = (char *) cli_malloc(strlen(dent->d_name) + strlen(dirname) + 2);
-
 		if(!dbfile) {
 		    cli_dbgmsg("cli_loaddbdir(): dbfile == NULL\n");
 		    closedir(dd);
@@ -1728,7 +1785,6 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
 		}
 		sprintf(dbfile, "%s"PATHSEP"%s", dirname, dent->d_name);
 		ret = cli_load(dbfile, engine, signo, options, NULL);
-
 		if(ret) {
 		    cli_dbgmsg("cli_loaddbdir(): error loading database %s\n", dbfile);
 		    free(dbfile);
@@ -1739,7 +1795,6 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
 	    }
 	}
     }
-
     closedir(dd);
     if(ret == CL_EOPEN)
 	cli_errmsg("cli_loaddb(): No supported database files found in %s\n", dirname);
@@ -2089,7 +2144,11 @@ int cl_engine_free(struct cl_engine *engine)
 	mpool_free(engine->mempool, engine->tmpdir);
 
     cli_ftfree(engine);
-    cli_freeign(engine);
+    if(engine->ignored) {
+	cli_bm_free(engine->ignored);
+	mpool_free(engine->mempool, engine->ignored);
+    }
+
 #ifdef USE_MPOOL
     if(engine->mempool) mpool_destroy(engine->mempool);
 #endif
@@ -2149,7 +2208,11 @@ int cl_engine_compile(struct cl_engine *engine)
 	    return ret;
     }
     cli_md5db_build(engine->md5_mdb);
-    cli_freeign(engine);
+    if(engine->ignored) {
+	cli_bm_free(engine->ignored);
+	mpool_free(engine->mempool, engine->ignored);
+	engine->ignored = NULL;
+    }
     cli_dconf_print(engine->dconf);
     mpool_flush(engine->mempool);
 
diff --git a/libclamav/readdb.h b/libclamav/readdb.h
index 696e55e..07f18f7 100644
--- a/libclamav/readdb.h
+++ b/libclamav/readdb.h
@@ -48,7 +48,6 @@
 	cli_strbcasestr(ext, ".gdb")   ||	\
 	cli_strbcasestr(ext, ".wdb")   ||	\
 	cli_strbcasestr(ext, ".ftm")   ||	\
-	cli_strbcasestr(ext, ".ign")   ||	\
 	cli_strbcasestr(ext, ".cfg")   ||	\
 	cli_strbcasestr(ext, ".cvd")   ||	\
 	cli_strbcasestr(ext, ".cld")		\

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list