Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC.
This commit is contained in:
parent
e954ecb9ba
commit
9ffcbf71a5
|
@ -2338,6 +2338,21 @@ class CTextIOWrapperTest(TextIOWrapperTest):
|
||||||
with self.open(support.TESTFN, "rb") as f:
|
with self.open(support.TESTFN, "rb") as f:
|
||||||
self.assertEqual(f.read(), b"456def")
|
self.assertEqual(f.read(), b"456def")
|
||||||
|
|
||||||
|
def test_rwpair_cleared_before_textio(self):
|
||||||
|
# Issue 13070: TextIOWrapper's finalization would crash when called
|
||||||
|
# after the reference to the underlying BufferedRWPair's writer got
|
||||||
|
# cleared by the GC.
|
||||||
|
for i in range(1000):
|
||||||
|
b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
|
||||||
|
t1 = self.TextIOWrapper(b1, encoding="ascii")
|
||||||
|
b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
|
||||||
|
t2 = self.TextIOWrapper(b2, encoding="ascii")
|
||||||
|
# circular references
|
||||||
|
t1.buddy = t2
|
||||||
|
t2.buddy = t1
|
||||||
|
support.gc_collect()
|
||||||
|
|
||||||
|
|
||||||
class PyTextIOWrapperTest(TextIOWrapperTest):
|
class PyTextIOWrapperTest(TextIOWrapperTest):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -217,6 +217,10 @@ Library
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
|
||||||
|
would be finalized after the reference to its underlying BufferedRWPair's
|
||||||
|
writer got cleared by the GC.
|
||||||
|
|
||||||
- Issue #12881: ctypes: Fix segfault with large structure field names.
|
- Issue #12881: ctypes: Fix segfault with large structure field names.
|
||||||
|
|
||||||
- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
|
- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
|
||||||
|
|
|
@ -2179,6 +2179,11 @@ bufferedrwpair_isatty(rwpair *self, PyObject *args)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
bufferedrwpair_closed_get(rwpair *self, void *context)
|
bufferedrwpair_closed_get(rwpair *self, void *context)
|
||||||
{
|
{
|
||||||
|
if (self->writer == NULL) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
|
"the BufferedRWPair object is being garbage-collected");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed);
|
return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue