diff options
-rw-r--r-- | src/analysis/scan/patterns/backends/acism.c | 3 | ||||
-rw-r--r-- | tests/analysis/scan/fuzzing.py | 34 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/analysis/scan/patterns/backends/acism.c b/src/analysis/scan/patterns/backends/acism.c index eef681a..97f8561 100644 --- a/src/analysis/scan/patterns/backends/acism.c +++ b/src/analysis/scan/patterns/backends/acism.c @@ -1165,6 +1165,7 @@ static void g_acism_backend_run_scan(const GAcismBackend *backend, GScanContext #endif root = backend->states; + if (root == NULL) goto done; state = root; @@ -1240,6 +1241,8 @@ static void g_acism_backend_run_scan(const GAcismBackend *backend, GScanContext } + done: + g_object_unref(G_OBJECT(content)); } diff --git a/tests/analysis/scan/fuzzing.py b/tests/analysis/scan/fuzzing.py new file mode 100644 index 0000000..64eeb33 --- /dev/null +++ b/tests/analysis/scan/fuzzing.py @@ -0,0 +1,34 @@ + +from chrysacase import ChrysalideTestCase +from pychrysalide.analysis.contents import MemoryContent +from pychrysalide.analysis.scan import ContentScanner +from pychrysalide.analysis.scan import ScanOptions +from pychrysalide.analysis.scan.patterns.backends import AcismBackend +from pychrysalide.analysis.scan.patterns.backends import BitapBackend + + +class TestRostFuzzingFixes(ChrysalideTestCase): + """TestCases to remember all the fixes for crashes identified by fuzzing.""" + + def testEmptyPatternListWithContent(self): + """Check no backend is run if there is no pattern to look for.""" + + content = MemoryContent(b'\n') + + rule = ''' +''' + + backends = [ + AcismBackend, # This one was segfaulting + BitapBackend, + ] + + for b in backends: + + options = ScanOptions() + options.backend_for_data = b + + scanner = ContentScanner(rule) + ctx = scanner.analyze(options, content) + + self.assertIsNotNone(ctx) |