| ... | ... | @@ -289,3 +289,22 @@ test "zero sized block" { |
| 289 | 289 | try expectEqualDecodedStreaming("", input_raw); |
| 290 | 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 | } |