comparison huffyuv.c @ 9917:2e8083f6524e libavcodec

fix a buffer overrun on corrupt huffyuv streams
author lorenm
date Sat, 04 Jul 2009 23:59:10 +0000
parents 2fb2e212318b
children 266bf83f634d
comparison
equal deleted inserted replaced
9916:2c1c28f26a27 9917:2e8083f6524e
211 *red= src[(w-1)*4+R]; 211 *red= src[(w-1)*4+R];
212 *green= src[(w-1)*4+G]; 212 *green= src[(w-1)*4+G];
213 *blue= src[(w-1)*4+B]; 213 *blue= src[(w-1)*4+B];
214 } 214 }
215 215
216 static void read_len_table(uint8_t *dst, GetBitContext *gb){ 216 static int read_len_table(uint8_t *dst, GetBitContext *gb){
217 int i, val, repeat; 217 int i, val, repeat;
218 218
219 for(i=0; i<256;){ 219 for(i=0; i<256;){
220 repeat= get_bits(gb, 3); 220 repeat= get_bits(gb, 3);
221 val = get_bits(gb, 5); 221 val = get_bits(gb, 5);
222 if(repeat==0) 222 if(repeat==0)
223 repeat= get_bits(gb, 8); 223 repeat= get_bits(gb, 8);
224 //printf("%d %d\n", val, repeat); 224 //printf("%d %d\n", val, repeat);
225 if(i+repeat > 256) {
226 av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
227 return -1;
228 }
225 while (repeat--) 229 while (repeat--)
226 dst[i++] = val; 230 dst[i++] = val;
227 } 231 }
232 return 0;
228 } 233 }
229 234
230 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){ 235 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){
231 int len, index; 236 int len, index;
232 uint32_t bits=0; 237 uint32_t bits=0;
377 int i; 382 int i;
378 383
379 init_get_bits(&gb, src, length*8); 384 init_get_bits(&gb, src, length*8);
380 385
381 for(i=0; i<3; i++){ 386 for(i=0; i<3; i++){
382 read_len_table(s->len[i], &gb); 387 if(read_len_table(s->len[i], &gb)<0)
383 388 return -1;
384 if(generate_bits_table(s->bits[i], s->len[i])<0){ 389 if(generate_bits_table(s->bits[i], s->len[i])<0){
385 return -1; 390 return -1;
386 } 391 }
387 #if 0 392 #if 0
388 for(j=0; j<256; j++){ 393 for(j=0; j<256; j++){
402 #if 1 407 #if 1
403 GetBitContext gb; 408 GetBitContext gb;
404 int i; 409 int i;
405 410
406 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8); 411 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
407 read_len_table(s->len[0], &gb); 412 if(read_len_table(s->len[0], &gb)<0)
413 return -1;
408 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8); 414 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
409 read_len_table(s->len[1], &gb); 415 if(read_len_table(s->len[1], &gb)<0)
416 return -1;
410 417
411 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i]; 418 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
412 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i]; 419 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
413 420
414 if(s->bitstream_bpp >= 24){ 421 if(s->bitstream_bpp >= 24){