Kaydet (Commit) 1616645a authored tarafından Antoine Pitrou's avatar Antoine Pitrou

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.
üst 0504532c
......@@ -585,7 +585,24 @@ class IOTest(unittest.TestCase):
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment