comparison contrib/fuzz/dirstate.cc @ 41015:b444407f635b

fuzz: new fuzzer for dirstate parser Differential Revision: https://phab.mercurial-scm.org/D5463
author Augie Fackler <augie@google.com>
date Wed, 19 Dec 2018 23:48:35 -0500
parents
children 8766728dbce6
comparison
equal deleted inserted replaced
41014:c06f0ef9a5ba 41015:b444407f635b
1 #include <Python.h>
2 #include <assert.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6 #include <string>
7
8 #include "pyutil.h"
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 parse_dirstate
19 try:
20 dmap = {}
21 copymap = {}
22 p = parse_dirstate(dmap, copymap, data)
23 except Exception as e:
24 pass
25 # uncomment this print if you're editing this Python code
26 # to debug failures.
27 # print e
28 )py",
29 "fuzzer", Py_file_input);
30 return 0;
31 }
32
33 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
34 {
35 PyObject *text =
36 PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
37 PyObject *locals = PyDict_New();
38 PyDict_SetItemString(locals, "data", text);
39 PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
40 if (!res) {
41 PyErr_Print();
42 }
43 Py_XDECREF(res);
44 Py_DECREF(locals);
45 Py_DECREF(text);
46 return 0; // Non-zero return values are reserved for future use.
47 }
48 }