From fe906f710ffdceb023317373e836ac0830ec9dcf Mon Sep 17 00:00:00 2001 From: Nikolay Zdravkov Date: Thu, 5 Nov 2026 06:33:23 +0200 Subject: [PATCH] fix: report incomplete zlib distance trees --- .../IronPython.Modules/zlib/zlib.net/InfTree.cs | 2 +- tests/suite/modules/misc/test_zlib.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/core/IronPython.Modules/zlib/zlib.net/InfTree.cs b/src/core/IronPython.Modules/zlib/zlib.net/InfTree.cs index 3a0be26d6..79280fe44 100644 --- a/src/core/IronPython.Modules/zlib/zlib.net/InfTree.cs +++ b/src/core/IronPython.Modules/zlib/zlib.net/InfTree.cs @@ -354,7 +354,7 @@ internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int { z.msg = "oversubscribed distance tree"; } - else if (r == (int)ZLibResultCode.Z_DATA_ERROR) + else if (r == (int)ZLibResultCode.Z_BUF_ERROR) { z.msg = "incomplete distance tree"; r = (int)ZLibResultCode.Z_DATA_ERROR; diff --git a/tests/suite/modules/misc/test_zlib.py b/tests/suite/modules/misc/test_zlib.py index 0a063537e..0bb3d94bb 100644 --- a/tests/suite/modules/misc/test_zlib.py +++ b/tests/suite/modules/misc/test_zlib.py @@ -9,7 +9,7 @@ import unittest import zlib -from iptest import IronPythonTestCase, run_test +from iptest import IronPythonTestCase, is_cli, run_test def create_gzip(text, path): import gzip @@ -76,6 +76,18 @@ def test_deflate(self): self.assertEqual(do.decompress(self.deflate_data), self.text) self.assertEqual(zlib.decompress(self.deflate_data, -zlib.MAX_WBITS), self.text) + def test_incomplete_distance_tree(self): + # The literal tree is complete, but the distance alphabet has only one code of length two. + data = bytes.fromhex('05c0010900000080a06dfe3f65') + message = 'incomplete distance tree' if is_cli else 'invalid distances set' + for streaming in (False, True): + with self.subTest(streaming=streaming): + with self.assertRaisesRegex(zlib.error, message): + if streaming: + zlib.decompressobj(-zlib.MAX_WBITS).decompress(data) + else: + zlib.decompress(data, -zlib.MAX_WBITS) + def test_gzip_stream(self): """gzip header, uncomplete header""" for delta in range(1, 25):