From f0a5895b58fdd2c3e83bb330eb665ac091856845 Mon Sep 17 00:00:00 2001 From: aCaB Date: Mon, 2 Jan 2012 17:34:31 +0100 Subject: [PATCH] load it! --- libclamav/asn1.c | 52 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/libclamav/asn1.c b/libclamav/asn1.c index 9ded7f697..89fb06405 100644 --- a/libclamav/asn1.c +++ b/libclamav/asn1.c @@ -28,6 +28,7 @@ #include "sha1.h" #include "md5.h" #include "bignum.h" +#include "matcher-hash.h" /* --------------------------------------------------------------------------- OIDS */ #define OID_1_3_14_3_2_26 "\x2b\x0e\x03\x02\x1a" @@ -1094,12 +1095,14 @@ static int asn1_parse_mscat(fmap_t *map, void *start, unsigned int size, crtmgr int asn1_load_mscat(fmap_t *map, void *start, unsigned int size, struct cl_engine *engine) { struct cli_asn1 c; - void *hashes; + char sha1[SHA1_HASH_SIZE*2+1], *virname; + struct cli_matcher *db; + int i; - if(asn1_parse_mscat(map, start, size, &engine->cmgr, 0, &hashes, &size)) + if(asn1_parse_mscat(map, start, size, &engine->cmgr, 0, &c.next, &size)) return 1; - if(asn1_expect_objtype(map, hashes, &size, &c, 0x30)) + if(asn1_expect_objtype(map, c.next, &size, &c, 0x30)) return 1; if(asn1_expect_obj(map, &c.content, &c.size, 0x06, lenof(OID_szOID_CATALOG_LIST), OID_szOID_CATALOG_LIST)) return 1; @@ -1201,11 +1204,11 @@ int asn1_load_mscat(fmap_t *map, void *start, unsigned int size, struct cl_engin tag.size = 1; break; } - if(!memcmp(tagval3.content, OID_SPC_PE_IMAGE_DATA_OBJID, lenof(OID_SPC_PE_IMAGE_DATA_OBJID))) { + if(!memcmp(tagval3.content, OID_SPC_PE_IMAGE_DATA_OBJID, lenof(OID_SPC_PE_IMAGE_DATA_OBJID))) + hashtype = 2; + else if(!memcmp(tagval3.content, OID_SPC_CAB_DATA_OBJID, lenof(OID_SPC_CAB_DATA_OBJID))) hashtype = 1; - } else if(!memcmp(tagval3.content, OID_SPC_CAB_DATA_OBJID, lenof(OID_SPC_CAB_DATA_OBJID))) { - hashtype = 0; - } else { + else { cli_dbgmsg("asn1_load_mscat: unexpected hash type\n"); tag.size = 1; break; @@ -1243,12 +1246,35 @@ int asn1_load_mscat(fmap_t *map, void *start, unsigned int size, struct cl_engin tag.size = 1; break; } - { - char sha1[SHA1_HASH_SIZE*2+1]; - int i; - for(i=0;imempool, "CAT", 1); + if(!virname) { + /* FIXME FAIL HERE */ + tag.size = 1; + break; + } + + if(!engine->hm_fp) { + if(!(engine->hm_fp = mpool_calloc(engine->mempool, 1, sizeof(*db)))) { + /* FIXME FAIL HERE */ + tag.size = 1;; + break; + } +#ifdef USE_MPOOL + engine->hm_fp->mempool = engine->mempool; +#endif + } + + + /* FIXME CHECK DUPES!! */ + if((i = hm_addhash(engine->hm_fp, sha1, hashtype, virname))) { + cli_errmsg("asn1_load_mscat: failed to add hash\n"); + mpool_free(engine->mempool, (void *)virname); + break; } } if(tag.size) {