diff options
author | Ronald Oussoren <ronaldoussoren@mac.com> | 2009-02-12 15:55:38 (GMT) |
---|---|---|
committer | Ronald Oussoren <ronaldoussoren@mac.com> | 2009-02-12 15:55:38 (GMT) |
commit | 3e264e13ede4c3c067dd30052aa0f1e7298342d2 (patch) | |
tree | 4b47a8cb5e4227ab41fc91d2a1f89d373ca1bc88 /Modules | |
parent | 50987bce063bd8ae183a327b0de4c402e4a1a774 (diff) | |
download | cpython-3e264e13ede4c3c067dd30052aa0f1e7298342d2.zip cpython-3e264e13ede4c3c067dd30052aa0f1e7298342d2.tar.gz cpython-3e264e13ede4c3c067dd30052aa0f1e7298342d2.tar.bz2 |
This fixes issue5143 and includes a test.
Issue5143 notes that getpath.c and main.c pass a 'char*' where
a 'wchar_t*' is expected on OSX.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/getpath.c | 10 | ||||
-rw-r--r-- | Modules/main.c | 19 |
2 files changed, 24 insertions, 5 deletions
diff --git a/Modules/getpath.c b/Modules/getpath.c index 064877c..b7f178e 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -457,6 +457,7 @@ calculate_path(void) #else unsigned long nsexeclength = MAXPATHLEN; #endif + char execpath[MAXPATHLEN+1]; #endif if (_path) { @@ -486,8 +487,13 @@ calculate_path(void) * 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 --git a/Modules/main.c b/Modules/main.c index 6de1523..8352e66 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -487,10 +487,23 @@ Py_Main(int argc, wchar_t **argv) 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 |