From 70e4ccb00e1f0547406f531bed288b98563b2d7e Mon Sep 17 00:00:00 2001 From: Ekalabya Ghosh Date: Fri, 25 Sep 2026 23:13:12 +0530 Subject: [PATCH] gh-158181: fix IndexError instead of ReadError on truncated GNU sparse header _proc_sparse() read the extended header block for a GNU sparse member with a plain read(BLOCKSIZE) instead of checking for a short/empty result, so a truncated archive whose sparse member has isextended set made nti() raise IndexError (s[0] on an empty buffer) instead of the documented ReadError. Raise ReadError directly when the read is short, matching the pattern used elsewhere in this module for truncated data. --- Lib/tarfile.py | 2 ++ .../Library/2026-09-25-17-42-56.gh-issue-158181.v7PCZg.rst | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-09-25-17-42-56.gh-issue-158181.v7PCZg.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index a4f9ce3311f6dad..e995f9d5c867211 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1494,6 +1494,8 @@ def _proc_sparse(self, tarfile): # Collect sparse structures from extended header blocks. while isextended: buf = tarfile.fileobj.read(BLOCKSIZE) + if len(buf) < BLOCKSIZE: + raise ReadError("unexpected end of data") pos = 0 for i in range(21): try: diff --git a/Misc/NEWS.d/next/Library/2026-09-25-17-42-56.gh-issue-158181.v7PCZg.rst b/Misc/NEWS.d/next/Library/2026-09-25-17-42-56.gh-issue-158181.v7PCZg.rst new file mode 100644 index 000000000000000..20d5424cf36a885 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-09-25-17-42-56.gh-issue-158181.v7PCZg.rst @@ -0,0 +1,3 @@ +Fix :exc:`IndexError` instead of :exc:`tarfile.ReadError` when +:mod:`tarfile` reads a truncated GNU sparse member whose extended header +block is missing or short.