summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Bierma <zintensitydev@gmail.com>2024-07-27 06:27:48 (GMT)
committerGitHub <noreply@github.com>2024-07-27 06:27:48 (GMT)
commitc08696286f52d286674f264eecf7b33a335a890b (patch)
treebf6f7f29e48e693ad854f5e83e8fc8b262d1161a
parent863a92f2bc708b9e3dfa9828bb8155b8d371e09c (diff)
downloadcpython-c08696286f52d286674f264eecf7b33a335a890b.zip
cpython-c08696286f52d286674f264eecf7b33a335a890b.tar.gz
cpython-c08696286f52d286674f264eecf7b33a335a890b.tar.bz2
gh-122332: Fix missing `NULL` check in `asyncio.Task.get_coro` (#122338)
-rw-r--r--Lib/test/test_asyncio/test_eager_task_factory.py12
-rw-r--r--Misc/NEWS.d/next/Library/2024-07-26-21-21-13.gh-issue-122332.fvw88r.rst2
-rw-r--r--Modules/_asynciomodule.c6
3 files changed, 19 insertions, 1 deletions
diff --git a/Lib/test/test_asyncio/test_eager_task_factory.py b/Lib/test/test_asyncio/test_eager_task_factory.py
index 0f8212d..0777f39 100644
--- a/Lib/test/test_asyncio/test_eager_task_factory.py
+++ b/Lib/test/test_asyncio/test_eager_task_factory.py
@@ -241,6 +241,18 @@ class CEagerTaskFactoryLoopTests(EagerTaskFactoryLoopTests, test_utils.TestCase)
_, out, err = assert_python_ok("-c", code)
self.assertFalse(err)
+ def test_issue122332(self):
+ async def coro():
+ pass
+
+ async def run():
+ task = self.loop.create_task(coro())
+ await task
+ self.assertIsNone(task.get_coro())
+
+ self.run_coro(run())
+
+
class AsyncTaskCounter:
def __init__(self, loop, *, task_class, eager):
self.suspense_count = 0
diff --git a/Misc/NEWS.d/next/Library/2024-07-26-21-21-13.gh-issue-122332.fvw88r.rst b/Misc/NEWS.d/next/Library/2024-07-26-21-21-13.gh-issue-122332.fvw88r.rst
new file mode 100644
index 0000000..55bb1dc
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-07-26-21-21-13.gh-issue-122332.fvw88r.rst
@@ -0,0 +1,2 @@
+Fixed segfault with :meth:`asyncio.Task.get_coro` when using an eager task
+factory.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 1a223f9..873c17c 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -2500,7 +2500,11 @@ static PyObject *
_asyncio_Task_get_coro_impl(TaskObj *self)
/*[clinic end generated code: output=bcac27c8cc6c8073 input=d2e8606c42a7b403]*/
{
- return Py_NewRef(self->task_coro);
+ if (self->task_coro) {
+ return Py_NewRef(self->task_coro);
+ }
+
+ Py_RETURN_NONE;
}
/*[clinic input]