https://github.com/python/cpython/commit/0a9ae5ed48e6ea078f67ba03635c1c26209b5def commit: 0a9ae5ed48e6ea078f67ba03635c1c26209b5def branch: main author: Shantanu <12621235+hauntsani...@users.noreply.github.com> committer: hauntsaninja <12621235+hauntsani...@users.noreply.github.com> date: 2025-03-06T23:41:28-08:00 summary:
gh-130932: Fix incorrect exception handling in _PyModule_IsPossiblyShadowing (#130934) I chose to not raise an exception here because I think it would be confusing for module attribute access to start raising something other than AttributeError if e.g. the cwd goes away Without the change in moduleobject.c ``` ./python.exe -m unittest test.test_import.ImportTests.test_script_shadowing_stdlib_cwd_failure ... Assertion failed: (PyErr_Occurred()), function _PyObject_SetAttributeErrorContext, file object.c, line 1253. ``` files: A Misc/NEWS.d/next/Core_and_Builtins/2025-03-06-22-56-02.gh-issue-130932.QVHaKT.rst M Lib/test/test_import/__init__.py M Objects/moduleobject.c diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index f58633e0ce8dda..bf2bf066ceeb9e 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1185,6 +1185,28 @@ class substr(str): for line in lines: self.assertRegex(line, rb"cannot import name 'Fraction' from 'fractions' \(.*\)") + @unittest.skipIf(sys.platform == 'win32', 'Cannot delete cwd on Windows') + def test_script_shadowing_stdlib_cwd_failure(self): + with os_helper.temp_dir() as tmp: + subtmp = os.path.join(tmp, "subtmp") + os.mkdir(subtmp) + with open(os.path.join(subtmp, "main.py"), "w", encoding='utf-8') as f: + f.write(f""" +import sys +assert sys.path[0] == '' + +import os +import shutil +shutil.rmtree(os.getcwd()) + +os.does_not_exist +""") + # Use -c to ensure sys.path[0] is "" + popen = script_helper.spawn_python("-c", "import main", cwd=subtmp) + stdout, stderr = popen.communicate() + expected_error = rb"AttributeError: module 'os' has no attribute 'does_not_exist'" + self.assertRegex(stdout, expected_error) + def test_script_shadowing_stdlib_sys_path_modification(self): script_errors = [ ( diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-03-06-22-56-02.gh-issue-130932.QVHaKT.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-06-22-56-02.gh-issue-130932.QVHaKT.rst new file mode 100644 index 00000000000000..e12b5b88cb59ab --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-06-22-56-02.gh-issue-130932.QVHaKT.rst @@ -0,0 +1 @@ +Fix incorrect exception handling in ``_PyModule_IsPossiblyShadowing`` diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 20a2b8ee3221f8..1af3ce6fe9bf65 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -921,7 +921,9 @@ _PyModule_IsPossiblyShadowing(PyObject *origin) if (sys_path_0[0] == L'\0') { // if sys.path[0] == "", treat it as if it were the current directory if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) { - return -1; + // If we failed to getcwd, don't raise an exception and instead + // let the caller proceed assuming no shadowing + return 0; } sys_path_0 = sys_path_0_buf; } _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com