1 | #define PY_SSIZE_T_CLEAN |
2 | #include <Python.h> |
3 | #include <stdlib.h> |
4 | #include <inttypes.h> |
5 | |
6 | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); |
7 | |
8 | static PyObject* _fuzz_run(PyObject* self, PyObject* args) { |
9 | const char* buf; |
10 | Py_ssize_t size; |
11 | if (!PyArg_ParseTuple(args, "s#" , &buf, &size)) { |
12 | return NULL; |
13 | } |
14 | int rv = LLVMFuzzerTestOneInput((const uint8_t*)buf, size); |
15 | if (PyErr_Occurred()) { |
16 | return NULL; |
17 | } |
18 | if (rv != 0) { |
19 | // Nonzero return codes are reserved for future use. |
20 | PyErr_Format( |
21 | PyExc_RuntimeError, "Nonzero return code from fuzzer: %d" , rv); |
22 | return NULL; |
23 | } |
24 | Py_RETURN_NONE; |
25 | } |
26 | |
27 | static PyMethodDef module_methods[] = { |
28 | {"run" , (PyCFunction)_fuzz_run, METH_VARARGS, "" }, |
29 | {NULL}, |
30 | }; |
31 | |
32 | static struct PyModuleDef _fuzzmodule = { |
33 | PyModuleDef_HEAD_INIT, |
34 | "_fuzz" , |
35 | NULL, |
36 | 0, |
37 | module_methods, |
38 | NULL, |
39 | NULL, |
40 | NULL, |
41 | NULL |
42 | }; |
43 | |
44 | PyMODINIT_FUNC |
45 | PyInit__xxtestfuzz(void) |
46 | { |
47 | return PyModule_Create(&_fuzzmodule); |
48 | } |
49 | |