From c9ff068391b18b0c6fe90a46c39e6e2956512660 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 31 Jul 2025 16:02:06 -0700 Subject: [PATCH] std.compress: fix discard impl and flate error detection --- lib/std/compress/flate/Decompress.zig | 6 +++++- lib/std/compress/zstd/Decompress.zig | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/std/compress/flate/Decompress.zig b/lib/std/compress/flate/Decompress.zig index 8faf8ac699..8b16b3b353 100644 --- a/lib/std/compress/flate/Decompress.zig +++ b/lib/std/compress/flate/Decompress.zig @@ -100,6 +100,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { .buffer = r.buffer, .end = r.end, }; + defer { + r.end = writer.end; + r.seek = r.end; + } const n = r.stream(&writer, limit) catch |err| switch (err) { error.WriteFailed => unreachable, error.ReadFailed => return error.ReadFailed, @@ -397,7 +401,7 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S /// Write match (back-reference to the same data slice) starting at `distance` /// back from current write position, and `length` of bytes. fn writeMatch(w: *Writer, length: u16, distance: u16) !void { - if (w.end < length) return error.InvalidMatch; + if (w.end < distance) return error.InvalidMatch; if (length < Token.base_length) return error.InvalidMatch; if (length > Token.max_length) return error.InvalidMatch; if (distance < Token.min_distance) return error.InvalidMatch; diff --git a/lib/std/compress/zstd/Decompress.zig b/lib/std/compress/zstd/Decompress.zig index d2f692ae61..bcb8e3b0da 100644 --- a/lib/std/compress/zstd/Decompress.zig +++ b/lib/std/compress/zstd/Decompress.zig @@ -122,6 +122,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { .buffer = r.buffer, .end = r.end, }; + defer { + r.end = writer.end; + r.seek = r.end; + } const n = r.stream(&writer, limit) catch |err| switch (err) { error.WriteFailed => unreachable, error.ReadFailed => return error.ReadFailed,