python / python/cpython

Data race on `event_tstate` in `_tkinter.c` under free-threading

Abierto
#153,020 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

extension-modules topic-free-threading topic-tkinter type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:

event_tstate in Modules/_tkinter.c is written without synchronization in EnableEventHook() (~line 3545) and read under tcl_lock in EventHook() (~line 3507). _tkinter declares Py_MOD_GIL_NOT_USED, so the GIL no longer serializes these accesses under --disable-gil.

A torn read of event_tstate hands ENTER_PYTHON / PyEval_RestoreThread a dangling or NULL thread state.

Code

Write site (no lock):

// Modules/_tkinter.c, EnableEventHook, ~line 3545
event_tstate = tstate;

Read site (under tcl_lock only):

// Modules/_tkinter.c, EventHook, ~line 3507
Py_BEGIN_ALLOW_THREADS
if(tcl_lock) PyThread_acquire_lock(tcl_lock, 1);
tcl_tstate = event_tstate;    // racy read
result = Tcl_DoOneEvent(TCL_DONT_WAIT);
tcl_tstate = NULL;
if(tcl_lock) PyThread_release_lock(tcl_lock);
...
Py_END_ALLOW_THREADS

The write in EnableEventHook happens entirely outside tcl_lock.

Suggested fix

// Write site
_Py_atomic_store_ptr(&event_tstate, tstate);

// Read site
tcl_tstate = _Py_atomic_load_ptr(&event_tstate);
CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux, macOS

Linked PRs
  • gh-153640

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en Modules/_tkinter.c, en EnableEventHook (~line 3545) y EventHook (~line 3507), y después revisa las APIs de punteros atómicos sugeridas. Verifica que ambos accesos estén sincronizados con --disable-gil; se considera terminado cuando se haya eliminado la condición de carrera de event_tstate sin introducir un manejo inválido del estado de los hilos.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
c, python
Área
backend
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.