]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46048: Fix parsing of single character lines in getpath readlines() (GH-30048)
authorSteve Dower <steve.dower@python.org>
Sat, 11 Dec 2021 13:43:40 +0000 (13:43 +0000)
committerGitHub <noreply@github.com>
Sat, 11 Dec 2021 13:43:40 +0000 (13:43 +0000)
Lib/test/test_site.py
Misc/NEWS.d/next/Core and Builtins/2021-12-11-13-14-42.bpo-46048._-OGD9.rst [new file with mode: 0644]
Modules/getpath.c

index 76d35daed0b8021e0a7bc61ac53407822c92ad41..199022a1054f3aa4e780a32d69750d81c9b9ffca 100644 (file)
@@ -594,6 +594,26 @@ class _pthFileTests(unittest.TestCase):
             sys_path.append(abs_path)
         return sys_path
 
+    def test_underpth_basic(self):
+        libpath = test.support.STDLIB_DIR
+        exe_prefix = os.path.dirname(sys.executable)
+        pth_lines = ['#.', '# ..', *sys.path, '.', '..']
+        exe_file = self._create_underpth_exe(pth_lines)
+        sys_path = self._calc_sys_path_for_underpth_nosite(
+            os.path.dirname(exe_file),
+            pth_lines)
+
+        output = subprocess.check_output([exe_file, '-c',
+            'import sys; print("\\n".join(sys.path) if sys.flags.no_site else "")'
+        ], encoding='ansi')
+        actual_sys_path = output.rstrip().split('\n')
+        self.assertTrue(actual_sys_path, "sys.flags.no_site was False")
+        self.assertEqual(
+            actual_sys_path,
+            sys_path,
+            "sys.path is incorrect"
+        )
+
     def test_underpth_nosite_file(self):
         libpath = test.support.STDLIB_DIR
         exe_prefix = os.path.dirname(sys.executable)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-11-13-14-42.bpo-46048._-OGD9.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-11-13-14-42.bpo-46048._-OGD9.rst
new file mode 100644 (file)
index 0000000..647fb6d
--- /dev/null
@@ -0,0 +1,2 @@
+Fixes parsing of :file:`._pth` files on startup so that single-character
+paths are correctly read.
index fedb41cdb37888a517dae7672f8b64db0a606691..3adce4653342f821a568393cd60da5aa9ef61a99 100644 (file)
@@ -386,11 +386,11 @@ getpath_readlines(PyObject *Py_UNUSED(self), PyObject *args)
     wchar_t *p1 = wbuffer;
     wchar_t *p2 = p1;
     while ((p2 = wcschr(p1, L'\n')) != NULL) {
-        size_t cb = p2 - p1;
-        while (cb && (p1[cb] == L'\n' || p1[cb] == L'\r')) {
+        Py_ssize_t cb = p2 - p1;
+        while (cb >= 0 && (p1[cb] == L'\n' || p1[cb] == L'\r')) {
             --cb;
         }
-        PyObject *u = PyUnicode_FromWideChar(p1, cb ? cb + 1 : 0);
+        PyObject *u = PyUnicode_FromWideChar(p1, cb >= 0 ? cb + 1 : 0);
         if (!u || PyList_Append(r, u) < 0) {
             Py_XDECREF(u);
             Py_CLEAR(r);