[3.13] gh-122695: Fix double-free when using `gc.get_referents` with a freed `_asyncio.FutureIter` (#122837)
* Backport #122834 for 3.13
(cherry picked from commit
e8fb088dbaa71dd5f0146b2f4a8f7ecbe2ce9625)
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
with self.assertRaises(AttributeError):
del fut._log_traceback
+ def test_future_iter_get_referents_segfault(self):
+ # See https://github.com/python/cpython/issues/122695
+ import _asyncio
+ it = iter(self._new_future(loop=self.loop))
+ del it
+ evil = gc.get_referents(_asyncio)
+ gc.collect()
+
@unittest.skipUnless(hasattr(futures, '_CFuture'),
'requires the C _asyncio module')
--- /dev/null
+Fixed double-free when using :func:`gc.get_referents` with a freed
+:class:`asyncio.Future` iterator.
Py_VISIT(state->iscoroutine_typecache);
Py_VISIT(state->context_kwname);
-
- // Visit freelist.
- PyObject *next = (PyObject*) state->fi_freelist;
- while (next != NULL) {
- PyObject *current = next;
- Py_VISIT(current);
- next = (PyObject*) ((futureiterobject*) current)->future;
- }
return 0;
}