Branch data Line data Source code
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 : 8 : static PyObject* _fuzz_run(PyObject* self, PyObject* args) {
9 : : const char* buf;
10 : : Py_ssize_t size;
11 [ - + ]: 8 : if (!PyArg_ParseTuple(args, "s#", &buf, &size)) {
12 : 0 : return NULL;
13 : : }
14 : 8 : int rv = LLVMFuzzerTestOneInput((const uint8_t*)buf, size);
15 [ - + ]: 8 : if (PyErr_Occurred()) {
16 : 0 : return NULL;
17 : : }
18 [ - + ]: 8 : if (rv != 0) {
19 : : // Nonzero return codes are reserved for future use.
20 : 0 : PyErr_Format(
21 : : PyExc_RuntimeError, "Nonzero return code from fuzzer: %d", rv);
22 : 0 : return NULL;
23 : : }
24 : 8 : 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 : 2 : PyInit__xxtestfuzz(void)
46 : : {
47 : 2 : return PyModule_Create(&_fuzzmodule);
48 : : }
|