Commit 01dc512
zkan
Add option to enable PCRE2 JIT for regex subsignature matching
ClamAV compiles regex subsignatures with pcre2_compile() and matches them with
the interpreted pcre2_match(), and never enables the PCRE2 JIT compiler even
when the linked PCRE2 library supports it. For scans where the Aho-Corasick
prefilter promotes many PCRE subsignatures over a large buffer, the interpreted
matcher dominates scan time.
Add a 'PCREJit' clamd.conf option and a '--pcre-jit' clamscan option, exposed
through a new CL_ENGINE_PCRE_JIT engine setting, mirroring how the existing
PCRE limit options are plumbed (engine field, set/get, settings copy/apply).
The option is disabled by default to preserve existing behavior on upgrade.
When enabled, cli_pcre_compile() performs a best-effort pcre2_jit_compile()
after setting the match limits. pcre2_match() automatically dispatches to the
JIT code when a pattern has been JIT-compiled, so no change to the match call
is required for the common path. If JIT compilation fails (PCRE2 built without
JIT, or an unsupported construct), the failure is logged at debug level and
matching falls back to the interpreter.
To guarantee identical results to the interpreter when JIT is enabled,
cli_pcre_match() now retries a match with PCRE2_NO_JIT if the JIT matcher
returns PCRE2_ERROR_JIT_STACKLIMIT (the JIT uses a fixed stack and does not
grow on demand like the interpreter).
On a workload that promotes several hundred PCRE subsignatures over a ~37 MiB
buffer, enabling the option reduced the PCRE phase roughly 3-4x and overall
scan time by about 2x, with no change in detection.1 parent 0c7468e commit 01dc512
16 files changed
Lines changed: 92 additions & 10 deletions
File tree
- clamd
- clamscan
- common
- etc
- libclamav
- unit_tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
18 | 29 | | |
19 | 30 | | |
20 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
741 | 741 | | |
742 | 742 | | |
743 | 743 | | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
744 | 752 | | |
745 | 753 | | |
746 | 754 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
363 | 363 | | |
364 | 364 | | |
365 | 365 | | |
| 366 | + | |
366 | 367 | | |
367 | 368 | | |
368 | 369 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1510 | 1510 | | |
1511 | 1511 | | |
1512 | 1512 | | |
| 1513 | + | |
| 1514 | + | |
| 1515 | + | |
| 1516 | + | |
| 1517 | + | |
| 1518 | + | |
| 1519 | + | |
| 1520 | + | |
1513 | 1521 | | |
1514 | 1522 | | |
1515 | 1523 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
517 | 517 | | |
518 | 518 | | |
519 | 519 | | |
| 520 | + | |
| 521 | + | |
520 | 522 | | |
521 | 523 | | |
522 | 524 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
748 | 748 | | |
749 | 749 | | |
750 | 750 | | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
751 | 762 | | |
752 | 763 | | |
753 | 764 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
343 | 343 | | |
344 | 344 | | |
345 | 345 | | |
| 346 | + | |
346 | 347 | | |
347 | 348 | | |
348 | 349 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
366 | 366 | | |
367 | 367 | | |
368 | 368 | | |
369 | | - | |
| 369 | + | |
370 | 370 | | |
371 | 371 | | |
372 | 372 | | |
| |||
408 | 408 | | |
409 | 409 | | |
410 | 410 | | |
411 | | - | |
| 411 | + | |
412 | 412 | | |
413 | 413 | | |
414 | 414 | | |
415 | | - | |
| 415 | + | |
416 | 416 | | |
417 | 417 | | |
418 | 418 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
0 commit comments