# HG changeset patch # User michael # Date 1152031342 0 # Node ID 73c648ae1c74a6fc3ed2d5d98b252a6ef7dee9c2 # Parent f5f2d05b54acbfa6c52b9e0841405b6a52dc74c6 check cbp for validity, avoids possible out of array reads / segfaults diff -r f5f2d05b54ac -r 73c648ae1c74 cavs.c --- a/cavs.c Tue Jul 04 16:30:14 2006 +0000 +++ b/cavs.c Tue Jul 04 16:42:22 2006 +0000 @@ -754,11 +754,17 @@ h->cv,h->c_stride); } -static inline void decode_residual_inter(AVSContext *h) { +static inline int decode_residual_inter(AVSContext *h) { int block; /* get coded block pattern */ - h->cbp = cbp_tab[get_ue_golomb(&h->s.gb)][1]; + int cbp= get_ue_golomb(&h->s.gb); + if(cbp > 63){ + av_log(h->s.avctx, AV_LOG_ERROR, "illegal inter cbp\n"); + return -1; + } + h->cbp = cbp_tab[cbp][1]; + /* get quantizer */ if(h->cbp && !h->qp_fixed) h->qp += get_se_golomb(&h->s.gb); @@ -767,6 +773,8 @@ decode_residual_block(h,&h->s.gb,inter_2dvlc,0,h->qp, h->cy + h->luma_scan[block], h->l_stride); decode_residual_chroma(h); + + return 0; } /***************************************************************************** @@ -861,7 +869,7 @@ return 1; } -static void decode_mb_i(AVSContext *h) { +static int decode_mb_i(AVSContext *h) { GetBitContext *gb = &h->s.gb; int block, pred_mode_uv; uint8_t top[18]; @@ -914,8 +922,14 @@ } /* get coded block pattern */ - if(h->pic_type == FF_I_TYPE) - h->cbp = cbp_tab[get_ue_golomb(gb)][0]; + if(h->pic_type == FF_I_TYPE){ + int cbp= get_ue_golomb(gb); + if(cbp > 63){ + av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n"); + return -1; + } + h->cbp = cbp_tab[cbp][0]; + } if(h->cbp && !h->qp_fixed) h->qp += get_se_golomb(gb); //qp_delta @@ -959,6 +973,8 @@ set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); if(h->pic_type != FF_B_TYPE) *h->col_type = I_8X8; + + return 0; } static void decode_mb_p(AVSContext *h, enum mb_t mb_type) {