mirror of https://github.com/python/cpython.git
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:
parent
0504532c39
commit
1616645a00
|
@ -585,7 +585,24 @@ def test_RawIOBase_read(self):
|
|||
self.assertEqual(rawio.read(2), b"")
|
||||
|
||||
class CIOTest(IOTest):
|
||||
pass
|
||||
|
||||
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
|
||||
|
||||
# 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):
|
||||
test_array_writes = unittest.skip(
|
||||
|
|
|
@ -686,6 +686,7 @@ Armin Rigo
|
|||
Nicholas Riley
|
||||
Jean-Claude Rimbault
|
||||
Juan M. Bello Rivas
|
||||
Davide Rizzo
|
||||
Anthony Roach
|
||||
Mark Roberts
|
||||
Jim Robinson
|
||||
|
|
|
@ -9,6 +9,12 @@ What's New in Python 2.7.3?
|
|||
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 #12501: Adjust callable() warning: callable() is only not supported in
|
||||
Python 3.1. callable() is again supported in Python 3.2.
|
||||
|
||||
|
|
|
@ -1013,6 +1013,8 @@ subtype_dealloc(PyObject *self)
|
|||
assert(basedealloc);
|
||||
basedealloc(self);
|
||||
|
||||
PyType_Modified(type);
|
||||
|
||||
/* Can't reference self beyond this point */
|
||||
Py_DECREF(type);
|
||||
|
||||
|
|
Loading…
Reference in New Issue