Issue #12149: Update the method cache after a type's dictionnary gets
cleared by the garbage collector. This fixes a segfault when an instance and its type get caught in a reference cycle, and the instance's deallocator calls one of the methods on the type (e.g. when subclassing IOBase). Diagnosis and patch by Davide Rizzo.
This commit is contained in:
commit
093c8e4bf0
|
@ -611,8 +611,25 @@ class IOTest(unittest.TestCase):
|
||||||
self.assertEqual(rawio.read(2), b"")
|
self.assertEqual(rawio.read(2), b"")
|
||||||
|
|
||||||
class CIOTest(IOTest):
|
class CIOTest(IOTest):
|
||||||
|
|
||||||
|
def test_IOBase_finalize(self):
|
||||||
|
# Issue #12149: segmentation fault on _PyIOBase_finalize when both a
|
||||||
|
# class which inherits IOBase and an object of this class are caught
|
||||||
|
# in a reference cycle and close() is already in the method cache.
|
||||||
|
class MyIO(self.IOBase):
|
||||||
|
def close(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# create an instance to populate the method cache
|
||||||
|
MyIO()
|
||||||
|
obj = MyIO()
|
||||||
|
obj.obj = obj
|
||||||
|
wr = weakref.ref(obj)
|
||||||
|
del MyIO
|
||||||
|
del obj
|
||||||
|
support.gc_collect()
|
||||||
|
self.assertTrue(wr() is None, wr)
|
||||||
|
|
||||||
class PyIOTest(IOTest):
|
class PyIOTest(IOTest):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -785,6 +785,7 @@ Armin Rigo
|
||||||
Nicholas Riley
|
Nicholas Riley
|
||||||
Jean-Claude Rimbault
|
Jean-Claude Rimbault
|
||||||
Juan M. Bello Rivas
|
Juan M. Bello Rivas
|
||||||
|
Davide Rizzo
|
||||||
Anthony Roach
|
Anthony Roach
|
||||||
Mark Roberts
|
Mark Roberts
|
||||||
Jim Robinson
|
Jim Robinson
|
||||||
|
|
|
@ -10,6 +10,12 @@ What's New in Python 3.3 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #12149: Update the method cache after a type's dictionnary gets
|
||||||
|
cleared by the garbage collector. This fixes a segfault when an instance
|
||||||
|
and its type get caught in a reference cycle, and the instance's
|
||||||
|
deallocator calls one of the methods on the type (e.g. when subclassing
|
||||||
|
IOBase). Diagnosis and patch by Davide Rizzo.
|
||||||
|
|
||||||
- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.
|
- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.
|
||||||
|
|
||||||
- Issue #9642: Uniformize the tests on the availability of the mbcs codec, add
|
- Issue #9642: Uniformize the tests on the availability of the mbcs codec, add
|
||||||
|
|
|
@ -967,6 +967,8 @@ subtype_dealloc(PyObject *self)
|
||||||
assert(basedealloc);
|
assert(basedealloc);
|
||||||
basedealloc(self);
|
basedealloc(self);
|
||||||
|
|
||||||
|
PyType_Modified(type);
|
||||||
|
|
||||||
/* Can't reference self beyond this point */
|
/* Can't reference self beyond this point */
|
||||||
Py_DECREF(type);
|
Py_DECREF(type);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue