aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2025-05-17 12:23:19 -0700
committerGitHub <noreply@github.com>2025-05-17 12:23:19 -0700
commitfc7f4c36664314393bd4c30355e21bd7aeac524d (patch)
treed91d2dfb0b22e8672191d3a201d019f378d5e733
parent84914ad0e5f96f0ca7238f3b4bc7fc4e50b1abb3 (diff)
downloadcpython-fc7f4c36664314393bd4c30355e21bd7aeac524d.tar.gz
cpython-fc7f4c36664314393bd4c30355e21bd7aeac524d.zip
gh-134119: Fix crash from calling next() on exhausted template iterator (#134120)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
-rw-r--r--Lib/test/test_string/test_templatelib.py7
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst2
-rw-r--r--Objects/templateobject.c3
3 files changed, 12 insertions, 0 deletions
diff --git a/Lib/test/test_string/test_templatelib.py b/Lib/test/test_string/test_templatelib.py
index 5b9490c2be6..85fcff486d6 100644
--- a/Lib/test/test_string/test_templatelib.py
+++ b/Lib/test/test_string/test_templatelib.py
@@ -148,6 +148,13 @@ class TemplateIterTests(unittest.TestCase):
self.assertEqual(res[1].format_spec, '')
self.assertEqual(res[2], ' yz')
+ def test_exhausted(self):
+ # See https://github.com/python/cpython/issues/134119.
+ template_iter = iter(t"{1}")
+ self.assertIsInstance(next(template_iter), Interpolation)
+ self.assertRaises(StopIteration, next, template_iter)
+ self.assertRaises(StopIteration, next, template_iter)
+
if __name__ == '__main__':
unittest.main()
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst
new file mode 100644
index 00000000000..754e8166285
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst
@@ -0,0 +1,2 @@
+Fix crash when calling :func:`next` on an exhausted template string iterator.
+Patch by Jelle Zijlstra.
diff --git a/Objects/templateobject.c b/Objects/templateobject.c
index 06cb19e0b6d..4293a311c44 100644
--- a/Objects/templateobject.c
+++ b/Objects/templateobject.c
@@ -23,6 +23,9 @@ templateiter_next(PyObject *op)
if (self->from_strings) {
item = PyIter_Next(self->stringsiter);
self->from_strings = 0;
+ if (item == NULL) {
+ return NULL;
+ }
if (PyUnicode_GET_LENGTH(item) == 0) {
Py_SETREF(item, PyIter_Next(self->interpolationsiter));
self->from_strings = 1;