GH-97592: Fix crash in C remove_done_callback due to evil code (GH-97660)

Evil code could cause fut_callbacks to be cleared when PyObject_RichCompareBool is called.
(cherry picked from commit 63780f4599)

Co-authored-by: Guido van Rossum <guido@python.org>
This commit is contained in:
Miss Islington (bot) 2022-09-30 13:22:48 -07:00 committed by GitHub
parent cdc01eaed9
commit 3124618fd5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 2 deletions

View file

@ -832,6 +832,21 @@ class BaseFutureDoneCallbackTests():
fut.remove_done_callback(evil())
def test_remove_done_callbacks_list_clear(self):
# see https://github.com/python/cpython/issues/97592 for details
fut = self._new_future()
fut.add_done_callback(str)
for _ in range(63):
fut.add_done_callback(id)
class evil:
def __eq__(self, other):
fut.remove_done_callback(other)
fut.remove_done_callback(evil())
def test_schedule_callbacks_list_mutation_1(self):
# see http://bugs.python.org/issue28963 for details