aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/webp.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2025-04-20 20:32:20 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2025-04-25 23:01:37 +0200
commit1fc0ee484f09a7a3c9724c765c52879602449dab (patch)
treef4bce9ccbd2f58cc4c659e94de8fe84ea4d236ba /libavcodec/webp.c
parente0df21b8c379f3e3025df9510258f91b0d01d3d8 (diff)
downloadffmpeg-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.c25
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));