authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 16:02:06-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
logc9ff068391b18b0c6fe90a46c39e6e2956512660
tree5582149e4fad77ac5b45c5aa1caf3b94d4c8af76
parent165cd87c122b9c0a78377bb9f87b2d5d2b3ae661

std.compress: fix discard impl and flate error detection


2 files changed, 9 insertions(+), 1 deletions(-)

lib/std/compress/flate/Decompress.zig+5-1
...@@ -100,6 +100,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {...@@ -100,6 +100,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
100 .buffer = r.buffer,100 .buffer = r.buffer,
101 .end = r.end,101 .end = r.end,
102 };102 };
103 defer {
104 r.end = writer.end;
105 r.seek = r.end;
106 }
103 const n = r.stream(&writer, limit) catch |err| switch (err) {107 const n = r.stream(&writer, limit) catch |err| switch (err) {
104 error.WriteFailed => unreachable,108 error.WriteFailed => unreachable,
105 error.ReadFailed => return error.ReadFailed,109 error.ReadFailed => return error.ReadFailed,
...@@ -397,7 +401,7 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S...@@ -397,7 +401,7 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S
397/// Write match (back-reference to the same data slice) starting at `distance`401/// Write match (back-reference to the same data slice) starting at `distance`
398/// back from current write position, and `length` of bytes.402/// back from current write position, and `length` of bytes.
399fn writeMatch(w: *Writer, length: u16, distance: u16) !void {403fn writeMatch(w: *Writer, length: u16, distance: u16) !void {
400 if (w.end < length) return error.InvalidMatch;404 if (w.end < distance) return error.InvalidMatch;
401 if (length < Token.base_length) return error.InvalidMatch;405 if (length < Token.base_length) return error.InvalidMatch;
402 if (length > Token.max_length) return error.InvalidMatch;406 if (length > Token.max_length) return error.InvalidMatch;
403 if (distance < Token.min_distance) return error.InvalidMatch;407 if (distance < Token.min_distance) return error.InvalidMatch;
lib/std/compress/zstd/Decompress.zig+4
...@@ -122,6 +122,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {...@@ -122,6 +122,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
122 .buffer = r.buffer,122 .buffer = r.buffer,
123 .end = r.end,123 .end = r.end,
124 };124 };
125 defer {
126 r.end = writer.end;
127 r.seek = r.end;
128 }
125 const n = r.stream(&writer, limit) catch |err| switch (err) {129 const n = r.stream(&writer, limit) catch |err| switch (err) {
126 error.WriteFailed => unreachable,130 error.WriteFailed => unreachable,
127 error.ReadFailed => return error.ReadFailed,131 error.ReadFailed => return error.ReadFailed,