You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
avcodec/jpegxl_parser: add sanity check for frame size
If a frame size is absolutely massive, this can spin the parser as it attempts to decode a permuted TOC. We add a sanity check here for eight times the size of the image for an internal frame to prevent malicious bitstreams from slowing the parser down to a crawl. Signed-off-by: Leo Izen <leo.izen@gmail.com> Reported-by: Kacper Michajłow <kasper93@gmail.com>
This commit is contained in:
@ -1315,6 +1315,13 @@ static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *
|
|||||||
if (get_bits1(gb)) {
|
if (get_bits1(gb)) {
|
||||||
JXLEntropyDecoder dec;
|
JXLEntropyDecoder dec;
|
||||||
int64_t end, lehmer = 0;
|
int64_t end, lehmer = 0;
|
||||||
|
/* parser sanity check to prevent TOC perm from spinning cpu */
|
||||||
|
if (width > meta->coded_width * 8 || height > meta->coded_height * 8) {
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "frame of size %" PRIu32 "x%" PRIu32
|
||||||
|
" exceeds max size of %" PRIu32 "x%" PRIu32 ", aborting parser\n",
|
||||||
|
width, height, meta->coded_width * 8, meta->coded_height * 8);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
ret = entropy_decoder_init(avctx, gb, &dec, 8);
|
ret = entropy_decoder_init(avctx, gb, &dec, 8);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -1331,7 +1338,7 @@ static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *
|
|||||||
lehmer = entropy_decoder_read_symbol(gb, &dec, toc_context(lehmer));
|
lehmer = entropy_decoder_read_symbol(gb, &dec, toc_context(lehmer));
|
||||||
if (lehmer < 0 || get_bits_left(gb) < 0) {
|
if (lehmer < 0 || get_bits_left(gb) < 0) {
|
||||||
entropy_decoder_close(&dec);
|
entropy_decoder_close(&dec);
|
||||||
return AVERROR_BUFFER_TOO_SMALL;
|
return lehmer < 0 ? lehmer : AVERROR_BUFFER_TOO_SMALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
entropy_decoder_close(&dec);
|
entropy_decoder_close(&dec);
|
||||||
|
Reference in New Issue
Block a user