D5154: fuzz: move many initialization steps into LLVMFuzzerInitialize
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
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