From: Steve Dower Date: Wed, 29 May 2024 19:12:55 +0000 (+0100) Subject: gh-119070: Fix py.exe handling of /usr/bin/env commands missing extension (GH-119426) X-Git-Tag: v3.12.4~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc01c5d2252a31304a58c14d0e1aeffa4795092a;p=thirdparty%2FPython%2Fcpython.git gh-119070: Fix py.exe handling of /usr/bin/env commands missing extension (GH-119426) --- diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 362b507d1582..7dd0b67ea0b3 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -717,3 +717,11 @@ class TestLauncher(unittest.TestCase, RunPyMixin): f"{expect} arg1 {script}", data["stdout"].strip(), ) + + def test_shebang_executable_extension(self): + with self.script('#! /usr/bin/env python3.12') as script: + data = self.run_py([script]) + expect = "# Search PATH for python3.12.exe" + actual = [line.strip() for line in data["stderr"].splitlines() + if line.startswith("# Search PATH")] + self.assertEqual([expect], actual) diff --git a/Misc/NEWS.d/next/Windows/2024-05-22-19-43-29.gh-issue-119070._enton.rst b/Misc/NEWS.d/next/Windows/2024-05-22-19-43-29.gh-issue-119070._enton.rst new file mode 100644 index 000000000000..aab26f572098 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2024-05-22-19-43-29.gh-issue-119070._enton.rst @@ -0,0 +1,3 @@ +Fixes ``py.exe`` handling of shebangs like ``/usr/bin/env python3.12``, +which were previously interpreted as ``python3.exe`` instead of +``python3.12.exe``. diff --git a/PC/launcher2.c b/PC/launcher2.c index c38cbc83a7ac..f331aab3f51e 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -846,7 +846,7 @@ searchPath(SearchInfo *search, const wchar_t *shebang, int shebangLength) } wchar_t filename[MAXLEN]; - if (wcsncpy_s(filename, MAXLEN, command, lastDot)) { + if (wcsncpy_s(filename, MAXLEN, command, commandLength)) { return RC_BAD_VIRTUAL_PATH; } @@ -858,6 +858,8 @@ searchPath(SearchInfo *search, const wchar_t *shebang, int shebangLength) } } + debug(L"# Search PATH for %s\n", filename); + wchar_t pathVariable[MAXLEN]; int n = GetEnvironmentVariableW(L"PATH", pathVariable, MAXLEN); if (!n) {