D5154: fuzz: move many initialization steps into LLVMFuzzerInitialize
durin42 (Augie Fackler)
phabricator at mercurial-scm.org
Thu Oct 18 20:37:00 UTC 2018
durin42 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
Doing this means that things we intentionally leak (eg type objects)
no longer confuse AddressSanitizer, so now we can run the fuzzer MUCH
longer.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D5154
AFFECTED FILES
contrib/fuzz/manifest.cc
CHANGE DETAILS
diff --git a/contrib/fuzz/manifest.cc b/contrib/fuzz/manifest.cc
--- a/contrib/fuzz/manifest.cc
+++ b/contrib/fuzz/manifest.cc
@@ -12,6 +12,10 @@
static char cpypath[8192] = "\0";
+static PyCodeObject *code;
+static PyObject *mainmod;
+static PyObject *globals;
+
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
const std::string subdir = "/sanpy/lib/python2.7";
@@ -35,20 +39,8 @@
setenv("PYTHONUSERBASE", cpypath, 1);
Py_SetPythonHome(cpypath);
Py_InitializeEx(0);
- return 0;
-}
-
-int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
-{
initparsers();
- PyObject *mtext =
- PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
- PyObject *mainmod = PyImport_AddModule("__main__");
- PyObject *globals = PyModule_GetDict(mainmod);
- PyObject *locals = PyDict_New();
- PyDict_SetItemString(locals, "mdata", mtext);
- PyCodeObject *code =
- (PyCodeObject *)Py_CompileString(R"py(
+ code = (PyCodeObject *)Py_CompileString(R"py(
from parsers import lazymanifest
try:
lm = lazymanifest(mdata)
@@ -67,13 +59,23 @@
# to debug failures.
# print e
)py",
- "fuzzer", Py_file_input);
+ "fuzzer", Py_file_input);
+ mainmod = PyImport_AddModule("__main__");
+ globals = PyModule_GetDict(mainmod);
+ return 0;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
+{
+ PyObject *mtext =
+ PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
+ PyObject *locals = PyDict_New();
+ PyDict_SetItemString(locals, "mdata", mtext);
PyObject *res = PyEval_EvalCode(code, globals, locals);
if (!res) {
PyErr_Print();
}
Py_XDECREF(res);
- Py_DECREF(code);
Py_DECREF(locals);
Py_DECREF(mtext);
return 0; // Non-zero return values are reserved for future use.
To: durin42, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list