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.