| ... | @@ -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. |
| 399 | fn writeMatch(w: *Writer, length: u16, distance: u16) !void { | 403 | fn 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; |