Skip to content

gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323

Open
serhiy-storchaka wants to merge 2 commits into
python:mainfrom
serhiy-storchaka:tkinter-wrong-thread-crash
Open

gh-83274: Don't crash when a Tcl interpreter is deallocated in the wrong thread#152323
serhiy-storchaka wants to merge 2 commits into
python:mainfrom
serhiy-storchaka:tkinter-wrong-thread-crash

Conversation

@serhiy-storchaka

Copy link
Copy Markdown
Member

Dropping the last reference to a tkinter object from a thread other than the one its Tcl interpreter was created in ran Tcl_DeleteInterp() in that thread, which makes Tcl abort the whole process (Tcl_AsyncDelete: async handler deleted by the wrong thread). This typically happens when a tkinter object leaks into another thread and is garbage-collected there.

Tkapp_Dealloc() now checks the interpreter's thread and, when called in the wrong one, skips Tcl_DeleteInterp() and reports a RuntimeWarning (through the warnings machinery, so it can be filtered) instead of crashing. The interpreter is leaked, but it is small and can no longer be used once Python has dropped it.

Based on the approach in the draft PR #21532 by E. Paine.

…the wrong thread

Deallocating the interpreter from a thread other than the one it was created
in ran Tcl_DeleteInterp() there, which makes Tcl abort the process
("Tcl_AsyncDelete: async handler deleted by the wrong thread").

Tkapp_Dealloc() now leaks the interpreter in that case and reports a
RuntimeWarning instead.

Co-Authored-By: E. Paine <63801254+E-Paine@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ded build

On the free-threaded build the interpreter may be deallocated in its own
thread (deferred reference counting), so the RuntimeWarning is not emitted.
The no-crash guarantee is still checked by assert_python_ok().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting core review needs backport to 3.13 bugs and security fixes needs backport to 3.14 bugs and security fixes needs backport to 3.15 pre-release feature fixes, bugs and security fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant