1515#define PY_SSIZE_T_CLEAN
1616#include < Python.h>
1717
18+ static std::string ToAbsolutePath (const std::string argv0, const std::string relativePath) {
19+ char absoluteRootPath[PATH_MAX+1 ];
20+ char argv0Copy[argv0.size ()+1 ];
21+ memcpy (argv0Copy, argv0.c_str (), argv0.size ()+1 );
22+ if ( realpath (dirname (argv0Copy), absoluteRootPath) == nullptr ) {
23+ printf (" Fatal error: Cannot resolve absolute root path\n " );
24+ abort ();
25+ }
26+
27+ return std::string (std::string (absoluteRootPath) + " /" + relativePath);
28+ }
29+
1830void * pFunc = nullptr ;
1931extern " C" int LLVMFuzzerInitialize (int * argc, char *** argv) {
2032 const std::string argv0 = (*argv)[0 ];
2133
22- std::string scriptRootPath;
34+ const std::string absoluteCPythonInstallPath = ToAbsolutePath (argv0, " cpython-install" );
35+ const std::string absoluteScriptPath = ToAbsolutePath (argv0, PYTHON_HARNESS_PATH);
2336
2437 std::vector<uint8_t > program;
25- FILE* fp = fopen (PYTHON_HARNESS_PATH, " rb" );
38+
39+ {
40+ if ( setenv (" PYTHONHOME" , absoluteCPythonInstallPath.c_str (), 1 ) != 0 ) {
41+ printf (" Fatal error: Cannot set PYTHONHOME\n " );
42+ abort ();
43+ }
44+ }
45+
46+ FILE* fp = fopen (absoluteScriptPath.c_str (), " rb" );
2647 if ( fp == nullptr ) {
27- printf (" Fatal error: Cannot open script: %s\n " , PYTHON_HARNESS_PATH );
48+ printf (" Fatal error: Cannot open script: %s\n " , absoluteScriptPath. c_str () );
2849 abort ();
2950 }
3051
@@ -44,16 +65,6 @@ extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
4465
4566 std::string code = std::string (program.data (), program.data () + program.size ());
4667
47- {
48- /* Resolve script root path */
49- char resolved_path[PATH_MAX+1 ];
50- if ( realpath (PYTHON_HARNESS_PATH, resolved_path) == nullptr ) {
51- printf (" Fatal error: Cannot resolve full script path\n " );
52- abort ();
53- }
54- scriptRootPath = std::string (dirname (resolved_path));
55- }
56-
5768 {
5869 wchar_t *program = Py_DecodeLocale (argv0.c_str (), nullptr );
5970 Py_SetProgramName (program);
@@ -66,7 +77,7 @@ extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
6677 std::string setArgv0;
6778 setArgv0 += " import sys" ;
6879 setArgv0 += " \n " ;
69- setArgv0 += " sys.argv[0] = '" + std::string (PYTHON_HARNESS_PATH) + " '\n " ;
80+ setArgv0 += " sys.argv[0] = '" + absoluteScriptPath + " '\n " ;
7081 if ( PyRun_SimpleString (setArgv0.c_str ()) != 0 ) {
7182 printf (" Fatal: Cannot set argv[0]\n " );
7283 PyErr_PrintEx (1 );
@@ -78,7 +89,7 @@ extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
7889 std::string setPYTHONPATH;
7990 setPYTHONPATH += " import sys" ;
8091 setPYTHONPATH += " \n " ;
81- setPYTHONPATH += " sys.path.append('" + scriptRootPath + " ')\n " ;
92+ setPYTHONPATH += " sys.path.append('" + absoluteScriptPath + " ')\n " ;
8293 setPYTHONPATH += " \n " ;
8394 if ( PyRun_SimpleString (setPYTHONPATH.c_str ()) != 0 ) {
8495 printf (" Fatal: Cannot set PYTHONPATH\n " );
0 commit comments