https://github.com/python/cpython/commit/58da2a9d94afc144da0e942fb293c4176da15174
commit: 58da2a9d94afc144da0e942fb293c4176da15174
branch: 3.14
author: Cody Maloney <[email protected]>
committer: encukou <[email protected]>
date: 2025-12-16T10:55:25+01:00
summary:

[3.14] gh-142594: fix by property calls io.TextIOWrapper.detach (GH-142706) 
(GH-142755)

(cherry picked from commit 1d3854a19a376c1fc7f71e96c620f6bc2de8cd74)

Signed-off-by: yihong0618 <[email protected]>
Co-authored-by: yihong <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst
M Lib/test/test_io.py
M Modules/_io/textio.c

diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 6514af8b1253c3..57b42fbb65fe10 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -4194,6 +4194,22 @@ def write(self, data):
         self.assertEqual([b"abcdef", b"middle", b"g"*chunk_size],
                          buf._write_stack)
 
+    def test_issue142594(self):
+        wrapper = None
+        detached = False
+        class ReentrantRawIO(self.RawIOBase):
+            @property
+            def closed(self):
+                nonlocal detached
+                if wrapper is not None and not detached:
+                    detached = True
+                    wrapper.detach()
+                return False
+
+        raw = ReentrantRawIO()
+        wrapper = self.TextIOWrapper(raw)
+        wrapper.close()  # should not crash
+
 
 class PyTextIOWrapperTest(TextIOWrapperTest):
     io = pyio
diff --git 
a/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst 
b/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst
new file mode 100644
index 00000000000000..ee6a958933f7c8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst
@@ -0,0 +1,2 @@
+Fix crash in ``TextIOWrapper.close()`` when the underlying buffer's
+``closed`` property calls :meth:`~io.TextIOBase.detach`.
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index a136987fb52a4a..9945febea80828 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -3149,6 +3149,9 @@ _io_TextIOWrapper_close_impl(textio *self)
     if (r > 0) {
         Py_RETURN_NONE; /* stream already closed */
     }
+    if (self->detached) {
+        Py_RETURN_NONE; /* gh-142594 null pointer issue */
+    }
     else {
         PyObject *exc = NULL;
         if (self->finalizing) {

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to