`zlib._ZlibDecompressor(zdict=...)` raises `SystemError` on a zlib-wrapped stream
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 72/100
Rechercherichtung
Beginne in Modules/zlibmodule.c: Lies den Konstruktor von _ZlibDecompressor um die Zeilen 1775–1780 und decompress_buf um die Zeilen 1535–1541 und vergleiche anschließend, wie Decompress Z_NEED_DICT um die Zeilen 932–938 behandelt. Ergänze Tests für den Fall eines verpackten Datenstroms, der in den Hypothesis-Tests aus PR #159960 als ZlibDecompressorZdictTests.test_zlib_wrapper festgehalten ist; fertig ist es, wenn das bereitgestellte Wörterbuch den Datenstrom dekomprimiert und das Verhalten bei einem fehlenden Wörterbuch zlib.error auslöst.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Bug description
zlib._ZlibDecompressor accepts a zdict argument, but for a zlib-wrapped stream (positive wbits) compressed with that dictionary, decompress fails with a SystemError instead of decompressing. zlib.decompressobj handles the same input:
>>> import zlib
>>> zd = b"hello world " * 10
>>> c = zlib.compressobj(zdict=zd)
>>> s = c.compress(b"hello world hello") + c.flush()
>>> zlib.decompressobj(zdict=zd).decompress(s)
b'hello world hello'
>>> zlib._ZlibDecompressor(zdict=zd).decompress(s)
Traceback (most recent call last):
File "<python-input-5>", line 1, in <module>
zlib._ZlibDecompressor(zdict=zd).decompress(s)
SystemError: <method 'decompress' of 'zlib._ZlibDecompressor' objects> returned NULL without setting an exception
Raw deflate works, so this is specific to the wrapped format:
>>> c = zlib.compressobj(wbits=-15, zdict=zd)
>>> s = c.compress(b"hello world hello") + c.flush()
>>> zlib._ZlibDecompressor(-15, zdict=zd).decompress(s)
b'hello world hello'
Two things combine here. The constructor only applies the dictionary up front for raw deflate (wbits < 0): Modules/zlibmodule.c lines 1775-1780. For a wrapped stream zlib instead signals Z_NEED_DICT after reading the header, and decompress_buf handles that by jumping to error without setting an exception: Modules/zlibmodule.c lines 1535-1541. zlib.Decompress handles the same return by calling inflateSetDictionary and continuing: Modules/zlibmodule.c lines 932-938, which is presumably what _ZlibDecompressor should do as well (and raise zlib.error when no zdict was given, as Decompress does).
_ZlibDecompressor is private and gzip only uses it with wbits=-15, so the impact is low; but a SystemError from a C method is always a bug, and the argument is accepted for this case, so we may as well fix it.
Found by the Hypothesis tests in #159960, recorded there as ZlibDecompressorZdictTests.test_zlib_wrapper under expectedFailure.
CPython versions tested on
CPython main (4e3d5ecaad2), zlib 1.3.2
Operating systems tested on
Linux
- Vorherrschende Sprache
- Python
- Sterne
- 77.7k
- Forks
- 38.3k
- Ø Merge
- 12 Std. 27 Min.
- Gemergte PRs (30 T.)
- 645
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus python/cpython
-
tests topic-profiling type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
extension-modules type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
Maintainer antworten meist innerhalb von 1 Tag
-
tests topic-multiprocessing type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 71/100
Maintainer antworten meist innerhalb von 1 Tag
-
interpreter-core type-feature
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
python/cpython#160109 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
stdlib topic-XML type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
Ähnliche Issues
-
good first issue priority: low size: XS testing
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 86/100
cubrid-lab/cubrid-mcp-server#385 ·
Maintainer antworten meist innerhalb von 1 Tag
-
good first issue priority: low size: S testing
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
cubrid-lab/cubrid-cookbook-python#447 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Python PointcloudOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
ArduCAM/Arducam_tof_camera#125 ·
-
area:curator enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
CassioDalla/Scrinalia#150 ·
Maintainer antworten meist innerhalb von 1 Tag
-
documentation good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100