... | ... |
@@ -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; |
... | ... |
@@ -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 |
+} |