patch-nad0013 fix two OS X wchar_t conversion problems in 3.x Issue5143 identified: Modules/main.c: In function ‘Py_Main’: Modules/main.c:491: warning: passing argument 1 of ‘Py_SetProgramName’ from incompatible pointer type In addition, OS X build output shows: Modules/getpath.c: In function ‘calculate_path’: Modules/getpath.c:489: warning: passing argument 1 of ‘_NSGetExecutablePath’ from incompatible pointer type SOLUTION Fix two OS X-only cases missed in the 2.x to 3.x conversions to wchar. Based on test patch from Ronald Oussoren. APPLIES py3k, 3.0 diff -r c22e80f49e71 Modules/getpath.c --- Modules/getpath.c Wed Feb 04 13:05:16 2009 -0800 +++ Modules/getpath.c Thu Feb 05 15:30:57 2009 -0800 @@ -457,6 +457,7 @@ #else unsigned long nsexeclength = MAXPATHLEN; #endif + char execpath[MAXPATHLEN+1]; #endif if (_path) { @@ -486,8 +487,13 @@ * will fail if a relative path was used. but in that case, * absolutize() should help us out below */ - else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP) - ; + else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && execpath[0] == SEP) { + size_t r = mbstowcs(progpath, execpath, MAXPATHLEN+1); + if (r == (size_t)-1 || r > MAXPATHLEN) { + /* Could not convert execpath, or it's too long. */ + progpath[0] = '\0'; + } + } #endif /* __APPLE__ */ else if (path) { while (1) { diff -r c22e80f49e71 Modules/main.c --- Modules/main.c Wed Feb 04 13:05:16 2009 -0800 +++ Modules/main.c Thu Feb 05 15:30:57 2009 -0800 @@ -487,10 +487,23 @@ so the actual executable path is passed in an environment variable. See Lib/plat-mac/bundlebuiler.py for details about the bootstrap script. */ - if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') - Py_SetProgramName(p); - else + if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') { + wchar_t* buffer; + size_t len = strlen(p); + size_t r; + + buffer = malloc(len * sizeof(wchar_t)); + if (buffer == NULL) { + Py_FatalError( + "not enough memory to copy PYTHONEXECUTABLE"); + } + + r = mbstowcs(buffer, p, len); + Py_SetProgramName(buffer); + /* buffer is now handed off - do not free */ + } else { Py_SetProgramName(argv[0]); + } #else Py_SetProgramName(argv[0]); #endif