diff options
| author | Michael Niedermayer <[email protected]> | 2013-01-29 18:29:41 +0100 | 
|---|---|---|
| committer | Michael Niedermayer <[email protected]> | 2013-02-14 14:11:58 +0100 | 
| commit | e4831bb9a678dea50b535638aa81eaf4aea0184c (patch) | |
| tree | 90f48aea7b59ffe7d088406a1a7a94a5392e1cd9 | |
| parent | b59ee5dcf119f900a3e9f45098f9e992a5f26fd0 (diff) | |
huffyuvdec: Check init_vlc() return codes.
Prevents out of array writes
Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
Signed-off-by: Michael Niedermayer <[email protected]>
(cherry picked from commit f67a0d115254461649470452058fa3c28c0df294)
Signed-off-by: Michael Niedermayer <[email protected]>
(cherry picked from commit 95ab8d33e1a680f30a5a9605175112008ab81afc)
Conflicts:
	libavcodec/huffyuv.c
(cherry picked from commit 277def59fce10d91e3113e5c0f63e22bc4abfa88)
Conflicts:
	libavcodec/huffyuv.c
(cherry picked from commit adf022f458d75e2c8041262e1906a249366ad518)
Signed-off-by: Michael Niedermayer <[email protected]>
| -rw-r--r-- | libavcodec/huffyuv.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index b69be258f9..db9a346996 100644 --- a/libavcodec/huffyuv.c +++ b/libavcodec/huffyuv.c @@ -28,6 +28,7 @@   * huffyuv codec for libavcodec.   */ +#include "libavutil/avassert.h"  #include "avcodec.h"  #include "get_bits.h"  #include "put_bits.h" @@ -289,6 +290,7 @@ static void generate_joint_tables(HYuvContext *s){                      int len1 = s->len[p][u];                      if(len1 > limit)                          continue; +                    av_assert0(i < (1 << VLC_BITS));                      len[i] = len0 + len1;                      bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];                      symbols[i] = (y<<8) + u; @@ -322,6 +324,7 @@ static void generate_joint_tables(HYuvContext *s){                      int len2 = s->len[2][r&255];                      if(len2 > limit1)                          continue; +                    av_assert0(i < (1 << VLC_BITS));                      len[i] = len0 + len1 + len2;                      bits[i] = (code << len2) + s->bits[2][r&255];                      if(s->decorrelate){ @@ -345,6 +348,7 @@ static void generate_joint_tables(HYuvContext *s){  static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){      GetBitContext gb;      int i; +    int ret;      init_get_bits(&gb, src, length*8); @@ -355,7 +359,8 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){              return -1;          }          free_vlc(&s->vlc[i]); -        init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); +        if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0) +            return ret;      }      generate_joint_tables(s); @@ -367,6 +372,7 @@ static int read_old_huffman_tables(HYuvContext *s){  #if 1      GetBitContext gb;      int i; +    int ret;      init_get_bits(&gb, classic_shift_luma, classic_shift_luma_table_size*8);      if(read_len_table(s->len[0], &gb)<0) @@ -387,7 +393,8 @@ static int read_old_huffman_tables(HYuvContext *s){      for(i=0; i<3; i++){          free_vlc(&s->vlc[i]); -        init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); +        if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0) +            return ret;      }      generate_joint_tables(s);  | 
