comparison contrib/fuzz/pyutil.cc @ 43859:8766728dbce6

fuzz: add support for fuzzing under either Python 2 or 3 This was more of a hairball than I hoped, but it appears to work. The hg-py3 branch of my oss-fuzz fork on github has the remaining changes to switch us to Python 3, but we may as well retain Python 2 fuzzing support for at least a little while. Differential Revision: https://phab.mercurial-scm.org/D7592
author Augie Fackler <augie@google.com>
date Mon, 09 Dec 2019 22:20:35 -0500
parents c78f8f0720cc
children ee5f27d7b9fb
comparison
equal deleted inserted replaced
43858:b0867b7751ba 43859:8766728dbce6
4 #include <string> 4 #include <string>
5 5
6 namespace contrib 6 namespace contrib
7 { 7 {
8 8
9 #if PY_MAJOR_VERSION >= 3
10 #define HG_FUZZER_PY3 1
11 PyMODINIT_FUNC PyInit_parsers(void);
12 #else
13 PyMODINIT_FUNC initparsers(void);
14 #endif
15
9 static char cpypath[8192] = "\0"; 16 static char cpypath[8192] = "\0";
10 17
11 static PyObject *mainmod; 18 static PyObject *mainmod;
12 static PyObject *globals; 19 static PyObject *globals;
13 20
14 /* TODO: use Python 3 for this fuzzing? */
15 PyMODINIT_FUNC initparsers(void);
16
17 void initpy(const char *cselfpath) 21 void initpy(const char *cselfpath)
18 { 22 {
23 #ifdef HG_FUZZER_PY3
24 const std::string subdir = "/sanpy/lib/python3.7";
25 #else
19 const std::string subdir = "/sanpy/lib/python2.7"; 26 const std::string subdir = "/sanpy/lib/python2.7";
27 #endif
28
20 /* HACK ALERT: we need a full Python installation built without 29 /* HACK ALERT: we need a full Python installation built without
21 pymalloc and with ASAN, so we dump one in 30 pymalloc and with ASAN, so we dump one in
22 $OUT/sanpy/lib/python2.7. This helps us wire that up. */ 31 $OUT/sanpy/lib/python2.7. This helps us wire that up. */
23 std::string selfpath(cselfpath); 32 std::string selfpath(cselfpath);
24 std::string pypath; 33 std::string pypath;
37 strncpy(cpypath, pypath.c_str(), pypath.size()); 46 strncpy(cpypath, pypath.c_str(), pypath.size());
38 setenv("PYTHONPATH", cpypath, 1); 47 setenv("PYTHONPATH", cpypath, 1);
39 setenv("PYTHONNOUSERSITE", "1", 1); 48 setenv("PYTHONNOUSERSITE", "1", 1);
40 /* prevent Python from looking up users in the fuzz environment */ 49 /* prevent Python from looking up users in the fuzz environment */
41 setenv("PYTHONUSERBASE", cpypath, 1); 50 setenv("PYTHONUSERBASE", cpypath, 1);
51 #ifdef HG_FUZZER_PY3
52 std::wstring wcpypath(pypath.begin(), pypath.end());
53 Py_SetPythonHome(wcpypath.c_str());
54 #else
42 Py_SetPythonHome(cpypath); 55 Py_SetPythonHome(cpypath);
56 #endif
43 Py_InitializeEx(0); 57 Py_InitializeEx(0);
44 mainmod = PyImport_AddModule("__main__"); 58 mainmod = PyImport_AddModule("__main__");
45 globals = PyModule_GetDict(mainmod); 59 globals = PyModule_GetDict(mainmod);
60
61 #ifdef HG_FUZZER_PY3
62 PyObject *mod = PyInit_parsers();
63 #else
46 initparsers(); 64 initparsers();
65 PyObject *mod = PyImport_ImportModule("parsers");
66 #endif
67
68 PyDict_SetItemString(globals, "parsers", mod);
47 } 69 }
48 70
49 PyObject *pyglobals() 71 PyObject *pyglobals()
50 { 72 {
51 return globals; 73 return globals;