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

(cherry picked from commit 1d3854a19a)

Signed-off-by: yihong0618 <zouzou0208@gmail.com>
Co-authored-by: yihong <zouzou0208@gmail.com>
This commit is contained in:
Cody Maloney 2025-12-16 01:55:35 -08:00 committed by GitHub
parent 3e45440382
commit affd2f2ff2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 0 deletions

View file

@ -4160,6 +4160,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

View file

@ -0,0 +1,2 @@
Fix crash in ``TextIOWrapper.close()`` when the underlying buffer's
``closed`` property calls :meth:`~io.TextIOBase.detach`.

View file

@ -3133,6 +3133,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) {