bpo-46048: Fix parsing of single character lines in getpath readlines() (GH-30048)
This commit is contained in:
parent
4fe5585240
commit
971ece8e17
@ -594,6 +594,26 @@ class _pthFileTests(unittest.TestCase):
|
|||||||
sys_path.append(abs_path)
|
sys_path.append(abs_path)
|
||||||
return sys_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):
|
def test_underpth_nosite_file(self):
|
||||||
libpath = test.support.STDLIB_DIR
|
libpath = test.support.STDLIB_DIR
|
||||||
exe_prefix = os.path.dirname(sys.executable)
|
exe_prefix = os.path.dirname(sys.executable)
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Fixes parsing of :file:`._pth` files on startup so that single-character
|
||||||
|
paths are correctly read.
|
@ -386,11 +386,11 @@ getpath_readlines(PyObject *Py_UNUSED(self), PyObject *args)
|
|||||||
wchar_t *p1 = wbuffer;
|
wchar_t *p1 = wbuffer;
|
||||||
wchar_t *p2 = p1;
|
wchar_t *p2 = p1;
|
||||||
while ((p2 = wcschr(p1, L'\n')) != NULL) {
|
while ((p2 = wcschr(p1, L'\n')) != NULL) {
|
||||||
size_t cb = p2 - p1;
|
Py_ssize_t cb = p2 - p1;
|
||||||
while (cb && (p1[cb] == L'\n' || p1[cb] == L'\r')) {
|
while (cb >= 0 && (p1[cb] == L'\n' || p1[cb] == L'\r')) {
|
||||||
--cb;
|
--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) {
|
if (!u || PyList_Append(r, u) < 0) {
|
||||||
Py_XDECREF(u);
|
Py_XDECREF(u);
|
||||||
Py_CLEAR(r);
|
Py_CLEAR(r);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user