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

Reply via email to