From 48680b985288048bb38116108c0b55acce23b6b9 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 19 Dec 2021 22:37:45 +0100 Subject: [PATCH] Add a fuzzer based on atheris --- tests/fuzz.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/fuzz.py diff --git a/tests/fuzz.py b/tests/fuzz.py new file mode 100644 index 0000000..a12f92d --- /dev/null +++ b/tests/fuzz.py @@ -0,0 +1,54 @@ +import mimetypes +import os +import sys + +sys.path.append('..') + +import atheris + +with atheris.instrument_imports(enable_loader_override=False): + from libmat2 import parser_factory, UNSUPPORTED_EXTENSIONS + +extensions = set() +for parser in parser_factory._get_parsers(): # type: ignore + for mtype in parser.mimetypes: + if mtype.startswith('video'): + continue + if 'aif' in mtype: + continue + if 'wav' in mtype: + continue + if 'gif' in mtype: + continue + if 'aifc' in mtype: + continue + for extension in mimetypes.guess_all_extensions(mtype): + if extension not in UNSUPPORTED_EXTENSIONS: + extensions.add(extension) +extensions = list(extensions) + + + +def TestOneInput(data): + fdp = atheris.FuzzedDataProvider(data) + extension = fdp.PickValueInList(extensions) + data = fdp.ConsumeBytes(sys.maxsize) + + fname = '/tmp/mat2_fuzz' + extension + + with open(fname, 'wb') as f: + f.write(data) + try: + p, _ = parser_factory.get_parser(fname) + if p: + p.sandbox = False + p.get_meta() + p.remove_all() + p, _ = parser_factory.get_parser(fname) + p.get_meta() + except ValueError: + pass + os.remove(fname) + +atheris.Setup(sys.argv, TestOneInput) +atheris.Fuzz()