1#define PY_SSIZE_T_CLEAN
2#include <Python.h>
3#include <stdlib.h>
4#include <inttypes.h>
5
6int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
7
8static 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
27static PyMethodDef module_methods[] = {
28 {"run", (PyCFunction)_fuzz_run, METH_VARARGS, ""},
29 {NULL},
30};
31
32static 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
44PyMODINIT_FUNC
45PyInit__xxtestfuzz(void)
46{
47 return PyModule_Create(&_fuzzmodule);
48}
49