From 503dcaf568c4dabe87520740319c59d8572681dc Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 3 Sep 2026 08:27:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(zlib):=20=E4=BF=AE=E5=A4=8D=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=9D=97=E7=A0=81=E9=95=BF=20RLE=20=E5=B0=BE=E9=83=A8?= =?UTF-8?q?=E4=B8=A2=E7=A0=81=E4=B8=8E=20gzip=20=E5=A4=B4=20FLG=20?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - zdeflate: count_cl_freqs/write_cl_encoded 非零码长重复段尾部 1~2 个相同值不再被 i+=run 静默跳过,改由外层按字面量编码,保证码长总数恰为 HLIT+HDIST - zinflate: gzip 头 FLG 改读偏移 3(input_pos-7),此前误读 MTIME[0] 导致真实 gzip(mtime 非 0)解析错位 --- includes/zlib/zdeflate.vp | 8 ++++++-- includes/zlib/zinflate.vp | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/includes/zlib/zdeflate.vp b/includes/zlib/zdeflate.vp index e79efda..f6f4a0b 100644 --- a/includes/zlib/zdeflate.vp +++ b/includes/zlib/zdeflate.vp @@ -329,7 +329,9 @@ def zdeflate_count_cl_freqs(all_lengths: INTPTR, total: t.CInt, cl_freqs: INTPTR if count > 6: count = 6 cl_freqs[16] += 1 run -= count - i += run + i += count + # 剩余的 1~2 个相同长度值不静默跳过,交由外层循环 + # 按字面量(符号 val)逐个统计,保证总覆盖数恰为 total def zdeflate_write_cl_encoded(all_lengths: INTPTR, total: t.CInt, w: zdef.zbit_writer | t.CPtr, cl_tree: zhuff.zhuff_tree | t.CPtr): @@ -367,7 +369,9 @@ def zdeflate_write_cl_encoded(all_lengths: INTPTR, total: t.CInt, cl_tree.encode_symbol(16, w) w.write_bits(count - 3, 2) run -= count - i += run + i += count + # 剩余的 1~2 个相同长度值不静默跳过,交由外层循环 + # 按字面量(符号 val)逐个编码,保证 RLE 覆盖总数恰为 total diff --git a/includes/zlib/zinflate.vp b/includes/zlib/zinflate.vp index 18cc5b4..4eabcd5 100644 --- a/includes/zlib/zinflate.vp +++ b/includes/zlib/zinflate.vp @@ -70,7 +70,8 @@ class zinflate_stream: self.is_gzip = 1 if self.input_pos + 10 > self.input_len: return -3 self.input_pos += 10 - flg: BYTE = self.input_data[self.input_pos - 6] + # FLG 位于 gzip 头第 4 字节(偏移 3),即 self.input_pos - 7 + flg: BYTE = self.input_data[self.input_pos - 7] if flg & 0x04: if self.input_pos + 2 > self.input_len: return -3 xlen: UINT = self.input_data[self.input_pos] | (self.input_data[self.input_pos + 1] << 8)