| ... | @@ -289,3 +289,22 @@ test "zero sized block" { | ... | @@ -289,3 +289,22 @@ test "zero sized block" { |
| 289 | try expectEqualDecodedStreaming("", input_raw); | 289 | try expectEqualDecodedStreaming("", input_raw); |
| 290 | try expectEqualDecodedStreaming("", input_rle); | 290 | try expectEqualDecodedStreaming("", input_rle); |
| 291 | } | 291 | } |
| | 292 | |
| | 293 | test "declared raw literals size too large" { |
| | 294 | const input_raw = |
| | 295 | "\x28\xb5\x2f\xfd" ++ // zstandard frame magic number |
| | 296 | "\x00\x00" ++ // frame header: everything unset, window descriptor zero |
| | 297 | "\x95\x00\x00" ++ // block header with: last_block set, block_type compressed, block_size 18 |
| | 298 | "\xbc\xf3\xae" ++ // literals section header with: type raw, size_format 3, regenerated_size 716603 |
| | 299 | "\xa5\x9f\xe3"; // some bytes of literal content - the content is shorter than regenerated_size |
| | 300 | |
| | 301 | // Note that the regenerated_size in the above input is larger than block maximum size, so the |
| | 302 | // block can't be valid as it is a raw literals block. |
| | 303 | |
| | 304 | var fbs = std.io.fixedBufferStream(input_raw); |
| | 305 | var window: [1024]u8 = undefined; |
| | 306 | var stream = decompressor(fbs.reader(), .{ .window_buffer = &window }); |
| | 307 | |
| | 308 | var buf: [1024]u8 = undefined; |
| | 309 | try std.testing.expectError(error.MalformedBlock, stream.read(&buf)); |
| | 310 | } |