Skip to content

gh-151815: Fix segfault in template_iter on allocation failure - #151821

Open
timurmamedov1 wants to merge 2 commits into
python:mainfrom
timurmamedov1:gh-151815-fix-template-iter-segfault
Open

gh-151815: Fix segfault in template_iter on allocation failure#151821
timurmamedov1 wants to merge 2 commits into
python:mainfrom
timurmamedov1:gh-151815-fix-template-iter-segfault

Conversation

@timurmamedov1

Copy link
Copy Markdown

template_iter() allocates a templateiterobject with PyObject_GC_New (which does not zero memory), but only assigns stringsiter and interpolationsiter after both PyObject_GetIter calls succeed. If either call fails, Py_DECREF(iter) runs templateiter_clear, which calls Py_CLEAR on uninitialized pointers, causing a segfault.

Fix: initialize both fields to NULL immediately after allocation so Py_CLEAR is safe on the error paths.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes a crash in the C implementation of t-string Template iteration by making the iterator object safe to deallocate when construction fails partway through (e.g., on PyObject_GetIter() allocation failure).

Changes:

  • Initialize templateiterobject’s stringsiter and interpolationsiter to NULL immediately after PyObject_GC_New() so tp_clear/Py_CLEAR is safe on error paths.
  • Add a NEWS blurb documenting the crash fix.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
Objects/templateobject.cPrevents segfault by NULL-initializing iterator fields before any fallible operations.
Misc/NEWS.d/next/Core_and_Builtins/2026-06-20-14-00-00.gh-issue-151815.TmplIt.rstDocuments the crash fix in the Core and Builtins NEWS entries.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadObjects/templateobject.c Outdated
Comment on lines +222 to +230
return NULL;
}
iter->stringsiter = NULL;
iter->interpolationsiter = NULL;
@timurmamedov1
timurmamedov1force-pushed the gh-151815-fix-template-iter-segfault branch 2 times, most recently from 645d1c2 to 01f7dbfCompareJune 21, 2026 18:23
@bedevere-app

Copy link
Copy Markdown

Most changes to Python require a NEWS entry. Add one using the blurb_it web app or the blurb command-line tool.

If this change has little impact on Python users, wait for a maintainer to apply the skip news label instead.

@timurmamedov1
timurmamedov1force-pushed the gh-151815-fix-template-iter-segfault branch 2 times, most recently from aa005aa to 5653555CompareJune 21, 2026 20:14
@timurmamedov1
timurmamedov1force-pushed the gh-151815-fix-template-iter-segfault branch from b6dc145 to 8e5d35cCompareJune 24, 2026 20:00
Comment threadObjects/templateobject.c Outdated
@@ -226,6 +226,8 @@ template_iter(PyObject *op)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest moving allocation after getting interpolationsiter.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, moved the allocation after both GetIter calls.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks.

@sergey-miryanovsergey-miryanov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timurmamedov1@sergey-miryanov