Skip to content

[3.14] gh-148660: Fix use-after-free in OrderedDict.copy() on reentrant mutation (GH-151573)#152541

Merged
gpshead merged 1 commit into
python:3.14from
miss-islington:backport-7d128e3-3.14
Jun 29, 2026
Merged

[3.14] gh-148660: Fix use-after-free in OrderedDict.copy() on reentrant mutation (GH-151573)#152541
gpshead merged 1 commit into
python:3.14from
miss-islington:backport-7d128e3-3.14

Conversation

@miss-islington

Copy link
Copy Markdown
Contributor

OrderedDict.copy() walks the internal linked list while building the new
dict. The loop body can run arbitrary Python (a key's eq/hash, or
a subclass getitem/setitem) which can clear the source dict and
free the nodes being iterated.

Detect this the same way OrderedDict.eq already does (gh-119004):
snapshot od_state before the loop, hold a strong reference to the key and
read the hash before any reentrant call, and raise RuntimeError if the
state changed before advancing to the next node.

Co-authored-by: Gregory P. Smith 68491+gpshead@users.noreply.github.com

…t mutation (pythonGH-151573)

* pythongh-148660: Fix use-after-free in OrderedDict.copy() on reentrant mutation

OrderedDict.copy() walks the internal linked list while building the new
dict. The loop body can run arbitrary Python (a key's __eq__/__hash__, or
a subclass __getitem__/__setitem__) which can clear the source dict and
free the nodes being iterated.

Detect this the same way OrderedDict.__eq__ already does (pythongh-119004):
snapshot od_state before the loop, hold a strong reference to the key and
read the hash before any reentrant call, and raise RuntimeError if the
state changed before advancing to the next node.

* pythongh-148660: fix NEWS nit, suppress undocumented OrderedDict.copy xref
(cherry picked from commit 7d128e3)

Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
@gpshead gpshead enabled auto-merge (squash) June 29, 2026 02:04
@gpshead gpshead self-assigned this Jun 29, 2026
@gpshead gpshead merged commit 6f86288 into python:3.14 Jun 29, 2026
49 checks passed
@miss-islington miss-islington deleted the backport-7d128e3-3.14 branch June 29, 2026 02:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants