From: Benjamin Peterson Date: Tue, 30 Sep 2014 02:46:57 +0000 (-0400) Subject: clear BufferedRWPair weakrefs on deallocation (closes #22517) X-Git-Tag: v3.3.6rc1~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bbd0a323aeb1222d216fa10a9e1d9c91945ad1e6;p=python clear BufferedRWPair weakrefs on deallocation (closes #22517) --- diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 2a96b7b8e7..4b49d33a0b 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1524,6 +1524,12 @@ class BufferedRWPairTest(unittest.TestCase): pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(True)) self.assertTrue(pair.isatty()) + def test_weakref_clearing(self): + brw = self.tp(self.MockRawIO(), self.MockRawIO()) + ref = weakref.ref(brw) + brw = None + ref = None # Shouldn't segfault. + class CBufferedRWPairTest(BufferedRWPairTest): tp = io.BufferedRWPair diff --git a/Misc/NEWS b/Misc/NEWS index 0df66795ee..890c25103e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -17,6 +17,9 @@ Core and Builtins Library ------- +- Issue #22517: When a io.BufferedRWPair object is deallocated, clear its + weakrefs. + - Issue #22419: Limit the length of incoming HTTP request in wsgiref server to 65536 bytes and send a 414 error code for higher lengths. Patch contributed by Devin Cook. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index c28e289277..ea0302bfd3 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2254,6 +2254,8 @@ static void bufferedrwpair_dealloc(rwpair *self) { _PyObject_GC_UNTRACK(self); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *)self); Py_CLEAR(self->reader); Py_CLEAR(self->writer); Py_CLEAR(self->dict);