Merge pull request #24847 from squeek502/zstd-partial-magic
zstd.Decompress: Treat a partial magic number as a failure
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -17,7 +17,6 @@ const State = union(enum) {
|
||||
new_frame,
|
||||
in_frame: InFrame,
|
||||
skipping_frame: usize,
|
||||
end,
|
||||
|
||||
const InFrame = struct {
|
||||
frame: Frame,
|
||||
@@ -158,7 +157,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;
|
||||
@@ -192,7 +202,6 @@ fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
||||
if (remaining.* == 0) d.state = .new_frame;
|
||||
return 0;
|
||||
},
|
||||
.end => return error.EndOfStream,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user