[FFmpeg-devel] [PATCH] avcodec/jpegxl_parser: fix reading lz77-pair as initial entropy symbol
Kacper Michajlow
kasper93 at gmail.com
Wed Nov 13 03:32:49 EET 2024
On Thu, 7 Nov 2024 at 17:31, Leo Izen <leo.izen at gmail.com> wrote:
>
> The JPEG XL parser has an entropy decoder inside, which supports LZ77
> length-distance pairs. If the first symbol from the entropy stream is an
> LZ77 pair, the bitstream is invalid, so we should abort immediately rather
> than attempt to read it anyway (which would read from the uninitialized
> starting window).
>
> Reported-by: Kacper Michajłow <kasper93 at gmail.com>
> Found-by: ossfuzz
> Fixes: 368725676/clusterfuzz-testcase-minimized-fuzzer_protocol_file-6022251122589696-cut
> Fixes: 42537758/clusterfuzz-testcase-minimized-fuzzer_protocol_file-5818969469026304-cut
> Signed-off-by: Leo Izen <leo.izen at gmail.com>
> ---
> libavcodec/jpegxl_parser.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/libavcodec/jpegxl_parser.c b/libavcodec/jpegxl_parser.c
> index 746c429b9c..76122af54a 100644
> --- a/libavcodec/jpegxl_parser.c
> +++ b/libavcodec/jpegxl_parser.c
> @@ -352,6 +352,8 @@ static int decode_hybrid_varlen_uint(GetBitContext *gb, JXLEntropyDecoder *dec,
>
> if (bundle->lz77_enabled && token >= bundle->lz77_min_symbol) {
> const JXLSymbolDistribution *lz77dist = &bundle->dists[bundle->cluster_map[bundle->num_dist - 1]];
> + if (!dec->num_decoded)
> + return AVERROR_INVALIDDATA;
> ret = read_hybrid_uint(gb, &bundle->lz_len_conf, token - bundle->lz77_min_symbol, &dec->num_to_copy);
> if (ret < 0)
> return ret;
> @@ -531,6 +533,7 @@ static int read_dist_clustering(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDi
> dec->state = -1;
> /* it's not going to necessarily be zero after reading */
> dec->num_to_copy = 0;
> + dec->num_decoded = 0;
> dist_bundle_close(&nested);
> if (use_mtf) {
> uint8_t mtf[256];
> --
> 2.47.0
I can confirm it works, thanks.
- Kacper
More information about the ffmpeg-devel
mailing list