43150
|
1 #include <Python.h>
|
|
2 #include <assert.h>
|
|
3 #include <stdlib.h>
|
|
4 #include <unistd.h>
|
|
5
|
|
6 #include "pyutil.h"
|
|
7
|
|
8 #include <string>
|
|
9
|
|
10 extern "C" {
|
|
11
|
|
12 static PyCodeObject *code;
|
|
13
|
|
14 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
|
|
15 {
|
|
16 contrib::initpy(*argv[0]);
|
|
17 code = (PyCodeObject *)Py_CompileString(R"py(
|
|
18 from parsers import dirs
|
|
19 try:
|
|
20 files = mdata.split('\n')
|
|
21 d = dirs(files)
|
|
22 list(d)
|
|
23 'a' in d
|
|
24 if files:
|
|
25 files[0] in d
|
|
26 except Exception as e:
|
|
27 pass
|
|
28 # uncomment this print if you're editing this Python code
|
|
29 # to debug failures.
|
|
30 # print e
|
|
31 )py",
|
|
32 "fuzzer", Py_file_input);
|
|
33 return 0;
|
|
34 }
|
|
35
|
|
36 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
|
|
37 {
|
|
38 // Don't allow fuzzer inputs larger than 100k, since we'll just bog
|
|
39 // down and not accomplish much.
|
|
40 if (Size > 100000) {
|
|
41 return 0;
|
|
42 }
|
|
43 PyObject *mtext =
|
|
44 PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
|
|
45 PyObject *locals = PyDict_New();
|
|
46 PyDict_SetItemString(locals, "mdata", mtext);
|
|
47 PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
|
|
48 if (!res) {
|
|
49 PyErr_Print();
|
|
50 }
|
|
51 Py_XDECREF(res);
|
|
52 Py_DECREF(locals);
|
|
53 Py_DECREF(mtext);
|
|
54 return 0; // Non-zero return values are reserved for future use.
|
|
55 }
|
|
56 }
|