crossinterp.c: Use-after-free + leaked exception + shadowed variable
未关闭
还没有人认领这个 Issue。
extension-modules
topic-subinterpreters
type-bug
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
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
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 crossinterp_exceptions.h:85、crossinterp_data_lookup.h:102 和 crossinterp.c:2968 开始,然后在 CPython main 上运行提供的 _interpchannels 引用计数复现程序。检查现有的 PR,因为 shadowed-variable 问题已经被报告为已修复;完成的标准是修正剩余的两个异常和引用管理 bug,且不存在泄漏或 use-after-free 行为。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- c, python
- 领域
- backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100