Crash: `mmap` access can `SIGBUS` after backing file is truncated
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
Summary
An mmap.mmap object can become internally inconsistent after its
backing file is truncated to zero.
After truncation:
m.size()reports the new file size correctlylen(m)still reports the original mapping length- ordinary access such as
m[0]can crash the process withSIGBUS
I think it's a genuine question whether the correct "fix" is a
paternalistic change in C behavior or just adding a more prominent
warning in the docs about the pattern and OS differences, but it
does seem particularly pathological in its current form.
Minimal Reproducer
import mmap
import tempfile
f = tempfile.NamedTemporaryFile()
f.write(b"\0" * 4096)
f.flush()
m = mmap.mmap(f.fileno(), 4096)
f.truncate(0)
f.flush()
print(m.size()) # 0
print(len(m)) # 4096
print(m[0]) # SIGBUS
On my system this exits with SIGBUS / exit code 135. I tested all the way
to 3.8 and got the same SIGBUS every time, so at least this isn't new.
Expected Behavior
If the mapping becomes invalid because the backing file shrank, I would
expect CPython not to keep exposing the old length and then hard-crash
on a normal operation.
Actual Behavior
The object still looks readable according to len(m), but using that
range can crash the interpreter.
Additional Affected Operations
I was able to hit the same SIGBUS with more than just m[0],
including:
findrfindreadlineread_bytewrite_bytemovememoryview(m)bytes(m)- slicing
- iteration
Behavior Sketch
flowchart TD
A["create mmap of 4096-byte file"] --> B["length is 4096"]
B --> C["truncate backing file to zero"]
C --> D["reported file size becomes zero"]
D --> E["reported mapping length stays 4096"]
E --> F["access first byte"]
F --> G["SIGBUS"]
Related Issues
I realize there have been older mmap / SIGBUS reports around
resized underlying files, but this truncate-to-zero case still
reproduces for me on a currently supported CPython release.
-
#60416
mmap() dumps core upon resizing the underlying file
Closest historical peer. Same broad pattern: the backing file changes
after mapping, and later access crashes. Old migrated issue, but still
the strongest prior-art reference I found. -
#84897
accessing mmap of file that is overwritten causes bus error
Related. Same end result (SIGBUS) after the underlying file
contents/extent change, but a different trigger than truncate-to-zero. -
#119817
SIGBUS: writing to mmaped device beyond file size
Related, but not a duplicate. Same bug class: the Python-visible
mapping range still looks usable, but the OS faults on real access.
Different scenario: mapped device / write beyond real extent. -
#114390
SharedMemory crashes on linux with SIGBUS on insufficient shm
Related, but not a duplicate. Same OS-level failure mode: mapping
succeeds, later access faults withSIGBUS. Different subsystem:
multiprocessing.shared_memory.
CPython versions tested on:
3.14
Operating systems tested on:
Linux
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从最小的 Python 复现程序开始,将其 truncate-to-zero 行为与相关 issue #60416、#84897、#119817 和 #114390 进行比较。确定已接受的解决方案是安全地更改 mmap 行为,还是提供更清晰的文档,然后验证所选择的结果能够防止或明确处理报告的 SIGBUS 场景。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- operating-systems
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 需要澄清
- 新手友好度
- 42/100