GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — 22 free-threading race conditions · Issue #149816 · python/cpython

22 free-threading race conditions #149816

New issue
Copy link
New issue
Copy link
Open
#150247
Open
22 free-threading race conditions#149816
#150247
Copy link
Labels
interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)topic-free-threadingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

Description

@lunixbochs
lunixbochs
opened on May 14, 2026
Issue body actions

Bug report

Changes

2026-05-13: Filed issue.
2026-06-08: Added new findings (16) and (86).

Bug description

I found 22 free-threading race conditions during a partial Xint Code scan of cpython. These only apply to the free-threaded build, and were all found and tested on commit 0534774 built with ./configure --disable-gil --enable-asan on an M3 Mac.

I'm attaching a zip file with detailed writeups of each, as well as reproduction cases for 15 of the 22 issues. I don't have scripts reproducing the findings numbered 21, 36, 82, 94, 106, 115, or 124. Race conditions can be difficult to trigger, and even the scripts I provided are trying to win tight races and may not always work.

I know this is a lot. @colesbury suggested I create a combined issue to make the triage discussion easier.

Let me know if you have any questions or concerns. The issues were found and written up by an automated system, but I have put additional work into the validation and reporting. I do want to be respectful of everyone's time while helping to make Python better.

Writeups

2026-05-13: Initial writeups and test scripts: cpython-ft.zip
2026-06-08: New writeups and test scripts for (16) and (86): cpython-ft-2026-06-08.zip

Many of the scripts are expected to crash, however some of them only produce exceptions or corrupted output. You should be able to run any of the scripts with PYTHON_GIL=1 set in your environment if you want to see a baseline without the race condition.

Finding List

  • (16) Cross-interpreter syslog race
  • (17) Unlocked __init__ races with PRNG state access in Modules/_randommodule.c
  • (21) Racy EVP_MD cache overwrite leaks references in Modules/_hashopenssl.c
  • (36) Borrowed type lookup races to use-after-free in Objects/typeobject.c
  • (49) SNI callback callable race use-after-free in Modules/_ssl.c
  • (61) Racy weakref head load before incref in Objects/typeobject.c
  • (62) Concurrent kwargs growth causes heap overwrite in Objects/call.c
  • (69) Unsynchronized extra pointer dereference in len in Modules/_elementtree.c
  • (82) Non-atomic list slot memmove in shared list delete in Objects/listobject.c
  • (84) Iterator path bypasses buffered object lock in Modules/_io/bufferedio.c
  • (86) Cross-interpreter XID registry race
  • (87) Unsynchronized Element.text borrowed-pointer race in Modules/_elementtree.c
  • (89) Unsynchronized dict iteration causes borrowed-ref UAF in Modules/_pickle.c
  • (91) Racy list item borrow causes UAF in Modules/_pickle.c
  • (94) Async-exception setter races thread-state free in Python/pystate.c
  • (96) Racy GC callback list iteration in Python/gc_free_threading.c
  • (106) Immediate decref races lock-free reader in Modules/_ctypes/_ctypes.c
  • (108) Borrowed dict used after lock release in Objects/dictobject.c
  • (115) Split clear frees keys without QSBR in Objects/dictobject.c
  • (124) Stale keys race in attribute hint fastpath in Python/bytecodes.c
  • (125 wontfix) Struct reinit races with pack/unpack in Modules/_struct.c
  • (128) Borrowed list item raced before incref in Objects/bytesobject.c
  • (129) Reentrant __index__ causes released-buffer dereference in Objects/memoryobject.c
  • (132) Non-atomic exports race in memoryview.hex in Objects/memoryobject.c

CPython versions tested on:

3.14

Operating systems tested on:

macOS

Linked PRs

  • gh-149816: Fix a RC in _random.Random.__init__ method #149824
  • gh-149816: Fix race condition in memoryview with free-threading #149858
  • [3.15] gh-149816: Fix race condition in memoryview with free-threading (GH-149858) #149875
  • [3.14] gh-149816: Fix race condition in memoryview with free-threading (GH-149858) #149876
  • [3.13] gh-149816: Fix race condition in memoryview with free-threading (GH-149858) #149877
  • gh-149816: Fix a race condition in _PyBytes_FromList with free-threading #149909
  • [3.15] gh-149816: Fix a race condition in _PyBytes_FromList with free-threading (GH-149909) #149911
  • [3.14] gh-149816: Fix a race condition in _PyBytes_FromList with free-threading (GH-149909) #149912
  • gh-149816: fix dict.clear() race on split-table dict with non-embedded values #149914
  • gh-149816: Fix race conditions in Modules/_elementtree.c with free-threaded #149918
  • gh-149816: fix thread safety of deletion of list slice #149936
  • [3.15] gh-149816: Fix a RC in _random.Random.__init__ method (GH-149824) #149997
  • [3.14] gh-149816: Fix a RC in _random.Random.__init__ method (GH-149824) #149998
  • [3.15] gh-149816: fix dict.clear() race on split-table dict with non-embedded values (GH-149914) #150000
  • [3.15] gh-149816: fix thread safety of deletion of list slice (GH-149936) #150003
  • [3.14] gh-149816: fix thread safety of deletion of list slice (GH-149936) #150004
  • gh-149816: Fix UAF in Modules/_pickle.c #150024
  • gh-149816: #96 Fix a race condition in invoke_gc_callback with free threading #150029
  • gh-149816: Fix SNI callback callable race #150018
  • [3.15] gh-149816: Fix SNI callback callable race (GH-150018) #150099
  • [3.14] gh-149816: Fix SNI callback callable race (GH-150018) #150100
  • gh-149816: fix concurrent kwargs growth in _thread.start_new_thread #150168
  • gh-149816: Fix race in subtype_getweakref in free-threading build #150247
  • gh-149816: add missing critical section on self in buffered_iternext #150295
  • [3.15] gh-149816: add missing critical section on self in buffered_iternext (GH-150295) #150305
  • [3.14] gh-149816: add missing critical section on self in buffered_iternext (GH-150295) #150306
  • gh-149816: Fix race between setattr and object.__dict__ update #152296
  • gh-149816: fix a race when fetching OpenSSL digests #153019
  • gh-149816: Fix UAF on concurrent dict resize in free-threaded builds #153712
  • [3.15] gh-149816: Fix UAF in Modules/_pickle.c (GH-150024) #153718
  • [3.14] gh-149816: Fix UAF in Modules/_pickle.c (GH-150024) #153719
  • [3.15] gh-149816: #96 Fix a race condition in invoke_gc_callback with free threading (GH-150029) #156119
  • [3.14] gh-149816: #96 Fix a race condition in invoke_gc_callback with free threading (GH-150029) #156314
  • [3.14] gh-149816: #96 Fix a race condition in invoke_gc_callback with free threading (GH-150029) (GH-156119) #159310
  • [3.14] gh-149816: Fix race in subtype_getweakref in free-threading build (gh-150247) #159363
  • [3.15] gh-149816: Fix race in subtype_getweakref in free-threading build (gh-150247) #159364
  • [3.15] gh-149816: fix a race when fetching OpenSSL digests (GH-153019) #159997
  • [3.14] gh-149816: fix a race when fetching OpenSSL digests (GH-153019) #160006
  • gh-149816: Fix another variant of race on setattr/managed dict going … #160278
Reacted by bpak-theori, Yongtao Huang, Ivy Xu, Thomas Kowalski, Abhishek Tiwari and Edward Xu
Reacted by Tim Becker, Duprat and Maurycy Pawłowski-Wieroński

Activity

Next
  1. lunixbochs
    added
    type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
    on May 14, 2026
  2. skirpichev commented on May 14, 2026

    @skirpichev
    skirpichev
    on May 14, 2026
    Member
    More actions

    (125) Struct reinit races with pack/unpack in Modules/_struct.c

    Is this is same as #143379?

  3. lunixbochs commented on May 14, 2026

    @lunixbochs
    lunixbochs
    on May 14, 2026
    ContributorAuthor
    More actions

    (125) Struct reinit races with pack/unpack in Modules/_struct.c

    Is this is same as #143379?

    Looks pretty similar, just as a threading race instead of reentrancy.

  4. skirpichev commented on May 14, 2026

    @skirpichev
    skirpichev
    on May 14, 2026
    Member
    More actions

    Then I think it's not something worth fixing, on same ground.

    Reacted by Ryan Hileman and Maurycy Pawłowski-Wieroński
  5. sobolevn
    added
    topic-free-threading
    on May 14, 2026
  6. sobolevn
    added a commit that references this issue on May 14, 2026

    pythongh-149816: Fix a RC in `_random.Random.__init__` method

    6632a25
  7. kumaraditya303 commented on May 14, 2026

    @kumaraditya303
    kumaraditya303
    on May 14, 2026
    Contributor
    More actions

    I don't think it is worth fixing issues of calling __init__ in multiple threads.

  8. lunixbochs commented on May 14, 2026

    @lunixbochs
    lunixbochs
    on May 14, 2026
    ContributorAuthor
    More actions

    Neither of the mentioned init bugs (struct / random) are init racing with itself, they're init racing with something else. The struct bug is far more contrived because it requires you to call init a second time while using the struct object. The random init/sample race seems fine to fix because if someone ever does manage to hit that they won't even get a crash, just incorrect numbers out of their seeded rng.

    There's a separate question on the cpython philosophy of "should a script be able to intentionally crash or memory corrupt the interpreter using the stdlib and no ctypes?", which should inform whether more contrived reentrancy issues / race conditions should be fixed

  9. picnixz
    added
    interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
    on May 15, 2026
  10. picnixz commented on May 15, 2026

    @picnixz
    picnixz
    on May 15, 2026
    Member
    More actions

    I will have a look at all issues related to SSL and crypto myself in 10 days unless someone beats me to it.

  11. sobolevn
    added 4 commits that reference this issue on May 15, 2026

    gh-149816: Fix race condition in `memoryview` with free-threading (#1…

    1fdf033

    [3.14] gh-149816: Fix race condition in `memoryview` with free-thread…

    76ecef8

    [3.15] gh-149816: Fix race condition in `memoryview` with free-thread…

    b3819ae

    gh-149816: Fix a race condition in `_PyBytes_FromList` with free-thre…

    46afba7
  12. sobolevn commented on May 16, 2026

    @sobolevn
    sobolevn
    on May 16, 2026
    Member
    More actions

    (36) does not seem correct, because _PyType_Lookup is supposed to return the borrowed reference by design.

  13. 64 remaining items

  14. picnixz commented on Oct 12, 2026

    @picnixz
    picnixz
    on Oct 12, 2026 · Hidden as resolved
    show commentMore actions
  15. nascheme
    added 2 commits that reference this issue on Oct 13, 2026

    [3.14] gh-149816: Fix race in subtype_getweakref in free-threading bu…

    2e332b2

    [3.15] gh-149816: Fix race in subtype_getweakref in free-threading bu…

    82bef22
  16. kevinprimeraquecreo-stack
    added this to Project_VKon Oct 18, 2026
  17. github-project-automation
    moved this to Todo in Project_VKon Oct 18, 2026
  18. github-project-automation
    moved this from Todo to In progress in Project_VKon Oct 18, 2026
  19. kevinprimeraquecreo-stack
    added this to Project_VKon Oct 18, 2026
  20. picnixz
    added a commit that references this issue on Oct 20, 2026

    gh-149816: fix a race when fetching OpenSSL digests (#153019)

    2346981
  21. ambv
    added a commit that references this issue on Oct 21, 2026

    [3.14] gh-149816: #96 Fix a race condition in invoke_gc_callback with…

    d8d3df5
  22. picnixz
    added 2 commits that reference this issue on Oct 21, 2026

    [3.15] gh-149816: fix a race when fetching OpenSSL digests (GH-153019) (

    605d16a

    [3.14] gh-149816: fix a race when fetching OpenSSL digests (GH-153019) (

    3d2f1b2
  23. DinoV
    added 4 commits that reference this issue on Oct 22, 2026

    gh-149816: Fix race between `setattr` and `object.__dict__` update (#…

    60e956e

    pythongh-149816: Fix another variant of race on setattr/managed dict …

    2f8aa46

    pythongh-149816: Fix another variant of race on setattr/managed dict …

    72a0e10

    pythongh-149816: Fix another variant of race on setattr/managed dict …

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)topic-free-threadingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      You are visitor 01402503 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.