huffyuvdec: Check init_vlc() return codes.
Prevents out of array writes Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
99b1b2b1c6
commit
f67a0d1152
@ -124,6 +124,7 @@ static void generate_joint_tables(HYuvContext *s)
|
|||||||
int len1 = s->len[p][u];
|
int len1 = s->len[p][u];
|
||||||
if (len1 > limit)
|
if (len1 > limit)
|
||||||
continue;
|
continue;
|
||||||
|
av_assert0(i < (1 << VLC_BITS));
|
||||||
len[i] = len0 + len1;
|
len[i] = len0 + len1;
|
||||||
bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
|
bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
|
||||||
symbols[i] = (y << 8) + u;
|
symbols[i] = (y << 8) + u;
|
||||||
@ -158,6 +159,7 @@ static void generate_joint_tables(HYuvContext *s)
|
|||||||
int len2 = s->len[2][r & 255];
|
int len2 = s->len[2][r & 255];
|
||||||
if (len2 > limit1)
|
if (len2 > limit1)
|
||||||
continue;
|
continue;
|
||||||
|
av_assert0(i < (1 << VLC_BITS));
|
||||||
len[i] = len0 + len1 + len2;
|
len[i] = len0 + len1 + len2;
|
||||||
bits[i] = (code << len2) + s->bits[2][r & 255];
|
bits[i] = (code << len2) + s->bits[2][r & 255];
|
||||||
if (s->decorrelate) {
|
if (s->decorrelate) {
|
||||||
@ -182,6 +184,7 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
|
|||||||
{
|
{
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
init_get_bits(&gb, src, length * 8);
|
init_get_bits(&gb, src, length * 8);
|
||||||
|
|
||||||
@ -192,8 +195,9 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ff_free_vlc(&s->vlc[i]);
|
ff_free_vlc(&s->vlc[i]);
|
||||||
init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
|
if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
|
||||||
s->bits[i], 4, 4, 0);
|
s->bits[i], 4, 4, 0)) < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_joint_tables(s);
|
generate_joint_tables(s);
|
||||||
@ -205,6 +209,7 @@ static int read_old_huffman_tables(HYuvContext *s)
|
|||||||
{
|
{
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
init_get_bits(&gb, classic_shift_luma,
|
init_get_bits(&gb, classic_shift_luma,
|
||||||
classic_shift_luma_table_size * 8);
|
classic_shift_luma_table_size * 8);
|
||||||
@ -228,8 +233,9 @@ static int read_old_huffman_tables(HYuvContext *s)
|
|||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
ff_free_vlc(&s->vlc[i]);
|
ff_free_vlc(&s->vlc[i]);
|
||||||
init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
|
if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
|
||||||
s->bits[i], 4, 4, 0);
|
s->bits[i], 4, 4, 0)) < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_joint_tables(s);
|
generate_joint_tables(s);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user