Commit 60b0b21296
Changed files (2)
lib
std
compress
lib/std/compress/zstd/Decompress.zig
@@ -158,7 +158,18 @@ fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
switch (d.state) {
.new_frame => {
- // Allow error.EndOfStream only on the frame magic.
+ // Only return EndOfStream when there are exactly 0 bytes remaining on the
+ // frame magic. Any partial magic bytes should be considered a failure.
+ in.fill(@sizeOf(Frame.Magic)) catch |err| switch (err) {
+ error.EndOfStream => {
+ if (in.bufferedLen() != 0) {
+ d.err = error.BadMagic;
+ return error.ReadFailed;
+ }
+ return err;
+ },
+ else => |e| return e,
+ };
const magic = try in.takeEnumNonexhaustive(Frame.Magic, .little);
initFrame(d, w.buffer.len, magic) catch |err| {
d.err = err;
lib/std/compress/zstd.zig
@@ -121,6 +121,12 @@ test Decompress {
try testExpectDecompress(uncompressed, compressed19);
}
+test "partial magic number" {
+ const input_raw =
+ "\x28\xb5\x2f"; // 3 bytes of the 4-byte zstandard frame magic number
+ try testExpectDecompressError(error.BadMagic, input_raw);
+}
+
test "zero sized raw block" {
const input_raw =
"\x28\xb5\x2f\xfd" ++ // zstandard frame magic number