tarfile indeterminate TarInfo.size when PAX headers contain `size` and `GNU.sparse.realsize` keys at the same time
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 36k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
Hello,
I am currently debugging this issue.
I have noticed that the bug can be reproduced when the problematic file is truncated to 9 GiB B but it does not happen when truncated to 8 GiB.
The problem seems to be that the next member offset is computed wrong. It seems to point 512 B after the correct TAR header, which, in this case, points into the data for the extended attributes such as 30 mtime=1752348[...].
One of the differences seems to be this code part, which is not hit for the working case:
While looking into the line above, i.e., into _apply_pax_info, I noticed that there is no definite order for applying the size even though it can appear multiple times!
In the non-working case, the PAX headers look like this:
{'GNU.sparse.major': '1',
'GNU.sparse.minor': '0',
'GNU.sparse.name': 'userdata',
'GNU.sparse.realsize': '9663676416',
'atime': '1752349406.975921575',
'ctime': '1752349534.57652562',
'mtime': '1752349534.57652562',
'size': '9602318848'}
I.e, the size member first gets set to GNU.sparse.realsize and then to size. The debug output looks like this:
[_apply_pax_info] SET SIZE to: 9663676416 from key: GNU.sparse.realsize
[_apply_pax_info] SET SIZE to: 9602318848 from key: size
[_apply_pax_info] SET key to: 1752349534.5765257 from key: mtime
Is it specified that the order of the PAX headers must always be this way? Else, one might just as well encounter it like this:
{'atime': '1752349406.975921575',
'ctime': '1752349534.57652562',
'mtime': '1752349534.57652562',
'size': '9602318848',
'GNU.sparse.major': '1',
'GNU.sparse.minor': '0',
'GNU.sparse.name': 'userdata',
'GNU.sparse.realsize': '9663676416'}
and either one of these orders would be a bug.
The working case does not have this ambiguity:
{'GNU.sparse.major': '1',
'GNU.sparse.minor': '0',
'GNU.sparse.name': 'userdata',
'GNU.sparse.realsize': '8589934592',
'atime': '1752349538.445543898',
'ctime': '1752351104.53673501',
'mtime': '1752351104.53673501'}
the debug output looks like this:
[_apply_pax_info] SET SIZE to: 8589934592 from key: GNU.sparse.realsize
[_apply_pax_info] SET key to: 1752351104.536735 from key: mtime
I.e., even if the is no ordering problem, there already are different semantics for the TarInfo.size member as one will contain GNU.sparse.realsize and the other will contain [PAXHeader.]size.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-136622
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 Lib/tarfile.py 开始,尤其关注 _apply_pax_info 以及所引用行附近的大小处理。重现 8 GiB 和 9 GiB 的不同情况,并检查关联的 PR gh-136622。完成的标准是:PAX 大小语义和 TarInfo.size 的行为都明确无歧义,并由适当的回归测试覆盖。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- tooling
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 20/100