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