| author | |
| committer | |
| log | 8523cbef0e0145a1f4de84f49044b8c9a8657108 |
| tree | 7758461ad457121a94bc7e240855edf3afdd4630 |
| parent | 58e60697e2930f4311ae9e744ae1c2877e0b69ed |
2 files changed, 22 insertions(+), 4 deletions(-)
lib/std/compress/lzma.zig+12-1| ... | @@ -696,6 +696,7 @@ pub const Decompress = struct { | ... | @@ -696,6 +696,7 @@ pub const Decompress = struct { |
| 696 | .vtable = &.{ | 696 | .vtable = &.{ |
| 697 | .readVec = readVec, | 697 | .readVec = readVec, |
| 698 | .stream = stream, | 698 | .stream = stream, |
| 699 | .discard = discard, | ||
| 699 | }, | 700 | }, |
| 700 | .seek = 0, | 701 | .seek = 0, |
| 701 | .end = 0, | 702 | .end = 0, |
| ... | @@ -746,12 +747,22 @@ pub const Decompress = struct { | ... | @@ -746,12 +747,22 @@ pub const Decompress = struct { |
| 746 | return readIndirect(r); | 747 | return readIndirect(r); |
| 747 | } | 748 | } |
| 748 | 749 | ||
| 750 | fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { | ||
| 751 | const d: *Decompress = @alignCast(@fieldParentPtr("reader", r)); | ||
| 752 | _ = d; | ||
| 753 | _ = limit; | ||
| 754 | @panic("TODO"); | ||
| 755 | } | ||
| 756 | |||
| 749 | fn readIndirect(r: *Reader) Reader.Error!usize { | 757 | fn readIndirect(r: *Reader) Reader.Error!usize { |
| 750 | const d: *Decompress = @alignCast(@fieldParentPtr("reader", r)); | 758 | const d: *Decompress = @alignCast(@fieldParentPtr("reader", r)); |
| 751 | const gpa = d.gpa; | 759 | const gpa = d.gpa; |
| 752 | var allocating = Writer.Allocating.initOwnedSlice(gpa, r.buffer); | 760 | var allocating = Writer.Allocating.initOwnedSlice(gpa, r.buffer); |
| 753 | allocating.writer.end = r.end; | 761 | allocating.writer.end = r.end; |
| 754 | defer r.end = allocating.writer.end; | 762 | defer { |
| 763 | r.buffer = allocating.writer.buffer; | ||
| 764 | r.end = allocating.writer.end; | ||
| 765 | } | ||
| 755 | if (d.decode.state == math.maxInt(usize)) return error.EndOfStream; | 766 | if (d.decode.state == math.maxInt(usize)) return error.EndOfStream; |
| 756 | d.decode.process(d.input, &allocating, &d.buffer, &d.range_decoder) catch |err| switch (err) { | 767 | d.decode.process(d.input, &allocating, &d.buffer, &d.range_decoder) catch |err| switch (err) { |
| 757 | error.WriteFailed => { | 768 | error.WriteFailed => { |
lib/std/compress/lzma/test.zig+10-3| ... | @@ -18,7 +18,14 @@ fn testDecompressEqual(expected: []const u8, compressed: []const u8) !void { | ... | @@ -18,7 +18,14 @@ fn testDecompressEqual(expected: []const u8, compressed: []const u8) !void { |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | fn testDecompressError(expected: anyerror, compressed: []const u8) !void { | 20 | fn testDecompressError(expected: anyerror, compressed: []const u8) !void { |
| 21 | return std.testing.expectError(expected, testDecompress(compressed)); | 21 | const gpa = std.testing.allocator; |
| 22 | var stream: std.Io.Reader = .fixed(compressed); | ||
| 23 | |||
| 24 | var decompressor = try lzma.Decompress.initOptions(&stream, gpa, &.{}, .{}, std.math.maxInt(u32)); | ||
| 25 | defer decompressor.deinit(); | ||
| 26 | |||
| 27 | try std.testing.expectError(error.ReadFailed, decompressor.reader.allocRemaining(gpa, .unlimited)); | ||
| 28 | try std.testing.expectEqual(expected, decompressor.err orelse return error.TestFailed); | ||
| 22 | } | 29 | } |
| 23 | 30 | ||
| 24 | test "decompress empty world" { | 31 | test "decompress empty world" { |
| ... | @@ -76,14 +83,14 @@ test "known size with end of payload marker" { | ... | @@ -76,14 +83,14 @@ test "known size with end of payload marker" { |
| 76 | 83 | ||
| 77 | test "too big uncompressed size in header" { | 84 | test "too big uncompressed size in header" { |
| 78 | try testDecompressError( | 85 | try testDecompressError( |
| 79 | error.CorruptInput, | 86 | error.DecompressedSizeMismatch, |
| 80 | @embedFile("testdata/bad-too_big_size-with_eopm.lzma"), | 87 | @embedFile("testdata/bad-too_big_size-with_eopm.lzma"), |
| 81 | ); | 88 | ); |
| 82 | } | 89 | } |
| 83 | 90 | ||
| 84 | test "too small uncompressed size in header" { | 91 | test "too small uncompressed size in header" { |
| 85 | try testDecompressError( | 92 | try testDecompressError( |
| 86 | error.CorruptInput, | 93 | error.DecompressedSizeMismatch, |
| 87 | @embedFile("testdata/bad-too_small_size-without_eopm-3.lzma"), | 94 | @embedFile("testdata/bad-too_small_size-without_eopm-3.lzma"), |
| 88 | ); | 95 | ); |
| 89 | } | 96 | } |