pyutil.cc
54 lines
| 1.3 KiB
| text/x-c
|
CppLexer
Augie Fackler
|
r41049 | #include "pyutil.h" | ||
Augie Fackler
|
r44259 | #include <iostream> | ||
Augie Fackler
|
r41049 | #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]; | ||||
Augie Fackler
|
r44259 | if (!getcwd(wd, 8192)) { | ||
std::cerr << "Failed to call getcwd: errno " << errno | ||||
<< std::endl; | ||||
exit(1); | ||||
} | ||||
Augie Fackler
|
r41049 | 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 | ||||