Skip to content

gh-160310: Fix quadratic one-shot decompress() with many members - #160311

Open
gpshead wants to merge 1 commit into
python:mainfrom
gpshead:scanfix-gzip-9r8so5s2
Open

gpshead wants to merge 1 commit into
python:mainfrom
gpshead:scanfix-gzip-9r8so5s2

Conversation

@gpshead

@gpshead gpshead commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

The one-shot decompress() functions of gzip, bz2, lzma and compression.zstd gave each new decompressor all of the remaining input and copied the rest back through unused_data, so input with many members took quadratic time. They now feed each member in chunks that start at 1 KiB and double, and step back over unused_data by offset; the first chunk is the whole input, so single-member data still takes one decompressor call. Results are unchanged for bytes-like input, but bz2, lzma and zstd now slice a memoryview of the argument, so a non-contiguous memoryview raises TypeError where it raised BufferError, and the TypeError for a non-buffer argument has a different message.

Fixes #160310

ANT-2026-9R8SO5S2

gzip.decompress(), bz2.decompress(), lzma.decompress() and
compression.zstd.decompress() passed all of the remaining input to a new
decompressor for every member and copied the rest back via unused_data.
Feed each member in chunks of increasing size instead.

@gpshead gpshead left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A high level comment I have on this PR... could or should we meaningfully factor out the common shape memoryview loop code used across multiple decompressors?

@emmatyping

Copy link
Copy Markdown
Member

A high level comment I have on this PR... could or should we meaningfully factor out the common shape memoryview loop code used across multiple decompressors?

I think yes, seems reasonable for compression._common!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

One-shot decompress() in gzip, bz2, lzma and compression.zstd is quadratic in the number of members

2 participants