bpo-42183: Fix a stack overflow error for asyncio Task or Future repr() (GH-23020)

The overflow occurs under some circumstances when a task or future
recursively returns itself.

Co-authored-by: Kyle Stanley <aeros167@gmail.com>
This commit is contained in:
Andrew Svetlov 2020-11-10 15:58:31 +02:00 committed by GitHub
parent 0b9c4c6fcf
commit 42d873c63a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 3 deletions

View file

@ -0,0 +1,18 @@
# IsolatedAsyncioTestCase based tests
import asyncio
import unittest
class FutureTests(unittest.IsolatedAsyncioTestCase):
async def test_recursive_repr_for_pending_tasks(self):
# The call crashes if the guard for recursive call
# in base_futures:_future_repr_info is absent
# See Also: https://bugs.python.org/issue42183
async def func():
return asyncio.all_tasks()
# The repr() call should not raise RecursiveError at first.
# The check for returned string is not very reliable but
# exact comparison for the whole string is even weaker.
self.assertIn('...', repr(await asyncio.wait_for(func(), timeout=10)))