* prefiltering_split:
move matching code to matcher_run.
matcher-ac: move leaf checks inside IS_FINAL.
Conflicts:
libclamav/matcher.c
... | ... |
@@ -333,7 +333,7 @@ static int ac_maketrans(struct cli_matcher *root) |
333 | 333 |
continue; |
334 | 334 |
for(i = 0; i < 256; i++) { |
335 | 335 |
child = node->trans[i]; |
336 |
- if(!child) { |
|
336 |
+ if (!child || (!IS_FINAL(child) && IS_LEAF(child))) { |
|
337 | 337 |
struct cli_ac_node *failtarget = node->fail; |
338 | 338 |
while(IS_LEAF(failtarget) || !failtarget->trans[i]) |
339 | 339 |
failtarget = failtarget->fail; |
... | ... |
@@ -1132,14 +1132,12 @@ int cli_ac_scanbuff(const unsigned char *buffer, uint32_t length, const char **v |
1132 | 1132 |
current = root->ac_root; |
1133 | 1133 |
|
1134 | 1134 |
for(i = 0; i < length; i++) { |
1135 |
- |
|
1136 |
- if(IS_LEAF(current)) |
|
1137 |
- current = current->fail; |
|
1138 |
- |
|
1139 | 1135 |
current = current->trans[buffer[i]]; |
1140 | 1136 |
|
1141 | 1137 |
if(IS_FINAL(current)) { |
1142 | 1138 |
patt = current->list; |
1139 |
+ if (IS_LEAF(current)) |
|
1140 |
+ current = current->fail; |
|
1143 | 1141 |
while(patt) { |
1144 | 1142 |
bp = i + 1 - patt->depth; |
1145 | 1143 |
if(patt->offdata[0] != CLI_OFF_VERSION && patt->offdata[0] != CLI_OFF_MACRO && !patt->next_same && (patt->offset_min != CLI_OFF_ANY) && (!patt->sigid || patt->partno == 1)) { |
... | ... |
@@ -49,6 +49,22 @@ |
49 | 49 |
#include "pe_icons.h" |
50 | 50 |
#include "regex/regex.h" |
51 | 51 |
|
52 |
+static inline int matcher_run(const struct cli_matcher *root, |
|
53 |
+ const unsigned char *buffer, uint32_t length, |
|
54 |
+ const char **virname, struct cli_ac_data *mdata, |
|
55 |
+ uint32_t offset, |
|
56 |
+ cli_file_t ftype, |
|
57 |
+ struct cli_matched_type **ftoffset, |
|
58 |
+ unsigned int acmode, |
|
59 |
+ fmap_t *map, |
|
60 |
+ struct cli_bm_off *offdata) |
|
61 |
+{ |
|
62 |
+ int ret; |
|
63 |
+ if (root->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, root, offset, map, offdata)) != CL_VIRUS) |
|
64 |
+ ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, root, mdata, offset, ftype, ftoffset, acmode, NULL); |
|
65 |
+ return ret; |
|
66 |
+} |
|
67 |
+ |
|
52 | 68 |
int cli_scanbuff(const unsigned char *buffer, uint32_t length, uint32_t offset, cli_ctx *ctx, cli_file_t ftype, struct cli_ac_data **acdata) |
53 | 69 |
{ |
54 | 70 |
int ret = CL_CLEAN; |
... | ... |
@@ -79,8 +95,7 @@ int cli_scanbuff(const unsigned char *buffer, uint32_t length, uint32_t offset, |
79 | 79 |
if(!acdata && (ret = cli_ac_initdata(&mdata, troot->ac_partsigs, troot->ac_lsigs, troot->ac_reloff_num, CLI_DEFAULT_AC_TRACKLEN))) |
80 | 80 |
return ret; |
81 | 81 |
|
82 |
- if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, troot, offset, NULL, NULL)) != CL_VIRUS) |
|
83 |
- ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, troot, acdata ? (acdata[0]) : (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL); |
|
82 |
+ ret = matcher_run(troot, buffer, length, virname, acdata ? (acdata[0]): (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL, NULL); |
|
84 | 83 |
|
85 | 84 |
if(!acdata) |
86 | 85 |
cli_ac_freedata(&mdata); |
... | ... |
@@ -92,8 +107,7 @@ int cli_scanbuff(const unsigned char *buffer, uint32_t length, uint32_t offset, |
92 | 92 |
if(!acdata && (ret = cli_ac_initdata(&mdata, groot->ac_partsigs, groot->ac_lsigs, groot->ac_reloff_num, CLI_DEFAULT_AC_TRACKLEN))) |
93 | 93 |
return ret; |
94 | 94 |
|
95 |
- if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, groot, offset, NULL, NULL)) != CL_VIRUS) |
|
96 |
- ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, groot, acdata ? (acdata[1]) : (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL); |
|
95 |
+ ret = matcher_run(groot, buffer, length, virname, acdata ? (acdata[1]): (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL, NULL); |
|
97 | 96 |
|
98 | 97 |
if(!acdata) |
99 | 98 |
cli_ac_freedata(&mdata); |
... | ... |
@@ -444,8 +458,8 @@ int cli_fmap_scandesc(cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struct cli |
444 | 444 |
*ctx->scanned += bytes / CL_COUNT_PRECISION; |
445 | 445 |
|
446 | 446 |
if(troot) { |
447 |
- if(troot->ac_only || (ret = cli_bm_scanbuff(buff, bytes, ctx->virname, NULL, troot, offset, map, bm_offmode ? &toff : NULL)) != CL_VIRUS) |
|
448 |
- ret = cli_ac_scanbuff(buff, bytes, ctx->virname, NULL, NULL, troot, &tdata, offset, ftype, ftoffset, acmode, NULL); |
|
447 |
+ ret = matcher_run(troot, buff, bytes, ctx->virname, &tdata, offset, ftype, ftoffset, acmode, map, bm_offmode ? &toff : NULL); |
|
448 |
+ |
|
449 | 449 |
if(ret == CL_VIRUS) { |
450 | 450 |
if(!ftonly) |
451 | 451 |
cli_ac_freedata(&gdata); |