changeset: 104417:8d877876aa89 branch: 3.5 parent: 104414:a3b162d5e70a user: Yury Selivanov date: Sun Oct 09 12:19:12 2016 -0400 files: Lib/asyncio/tasks.py Lib/test/test_asyncio/test_tasks.py Misc/NEWS description: Issue #27972: Prohibit Tasks to await on themselves. diff -r a3b162d5e70a -r 8d877876aa89 Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py Sun Oct 09 12:15:08 2016 -0400 +++ b/Lib/asyncio/tasks.py Sun Oct 09 12:19:12 2016 -0400 @@ -241,7 +241,7 @@ result = coro.throw(exc) except StopIteration as exc: self.set_result(exc.value) - except futures.CancelledError as exc: + except futures.CancelledError: super().cancel() # I.e., Future.cancel(self). except Exception as exc: self.set_exception(exc) @@ -259,12 +259,19 @@ 'Task {!r} got Future {!r} attached to a ' 'different loop'.format(self, result))) elif blocking: - result._asyncio_future_blocking = False - result.add_done_callback(self._wakeup) - self._fut_waiter = result - if self._must_cancel: - if self._fut_waiter.cancel(): - self._must_cancel = False + if result is self: + self._loop.call_soon( + self._step, + RuntimeError( + 'Task cannot await on itself: {!r}'.format( + self))) + else: + result._asyncio_future_blocking = False + result.add_done_callback(self._wakeup) + self._fut_waiter = result + if self._must_cancel: + if self._fut_waiter.cancel(): + self._must_cancel = False else: self._loop.call_soon( self._step, diff -r a3b162d5e70a -r 8d877876aa89 Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py Sun Oct 09 12:15:08 2016 -0400 +++ b/Lib/test/test_asyncio/test_tasks.py Sun Oct 09 12:19:12 2016 -0400 @@ -92,6 +92,17 @@ finally: other_loop.close() + def test_task_awaits_on_itself(self): + @asyncio.coroutine + def test(): + yield from task + + task = asyncio.ensure_future(test(), loop=self.loop) + + with self.assertRaisesRegex(RuntimeError, + 'Task cannot await on itself'): + self.loop.run_until_complete(task) + def test_task_class(self): @asyncio.coroutine def notmuch(): diff -r a3b162d5e70a -r 8d877876aa89 Misc/NEWS --- a/Misc/NEWS Sun Oct 09 12:15:08 2016 -0400 +++ b/Misc/NEWS Sun Oct 09 12:19:12 2016 -0400 @@ -388,6 +388,8 @@ - Issue #28399: Remove UNIX socket from FS before binding. Patch by Коренберг Марк. +- Issue #27972: Prohibit Tasks to await on themselves. + IDLE ----