Skip to content

[3.13] gh-151497: Avoid huge pre-allocation for oversized tarfile extended headers (GH-151498)#151978

Open
miss-islington wants to merge 1 commit into
python:3.13from
miss-islington:backport-da99711-3.13
Open

[3.13] gh-151497: Avoid huge pre-allocation for oversized tarfile extended headers (GH-151498)#151978
miss-islington wants to merge 1 commit into
python:3.13from
miss-islington:backport-da99711-3.13

Conversation

@miss-islington

@miss-islington miss-islington commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

tarfile reads a member's extended header (a GNU long name/link or a pax
header) with a single read sized by the header's size field:

buf = tarfile.fileobj.read(self._block(self.size))

The size is taken from the archive and is not validated, so a ~512-byte
crafted file can claim several gigabytes (or, via base-256 encoding, far
more) and make read() pre-allocate that much memory -- on open/iterate,
before any extraction filter runs.

Read the extended-header data in bounded chunks instead, so an oversized
or truncated header can no longer force a huge allocation. The bytes
returned for valid archives are unchanged.
(cherry picked from commit da99711)

Co-authored-by: Shardul Deshpande iamsharduld@users.noreply.github.com

…nded headers (pythonGH-151498)

tarfile reads a member's extended header (a GNU long name/link or a pax
header) with a single read sized by the header's size field:

    buf = tarfile.fileobj.read(self._block(self.size))

The size is taken from the archive and is not validated, so a ~512-byte
crafted file can claim several gigabytes (or, via base-256 encoding, far
more) and make read() pre-allocate that much memory -- on open/iterate,
before any extraction filter runs.

Read the extended-header data in bounded chunks instead, so an oversized
or truncated header can no longer force a huge allocation. The bytes
returned for valid archives are unchanged.
(cherry picked from commit da99711)

Co-authored-by: Shardul Deshpande <iamsharduld@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants