Seekable did not record whether it was initialized. On a fresh Seekable,
or one whose init_buff() failed, decompress, offset_to_frame_index and
frame_decompressed_size made the C library read a NULL seek table. After a
failed re-initialization, decompress returned data from the refused buffer
using the previous seek table.
Separately, frame_decompressed_size(num_frames()), on Seekable and
SeekTable, read one entry past the end of the seek table.
The flaw was corrected by refusing to use a Seekable until an
initialization succeeded, and by checking the frame index.
{
"license": "CC0-1.0"
}{
"affected_functions": null,
"affects": {
"arch": [],
"functions": [
"zstd_safe::seekable::SeekTable::frame_decompressed_size",
"zstd_safe::seekable::Seekable::decompress",
"zstd_safe::seekable::Seekable::decompress_frame",
"zstd_safe::seekable::Seekable::frame_decompressed_size",
"zstd_safe::seekable::Seekable::offset_to_frame_index"
],
"os": []
}
}