python / python/cpython

zipinfo: strict_timestamps=False fails in combination with SOURCE_DATE_EPOCH

未關閉
#152,445 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

stdlib type-bug
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

Bug report

Bug description:

I have a python program which (among other things) adds a text file to a ZIP with the following code:

zf = zipfile.ZipFile(filename, "a")
zf.writestr("test.txt", "Hello World")
zf.close()

In Python 3.13 and below this worked fine. In Python 3.14 I received a bug report from a NixOS user. For some reason, some tool in their environment had set SOURCE_DATE_EPOCH to a low value between 0 (1970) and 315529200 (1980).

Since Python 3.14, when adding a file to a ZIP, Python honors that variable (so this bug seems to be directly caused by #124435 ). This caused it to fail to add the text file to the ZIP because it tried to use that date for the file's modification date which ZIP doesn't support:

  File "/uv/python/cpython-3.14.4-linux-x86_64-gnu/lib/python3.14/zipfile/__init__.py", line 561, in FileHeader
    header = struct.pack(structFileHeader, stringFileHeader,
                         self.extract_version, self.reserved, flag_bits,
                         self.compress_type, dostime, dosdate, CRC,
                         compress_size, file_size,
                         len(filename), len(extra))
struct.error: 'H' format requires 0 <= number <= 65535

Then I thought, okay, maybe that's a bug in my script, and I added strict_timestamps=False. According to the documentation, that should make it so that dates before 1980 are set to 1980, and dates after 2107 are set to 2107.

Perfect - or so I thought.

Apparently, that only works if I add an file whose actual file system timestamp is before 1980 (as the timestamp is manipulated in the from_file function). When I add a file to the ZIP using writestr, and the timestamp comes from SOURCE_DATE_EPOCH, and it refers to a date before 1980, the timestamp doesn't get updated to 1980 and it just fails to add the given file.

Same issue also appears, by the way, if the actual system time is set to some date in the 1970s. It doesn't set the time to 1980, it just tries to add the file with the current time of 1970 and then fails.

That looks like a bug to me - if I set strict_timestamps=False, I have set SOURCE_DATE_EPOCH (or my system time) to a time before 1980 and I then add a file to the ZIP using writestr, I'd expect it to set the timestamp to 1980, not just throw an exception.

CPython versions tested on:

3.14 and 3.15

Operating systems tested on:

Linux

Linked PRs
  • gh-152452

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 zipfile/init.py 中 FileHeader 附近開始,追蹤 writestr 的時間戳路徑,並將其與 from_file 對 strict_timestamps 的處理進行比較。當 strict_timestamps=False 將來自 SOURCE_DATE_EPOCH 或系統時鐘的 1980 年之前的時間戳限制為 1980 年,而不是引發所示的 struct.error 時,這項修改就完成了;請檢查 gh-152452,因為該 issue 連結到一個 pull request。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
backend
Issue 類型
缺陷
難度
3/5
預估耗時
1-2 天
活躍度
停滯
描述清晰度
描述清楚
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。