D5154: fuzz: move many initialization steps into LLVMFuzzerInitialize

2018-10-19 Thread durin42 (Augie Fackler)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHGc3ab0a89331d: fuzz: move many initialization steps into 
LLVMFuzzerInitialize (authored by durin42, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D5154?vs=12252&id=12262

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
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D5154: fuzz: move many initialization steps into LLVMFuzzerInitialize

2018-10-18 Thread durin42 (Augie Fackler)
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
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel