]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
[3.13] gh-148660: Fix use-after-free in OrderedDict.copy() on reentrant mutation...
authorGregory P. Smith <68491+gpshead@users.noreply.github.com>
Mon, 29 Jun 2026 02:56:52 +0000 (19:56 -0700)
committerGitHub <noreply@github.com>
Mon, 29 Jun 2026 02:56:52 +0000 (19:56 -0700)
commit9dc1ae091838171ad82cccf2161cea38c82670e8
tree735ac6dbc49c1a9c49359236ab1c4729a9faad2e
parente041cdc3122102862297031282eac9bce5bc5b98
[3.13] gh-148660: Fix use-after-free in OrderedDict.copy() on reentrant mutation (GH-151573) (#152542)

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.

(cherry picked from commit 7d128e319f3730e776a9161a4b5e9de95c802eaf)
Lib/test/test_ordered_dict.py
Misc/NEWS.d/next/Library/2026-06-17-00-00-00.gh-issue-148660.odcopy.rst [new file with mode: 0644]
Objects/odictobject.c