crossinterp.c: Use-after-free + leaked exception + shadowed variable
Nadie ha tomado este issue todavía.
- 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:
Original gist: https://gist.github.com/devdanzin/a56b8cb579b1950b4206e8a42d6be650
Summary
Three bugs in the cross-interpreter subsystem:
- _ensure_notshareableerror (crossinterp_exceptions.h:85): Missing
returnafter_PyErr_SetRaisedExceptionstealsctxref. Falls through to code using freed pointer.- _PyXI_UnwrapNotShareableError (crossinterp_data_lookup.h:102): Exception removed from thread state via
_PyErr_GetRaisedException, then_PyXI_InitFailurefails → exception leaked, thread error indicator cleared.- _pop_preserved (crossinterp.c:2968): Inner
_PyXI_namespace *xidatashadows outer.goto errorcleanup checks outer (NULL) variable → inner allocation leaked.Reproducer (ref leak)
import _interpchannels as ch, sys cid = ch.create() before = sys.gettotalrefcount() for i in range(10000): try: ch.send(cid, lambda: None, blocking=False) except Exception: pass after = sys.gettotalrefcount() ch.destroy(cid) print(f"Leaked {after - before} refs (~{(after-before)//10000}/send)")
The third issue is already fixed by https://github.com/python/cpython/pull/147999
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs
- gh-153665
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza por crossinterp_exceptions.h:85, crossinterp_data_lookup.h:102 y crossinterp.c:2968; después ejecuta en CPython main el reproductor de referencia de conteo de referencias _interpchannels proporcionado. Comprueba los PR existentes, ya que el problema de la variable sombreada ya se ha reportado como corregido; se considera terminado cuando los dos errores restantes relacionados con las excepciones y la gestión de referencias estén corregidos sin fugas ni comportamiento use-after-free.
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
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100