[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
Török Edvin
edwin at clamav.net
Sun Apr 4 01:05:09 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit df8af6d3ecd171d94301c390ef5adb4031b0814b
Author: Török Edvin <edwin at clamav.net>
Date: Mon Sep 21 20:28:15 2009 +0300
Split out the ldb loader core into a helper, so that it can be used in the bytecode loader.
diff --git a/libclamav/bytecode.c b/libclamav/bytecode.c
index 9cada5a..fdab1e9 100644
--- a/libclamav/bytecode.c
+++ b/libclamav/bytecode.c
@@ -420,7 +420,9 @@ static int parseLSig(struct cli_bc *bc, unsigned char *buffer)
return CL_EMALFDB;
}
bc->lsig = NULL;
- bc->lsig = cli_strdup(buffer + 1);
+ if (!buffer[1])
+ return CL_SUCCESS;
+ bc->lsig = cli_strdup(buffer);
return CL_SUCCESS;
}
diff --git a/libclamav/readdb.c b/libclamav/readdb.c
index f067d41..9df32e2 100644
--- a/libclamav/readdb.c
+++ b/libclamav/readdb.c
@@ -848,153 +848,150 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
} while(0);
#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)
+static int load_oneldb(char *buffer, int chkpua, int chkign, struct cl_engine *engine, unsigned int options, const char *dbname, unsigned line, unsigned *sigs)
{
- char *tokens[LDB_TOKENS];
- char buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1], *pt;
- const char *sig, *virname, *offset, *logic;
- struct cli_matcher *root;
- unsigned int line = 0, sigs = 0;
- unsigned short target = 0;
- struct cli_ac_lsig **newtable, *lsig;
- uint32_t lsigid[2];
- int ret = CL_SUCCESS, i, subsigs, tokens_count;
- struct cli_lsig_tdb tdb;
+ const char *sig, *virname, *offset, *logic;
+ struct cli_ac_lsig **newtable, *lsig;
+ char *tokens[LDB_TOKENS], *pt;
+ int i, subsigs, tokens_count;
+ unsigned short target = 0;
+ struct cli_matcher *root;
+ struct cli_lsig_tdb tdb;
+ uint32_t lsigid[2];
+ int ret;
+
+ tokens_count = cli_strtokenize(buffer, ';', LDB_TOKENS, (const char **) tokens);
+ if(tokens_count < 4) {
+ return CL_EMALFDB;
+ }
+ virname = tokens[0];
+ logic = tokens[2];
+ if (chkpua && cli_chkpua(virname, engine->pua_cats, options))
+ return CL_SUCCESS;
- if((ret = cli_initroots(engine, options)))
- return ret;
+ if (chkign && cli_chkign(engine->ignored, dbname, line, virname))
+ return CL_SUCCESS;
- while(cli_dbgets(buffer, sizeof(buffer), fs, dbio)) {
- line++;
- sigs++;
- cli_chomp(buffer);
+ subsigs = cli_ac_chklsig(logic, logic + strlen(logic), NULL, NULL, NULL, 1);
+ if(subsigs == -1) {
+ return CL_EMALFDB;
+ }
+ subsigs++;
+ if(subsigs > 64) {
+ cli_errmsg("cli_loadldb: Broken logical expression or too many subsignatures\n");
+ return CL_EMALFDB;
+ }
- tokens_count = cli_strtokenize(buffer, ';', LDB_TOKENS, (const char **) tokens);
- if(tokens_count < 4) {
- ret = CL_EMALFDB;
- break;
- }
+ /* TDB */
+ memset(&tdb, 0, sizeof(tdb));
+#ifdef USE_MPOOL
+ tdb.mempool = engine->mempool;
+#endif
+ if(lsigattribs(tokens[1], &tdb) == -1) {
+ FREE_TDB(tdb);
+ return CL_EMALFDB;
+ }
+ if(!tdb.target) {
+ cli_errmsg("cli_loadldb: No target specified in TDB\n");
+ FREE_TDB(tdb);
+ return CL_EMALFDB;
+ } else if(tdb.target[0] >= CLI_MTARGETS) {
+ cli_dbgmsg("cli_loadldb: Not supported target type in logical signature for %s\n", virname);
+ FREE_TDB(tdb);
+ *sigs--;
+ return CL_SUCCESS;
+ }
- virname = tokens[0];
- logic = tokens[2];
+ root = engine->root[tdb.target[0]];
- if(engine->pua_cats && (options & CL_DB_PUA_MODE) && (options & (CL_DB_PUA_INCLUDE | CL_DB_PUA_EXCLUDE)))
- if(cli_chkpua(virname, engine->pua_cats, options))
- continue;
+ lsig = (struct cli_ac_lsig *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_ac_lsig));
+ if(!lsig) {
+ cli_errmsg("cli_loadldb: Can't allocate memory for lsig\n");
+ FREE_TDB(tdb);
+ return CL_EMEM;
+ }
- if(engine->ignored && cli_chkign(engine->ignored, dbname, line, virname))
- continue;
+ lsig->logic = cli_mpool_strdup(engine->mempool, logic);
+ if(!lsig->logic) {
+ cli_errmsg("cli_loadldb: Can't allocate memory for lsig->logic\n");
+ FREE_TDB(tdb);
+ mpool_free(engine->mempool, lsig);
+ return CL_EMEM;
+ }
- subsigs = cli_ac_chklsig(logic, logic + strlen(logic), NULL, NULL, NULL, 1);
- if(subsigs == -1) {
- ret = CL_EMALFDB;
- break;
- }
- subsigs++;
+ lsigid[0] = lsig->id = root->ac_lsigs;
+ memcpy(&lsig->tdb, &tdb, sizeof(tdb));
- if(subsigs > 64) {
- cli_errmsg("cli_loadldb: Broken logical expression or too many subsignatures\n");
- ret = CL_EMALFDB;
- break;
+ root->ac_lsigs++;
+ newtable = (struct cli_ac_lsig **) mpool_realloc(engine->mempool, root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
+ if(!newtable) {
+ root->ac_lsigs--;
+ cli_errmsg("cli_loadldb: Can't realloc root->ac_lsigtable\n");
+ FREE_TDB(tdb);
+ mpool_free(engine->mempool, lsig);
+ return CL_EMEM;
+ }
+ newtable[root->ac_lsigs - 1] = lsig;
+ root->ac_lsigtable = newtable;
+
+ for(i = 0; i < subsigs; i++) {
+ if(i >= tokens_count) {
+ cli_errmsg("cli_loadldb: Missing subsignature id %u\n", i);
+ return CL_EMALFDB;
}
+ lsigid[1] = i;
+ sig = tokens[3 + i];
- /* TDB */
- memset(&tdb, 0, sizeof(tdb));
-#ifdef USE_MPOOL
- tdb.mempool = engine->mempool;
-#endif
+ if((pt = strchr(tokens[3 + i], ':'))) {
+ *pt = 0;
+ sig = ++pt;
+ offset = tokens[3 + i];
+ } else {
+ offset = "*";
+ sig = tokens[3 + i];
+ }
- if(lsigattribs(tokens[1], &tdb) == -1) {
- FREE_TDB(tdb);
- ret = CL_EMALFDB;
- break;
+ if((ret = cli_parse_add(root, virname, sig, 0, 0, offset, target, lsigid, options))) {
+ return CL_EMALFDB;
}
if(tdb.engine) {
if(tdb.engine[0] > cl_retflevel()) {
cli_dbgmsg("cli_loadldb: Signature for %s not loaded (required f-level: %u)\n", virname, tdb.engine[0]);
FREE_TDB(tdb);
- sigs--;
- continue;
+ *sigs--;
+ return CL_SUCCESS;
} else if(tdb.engine[1] < cl_retflevel()) {
FREE_TDB(tdb);
- sigs--;
- continue;
+ *sigs--;
+ return CL_SUCCESS;
}
}
+ }
+ return CL_SUCCESS;
+}
- if(!tdb.target) {
- cli_errmsg("cli_loadldb: No target specified in TDB\n");
- FREE_TDB(tdb);
- ret = CL_EMALFDB;
- break;
- } else if(tdb.target[0] >= CLI_MTARGETS) {
- cli_dbgmsg("cli_loadldb: Not supported target type in logical signature for %s\n", virname);
- FREE_TDB(tdb);
- sigs--;
- continue;
- }
-
- root = engine->root[tdb.target[0]];
-
- lsig = (struct cli_ac_lsig *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_ac_lsig));
- if(!lsig) {
- cli_errmsg("cli_loadldb: Can't allocate memory for lsig\n");
- FREE_TDB(tdb);
- ret = CL_EMEM;
- break;
- }
-
- lsig->logic = cli_mpool_strdup(engine->mempool, logic);
- if(!lsig->logic) {
- cli_errmsg("cli_loadldb: Can't allocate memory for lsig->logic\n");
- FREE_TDB(tdb);
- ret = CL_EMEM;
- mpool_free(engine->mempool, lsig);
- break;
- }
-
- lsigid[0] = lsig->id = root->ac_lsigs;
- memcpy(&lsig->tdb, &tdb, sizeof(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 buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1];
+ unsigned int line = 0, sigs = 0;
+ int ret;
- root->ac_lsigs++;
- newtable = (struct cli_ac_lsig **) mpool_realloc(engine->mempool, root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
- if(!newtable) {
- root->ac_lsigs--;
- cli_errmsg("cli_loadldb: Can't realloc root->ac_lsigtable\n");
- FREE_TDB(tdb);
- mpool_free(engine->mempool, lsig);
- ret = CL_EMEM;
- break;
- }
- newtable[root->ac_lsigs - 1] = lsig;
- root->ac_lsigtable = newtable;
- for(i = 0; i < subsigs; i++) {
- if(i >= tokens_count) {
- cli_errmsg("cli_loadldb: Missing subsignature id %u\n", i);
- ret = CL_EMALFDB;
- break;
- }
- lsigid[1] = i;
- sig = tokens[3 + i];
+ if((ret = cli_initroots(engine, options)))
+ return ret;
- if((pt = strchr(tokens[3 + i], ':'))) {
- *pt = 0;
- sig = ++pt;
- offset = tokens[3 + i];
- } else {
- offset = "*";
- sig = tokens[3 + i];
- }
+ while(cli_dbgets(buffer, sizeof(buffer), fs, dbio)) {
+ line++;
+ sigs++;
+ cli_chomp(buffer);
- if((ret = cli_parse_add(root, virname, sig, 0, 0, offset, target, lsigid, options))) {
- ret = CL_EMALFDB;
- break;
- }
- }
- if(ret)
+ ret = load_oneldb(buffer,
+ engine->pua_cats && (options & CL_DB_PUA_MODE) && (options & (CL_DB_PUA_INCLUDE | CL_DB_PUA_EXCLUDE)),
+ !!engine->ignored,
+ engine, options, dbname, line, &sigs);
+ if (ret)
break;
}
@@ -1034,6 +1031,10 @@ static int cli_loadcbc(FILE *fs, struct cl_engine *engine, unsigned int *signo,
fprintf(stderr,"Unable to load %s bytecode: %s\n", dbname, cl_strerror(rc));
return rc;
}
+ if (bc->lsig) {
+ cli_dbgmsg("Bytecode %s has logical signature: %s\n", dbname, bc->lsig);
+
+ }
return CL_SUCCESS;
}
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list