std.compress: fix discard impl and flate error detection

This commit is contained in:
Andrew Kelley 2025-07-31 16:02:06 -07:00
parent 165cd87c12
commit c9ff068391
2 changed files with 9 additions and 1 deletions

View File

@ -100,6 +100,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
.buffer = r.buffer, .buffer = r.buffer,
.end = r.end, .end = r.end,
}; };
defer {
r.end = writer.end;
r.seek = r.end;
}
const n = r.stream(&writer, limit) catch |err| switch (err) { const n = r.stream(&writer, limit) catch |err| switch (err) {
error.WriteFailed => unreachable, error.WriteFailed => unreachable,
error.ReadFailed => return error.ReadFailed, 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` /// Write match (back-reference to the same data slice) starting at `distance`
/// back from current write position, and `length` of bytes. /// back from current write position, and `length` of bytes.
fn writeMatch(w: *Writer, length: u16, distance: u16) !void { 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.base_length) return error.InvalidMatch;
if (length > Token.max_length) return error.InvalidMatch; if (length > Token.max_length) return error.InvalidMatch;
if (distance < Token.min_distance) return error.InvalidMatch; if (distance < Token.min_distance) return error.InvalidMatch;

View File

@ -122,6 +122,10 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
.buffer = r.buffer, .buffer = r.buffer,
.end = r.end, .end = r.end,
}; };
defer {
r.end = writer.end;
r.seek = r.end;
}
const n = r.stream(&writer, limit) catch |err| switch (err) { const n = r.stream(&writer, limit) catch |err| switch (err) {
error.WriteFailed => unreachable, error.WriteFailed => unreachable,
error.ReadFailed => return error.ReadFailed, error.ReadFailed => return error.ReadFailed,