Issue #27874: Allows use of pythonXX.zip file as landmark on Windows

This commit is contained in:
Steve Dower 2016-09-09 14:22:43 -07:00
parent 2a1f30f681
commit 502893896a
1 changed files with 20 additions and 15 deletions

View File

@ -24,7 +24,7 @@
* We attempt to locate the "Python Home" - if the PYTHONHOME env var * We attempt to locate the "Python Home" - if the PYTHONHOME env var
is set, we believe it. Otherwise, we use the path of our host .EXE's is set, we believe it. Otherwise, we use the path of our host .EXE's
to try and locate our "landmark" (lib\\os.py) and deduce our home. to try and locate on of our "landmarks" and deduce our home.
- If we DO have a Python Home: The relevant sub-directories (Lib, - If we DO have a Python Home: The relevant sub-directories (Lib,
plat-win, etc) are based on the Python Home plat-win, etc) are based on the Python Home
- If we DO NOT have a Python Home, the core Python Path is - If we DO NOT have a Python Home, the core Python Path is
@ -207,7 +207,7 @@ join(wchar_t *buffer, const wchar_t *stuff)
'landmark' can not overflow prefix if too long. 'landmark' can not overflow prefix if too long.
*/ */
static int static int
gotlandmark(wchar_t *landmark) gotlandmark(const wchar_t *landmark)
{ {
int ok; int ok;
Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN); Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN);
@ -221,7 +221,7 @@ gotlandmark(wchar_t *landmark)
/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd. /* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
assumption provided by only caller, calculate_path() */ assumption provided by only caller, calculate_path() */
static int static int
search_for_prefix(wchar_t *argv0_path, wchar_t *landmark) search_for_prefix(wchar_t *argv0_path, const wchar_t *landmark)
{ {
/* Search from argv0_path, until landmark is found */ /* Search from argv0_path, until landmark is found */
wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path); wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path);
@ -630,8 +630,24 @@ calculate_path(void)
} }
} }
/* Calculate zip archive path from DLL or exe path */
if (wcscpy_s(zip_path, MAXPATHLEN + 1, dllpath[0] ? dllpath : progpath)) {
/* exceeded buffer length - ignore zip_path */
zip_path[0] = '\0';
} else {
wchar_t *dot = wcsrchr(zip_path, '.');
if (!dot || wcscpy_s(dot, MAXPATHLEN + 1 - (dot - zip_path), L".zip")) {
/* exceeded buffer length - ignore zip_path */
zip_path[0] = L'\0';
}
}
if (pythonhome == NULL || *pythonhome == '\0') { if (pythonhome == NULL || *pythonhome == '\0') {
if (search_for_prefix(argv0_path, LANDMARK)) if (zip_path[0] && exists(zip_path)) {
wcscpy_s(prefix, MAXPATHLEN+1, zip_path);
reduce(prefix);
pythonhome = prefix;
} else if (search_for_prefix(argv0_path, LANDMARK))
pythonhome = prefix; pythonhome = prefix;
else else
pythonhome = NULL; pythonhome = NULL;
@ -643,17 +659,6 @@ calculate_path(void)
envpath = NULL; envpath = NULL;
/* Calculate zip archive path from DLL or exe path */
if (wcscpy_s(zip_path, MAXPATHLEN+1, dllpath[0] ? dllpath : progpath))
/* exceeded buffer length - ignore zip_path */
zip_path[0] = '\0';
else {
wchar_t *dot = wcsrchr(zip_path, '.');
if (!dot || wcscpy_s(dot, MAXPATHLEN+1 - (dot - zip_path), L".zip"))
/* exceeded buffer length - ignore zip_path */
zip_path[0] = L'\0';
}
skiphome = pythonhome==NULL ? 0 : 1; skiphome = pythonhome==NULL ? 0 : 1;
#ifdef Py_ENABLE_SHARED #ifdef Py_ENABLE_SHARED
machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome); machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);