Mercurial > hg
diff contrib/fuzz/pyutil.cc @ 41013:ef103c96ed33
fuzz: extract Python initialization to utility package
Avoids code duplication between fuzzers of parsers.so.
Differential Revision: https://phab.mercurial-scm.org/D5461
author | Augie Fackler <augie@google.com> |
---|---|
date | Wed, 19 Dec 2018 21:57:23 -0500 |
parents | |
children | c78f8f0720cc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/fuzz/pyutil.cc Wed Dec 19 21:57:23 2018 -0500 @@ -0,0 +1,49 @@ +#include "pyutil.h" + +#include <string> + +namespace contrib +{ + +static char cpypath[8192] = "\0"; + +static PyObject *mainmod; +static PyObject *globals; + +/* TODO: use Python 3 for this fuzzing? */ +PyMODINIT_FUNC initparsers(void); + +void initpy(const char *cselfpath) +{ + const std::string subdir = "/sanpy/lib/python2.7"; + /* HACK ALERT: we need a full Python installation built without + pymalloc and with ASAN, so we dump one in + $OUT/sanpy/lib/python2.7. This helps us wire that up. */ + std::string selfpath(cselfpath); + std::string pypath; + auto pos = selfpath.rfind("/"); + if (pos == std::string::npos) { + char wd[8192]; + getcwd(wd, 8192); + pypath = std::string(wd) + subdir; + } else { + pypath = selfpath.substr(0, pos) + subdir; + } + strncpy(cpypath, pypath.c_str(), pypath.size()); + setenv("PYTHONPATH", cpypath, 1); + setenv("PYTHONNOUSERSITE", "1", 1); + /* prevent Python from looking up users in the fuzz environment */ + setenv("PYTHONUSERBASE", cpypath, 1); + Py_SetPythonHome(cpypath); + Py_InitializeEx(0); + mainmod = PyImport_AddModule("__main__"); + globals = PyModule_GetDict(mainmod); + initparsers(); +} + +PyObject *pyglobals() +{ + return globals; +} + +} // namespace contrib