diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-07-16 17:07:39 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-16 17:07:39 (GMT) |
commit | 3781d1a45815b5f4455491efd036babc084101b3 (patch) | |
tree | cbf0624c86e289fc807a82b7cdb8fd31fe773cf9 /PC | |
parent | 6654392587ede1c8e595a8fcdd273a02bc04ea51 (diff) | |
download | cpython-3781d1a45815b5f4455491efd036babc084101b3.zip cpython-3781d1a45815b5f4455491efd036babc084101b3.tar.gz cpython-3781d1a45815b5f4455491efd036babc084101b3.tar.bz2 |
gh-90844: Allow virtual environments to correctly launch when they have spaces in the path (GH-94903)
(cherry picked from commit 4b4439daed3992a5c5a83b86596d6e00ac3c1203)
Co-authored-by: Steve Dower <steve.dower@python.org>
Diffstat (limited to 'PC')
-rw-r--r-- | PC/launcher.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/PC/launcher.c b/PC/launcher.c index 734e753..7c34e0d 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1923,27 +1923,35 @@ process(int argc, wchar_t ** argv) if (!cch) { error(0, L"Cannot determine memory for home path"); } - cch += (DWORD)wcslen(PYTHON_EXECUTABLE) + 1 + 1; /* include sep and null */ + cch += (DWORD)wcslen(PYTHON_EXECUTABLE) + 4; /* include sep, null and quotes */ executable = (wchar_t *)malloc(cch * sizeof(wchar_t)); if (executable == NULL) { error(RC_NO_MEMORY, L"A memory allocation failed"); } - cch_actual = MultiByteToWideChar(CP_UTF8, 0, start, len, executable, cch); + /* start with a quote - we'll skip this ahead, but want it for the final string */ + executable[0] = L'"'; + cch_actual = MultiByteToWideChar(CP_UTF8, 0, start, len, &executable[1], cch - 1); if (!cch_actual) { error(RC_BAD_VENV_CFG, L"Cannot decode home path in '%ls'", venv_cfg_path); } + cch_actual += 1; /* account for the first quote */ + executable[cch_actual] = L'\0'; if (executable[cch_actual - 1] != L'\\') { executable[cch_actual++] = L'\\'; executable[cch_actual] = L'\0'; } - if (wcscat_s(executable, cch, PYTHON_EXECUTABLE)) { + if (wcscat_s(&executable[1], cch - 1, PYTHON_EXECUTABLE)) { error(RC_BAD_VENV_CFG, L"Cannot create executable path from '%ls'", venv_cfg_path); } - if (GetFileAttributesW(executable) == INVALID_FILE_ATTRIBUTES) { + /* there's no trailing quote, so we only have to skip one character for the test */ + if (GetFileAttributesW(&executable[1]) == INVALID_FILE_ATTRIBUTES) { error(RC_NO_PYTHON, L"No Python at '%ls'", executable); } + /* now append the final quote */ + wcscat_s(executable, cch, L"\""); + /* smuggle our original path through */ if (!SetEnvironmentVariableW(L"__PYVENV_LAUNCHER__", argv0)) { error(0, L"Failed to set launcher environment"); } |