Mercurial > cpython-lru_cache-weakref
changeset 57665:2ffd19a224d4 legacy-trunk
Issue #7466: segmentation fault when the garbage collector is called
in the middle of populating a tuple. Patch by Florent Xicluna.
(note: no NEWS entry for trunk since the bug was introduced in 2.7/3.1)
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Sat, 12 Dec 2009 19:13:08 +0000 |
| parents | cb22eaee86c9 |
| children | 20b7deb53d4e |
| files | Lib/test/test_tuple.py Objects/tupleobject.c |
| diffstat | 2 files changed, 5 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/test/test_tuple.py Fri Dec 11 17:29:33 2009 +0000 +++ b/Lib/test/test_tuple.py Sat Dec 12 19:13:08 2009 +0000 @@ -146,6 +146,9 @@ pass self.check_track_dynamic(MyTuple, True) + def test_bug7466(self): + # Trying to untrack an unfinished tuple could crash Python + self._not_tracked(tuple(gc.collect() for i in range(101))) def test_main(): test_support.run_unittest(TupleTest)
--- a/Objects/tupleobject.c Fri Dec 11 17:29:33 2009 +0000 +++ b/Objects/tupleobject.c Sat Dec 12 19:13:08 2009 +0000 @@ -875,7 +875,8 @@ /* XXX UNREF/NEWREF interface should be more symmetrical */ _Py_DEC_REFTOTAL; - _PyObject_GC_UNTRACK(v); + if (_PyObject_GC_IS_TRACKED(v)) + _PyObject_GC_UNTRACK(v); _Py_ForgetReference((PyObject *) v); /* DECREF items deleted by shrinkage */ for (i = newsize; i < oldsize; i++) {
