diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2025-04-20 20:32:20 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2025-04-25 23:01:37 +0200 |
commit | 1fc0ee484f09a7a3c9724c765c52879602449dab (patch) | |
tree | f4bce9ccbd2f58cc4c659e94de8fe84ea4d236ba /libavcodec/webp.c | |
parent | e0df21b8c379f3e3025df9510258f91b0d01d3d8 (diff) | |
download | ffmpeg-1fc0ee484f09a7a3c9724c765c52879602449dab.tar.gz |
avcodec/webp: Check before allocations
Avoids freeing lateron.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec/webp.c')
-rw-r--r-- | libavcodec/webp.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libavcodec/webp.c b/libavcodec/webp.c index 2c918eac33..2843b953bd 100644 --- a/libavcodec/webp.c +++ b/libavcodec/webp.c @@ -341,30 +341,29 @@ static int read_huffman_code_normal(WebPContext *s, HuffReader *hc, len_counts[len]++; } - ret = huff_reader_build_canonical(&code_len_hc, code_length_code_lengths, len_counts, - NUM_CODE_LENGTH_CODES, s->avctx); - if (ret < 0) - return ret; - - code_lengths = av_malloc(alphabet_size); - if (!code_lengths) { - ret = AVERROR(ENOMEM); - goto finish; - } - if (get_bits1(&s->gb)) { int bits = 2 + 2 * get_bits(&s->gb, 3); max_symbol = 2 + get_bits(&s->gb, bits); if (max_symbol > alphabet_size) { av_log(s->avctx, AV_LOG_ERROR, "max symbol %d > alphabet size %d\n", max_symbol, alphabet_size); - ret = AVERROR_INVALIDDATA; - goto finish; + return AVERROR_INVALIDDATA; } } else { max_symbol = alphabet_size; } + ret = huff_reader_build_canonical(&code_len_hc, code_length_code_lengths, len_counts, + NUM_CODE_LENGTH_CODES, s->avctx); + if (ret < 0) + return ret; + + code_lengths = av_malloc(alphabet_size); + if (!code_lengths) { + ret = AVERROR(ENOMEM); + goto finish; + } + prev_code_len = 8; symbol = 0; memset(len_counts, 0, sizeof(len_counts)); |