Browse code

archive metadata callback

Török Edvin authored on 2011/08/22 21:22:55
Showing 5 changed files
... ...
@@ -303,6 +303,12 @@ extern void cl_set_clcb_msg(clcb_msg callback);
303 303
 typedef void (*clcb_hash)(int fd, unsigned long long size, const unsigned char *md5, const char *virname, void *context);
304 304
 extern void cl_engine_set_clcb_hash(struct cl_engine *engine, clcb_hash callback);
305 305
 
306
+/* Archive member metadata callback. Return CL_VIRUS to blacklist, CL_CLEAN to
307
+ * continue scanning */
308
+typedef cl_error_t (*clcb_meta)(const char* container_type, unsigned long fsize_container, const char *filename,
309
+			  unsigned long fsize_real,  int is_encrypted, unsigned int filepos_container, void *context);
310
+extern void cl_engine_set_clcb_meta(struct cl_engine *engine, clcb_meta callback);
311
+
306 312
 struct cl_stat {
307 313
     char *dir;
308 314
     struct stat *stattab;
... ...
@@ -12,6 +12,7 @@ CLAMAV_PUBLIC {
12 12
     cl_engine_set_str;
13 13
     cl_engine_get_str;
14 14
     cl_engine_set_clcb_hash;
15
+    cl_engine_set_clcb_meta;
15 16
     cl_set_clcb_msg;
16 17
     cl_engine_set_clcb_pre_scan;
17 18
     cl_engine_set_clcb_post_scan;
... ...
@@ -818,6 +818,15 @@ int cli_matchmeta(cli_ctx *ctx, const char *fname, size_t fsizec, size_t fsizer,
818 818
 {
819 819
 	const struct cli_cdb *cdb;
820 820
 
821
+    cli_dbgmsg("CDBNAME:%s:%lu:%s:%lu:%lu:%d:%u:%u:%p\n",
822
+	       cli_ftname(ctx->container_type), fsizec, fname, fsizec, fsizer, encrypted, filepos, res1, res2);
823
+
824
+    if (ctx->engine && ctx->engine->cb_meta)
825
+	if (ctx->engine->cb_meta(cli_ftname(ctx->container_type), fsizec, fname, fsizer, encrypted, filepos, ctx->cb_ctx) == CL_VIRUS) {
826
+	    cli_dbgmsg("inner file blacklisted by callback: %s\n", fname);
827
+	    return CL_VIRUS;
828
+	}
829
+
821 830
     if(!(cdb = ctx->engine->cdb))
822 831
 	return CL_CLEAN;
823 832
 
... ...
@@ -1087,3 +1087,8 @@ void cl_engine_set_clcb_hash(struct cl_engine *engine, clcb_hash callback)
1087 1087
 {
1088 1088
     engine->cb_hash = callback;
1089 1089
 }
1090
+
1091
+void cl_engine_set_clcb_meta(struct cl_engine *engine, clcb_meta callback)
1092
+{
1093
+    engine->cb_meta = callback;
1094
+}
... ...
@@ -258,6 +258,7 @@ struct cl_engine {
258 258
     clcb_sigload cb_sigload;
259 259
     void *cb_sigload_ctx;
260 260
     clcb_hash cb_hash;
261
+    clcb_meta cb_meta;
261 262
 
262 263
     /* Used for bytecode */
263 264
     struct cli_all_bc bcs;