diff options
author | Jelle Zijlstra <jelle.zijlstra@gmail.com> | 2025-05-17 12:23:19 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-17 12:23:19 -0700 |
commit | fc7f4c36664314393bd4c30355e21bd7aeac524d (patch) | |
tree | d91d2dfb0b22e8672191d3a201d019f378d5e733 | |
parent | 84914ad0e5f96f0ca7238f3b4bc7fc4e50b1abb3 (diff) | |
download | cpython-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.py | 7 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst | 2 | ||||
-rw-r--r-- | Objects/templateobject.c | 3 |
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; |