summaryrefslogtreecommitdiffstats
path: root/Modules/_xxtestfuzz/_xxtestfuzz.c
diff options
context:
space:
mode:
authorDevin Jeanpierre <jeanpierreda@gmail.com>2017-09-06 18:15:35 (GMT)
committerGregory P. Smith <greg@krypto.org>2017-09-06 18:15:35 (GMT)
commitc5bace2bf7874cf47ef56e1d8d19f79ad892eef5 (patch)
tree30154359cfc75d55b8164619bcfaaaa65d2378ec /Modules/_xxtestfuzz/_xxtestfuzz.c
parent5fcd5e64eec9ed67613b8fe7356fb8288151ceba (diff)
downloadcpython-c5bace2bf7874cf47ef56e1d8d19f79ad892eef5.zip
cpython-c5bace2bf7874cf47ef56e1d8d19f79ad892eef5.tar.gz
cpython-c5bace2bf7874cf47ef56e1d8d19f79ad892eef5.tar.bz2
bpo-29505: Add fuzz tests for float(str), int(str), unicode(str) (#2878)
Add basic fuzz tests for a few common builtin functions. This is an easy place to start, and these functions are probably safe. We'll want to add more fuzz tests later. Lets bootstrap using these. While the fuzz tests are included in CPython and compiled / tested on a very basic level inside CPython itself, the actual fuzzing happens as part of oss-fuzz (https://github.com/google/oss-fuzz). The reason to include the tests in CPython is to make sure that they're maintained as part of the CPython project, especially when (as some eventually will) they use internal implementation details in the test. (This will be necessary sometimes because e.g. the fuzz test should never enter Python's interpreter loop, whereas some APIs only expose themselves publicly as Python functions.) This particular set of changes is part of testing Python's builtins, tracked internally at Google by b/37562550. The _xxtestfuzz module that this change adds need not be shipped with binary distributions of Python.
Diffstat (limited to 'Modules/_xxtestfuzz/_xxtestfuzz.c')
-rw-r--r--Modules/_xxtestfuzz/_xxtestfuzz.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/Modules/_xxtestfuzz/_xxtestfuzz.c b/Modules/_xxtestfuzz/_xxtestfuzz.c
new file mode 100644
index 0000000..781dd23
--- /dev/null
+++ b/Modules/_xxtestfuzz/_xxtestfuzz.c
@@ -0,0 +1,53 @@
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static PyObject* _fuzz_run(PyObject* self, PyObject* args) {
+ const char* buf;
+ Py_ssize_t size;
+ if (!PyArg_ParseTuple(args, "s#", &buf, &size)) {
+ return NULL;
+ }
+ int rv = LLVMFuzzerTestOneInput((const uint8_t*)buf, size);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+ if (rv != 0) {
+ // Nonzero return codes are reserved for future use.
+ PyErr_Format(
+ PyExc_RuntimeError, "Nonzero return code from fuzzer: %d", rv);
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef module_methods[] = {
+ {"run", (PyCFunction)_fuzz_run, METH_VARARGS, ""},
+ {NULL},
+};
+
+static struct PyModuleDef _fuzzmodule = {
+ PyModuleDef_HEAD_INIT,
+ "_fuzz",
+ NULL,
+ 0,
+ module_methods,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit__xxtestfuzz(void)
+{
+ PyObject *m = NULL;
+
+ if ((m = PyModule_Create(&_fuzzmodule)) == NULL) {
+ return NULL;
+ }
+ return m;
+}