# HG changeset patch # User michael # Date 1253707773 0 # Node ID ae97152542d1c190c0d32c2339bb1b3148ffbb5d # Parent add8ca5921ab380abffcfba64304b1da3d73aa59 Add checks for per-packet mode indexes and per-header mode mapping indexes. 12_vorbis_mode_indexes.patch by chrome maybe exploitable diff -r add8ca5921ab -r ae97152542d1 vorbis_dec.c --- a/vorbis_dec.c Wed Sep 23 12:02:31 2009 +0000 +++ b/vorbis_dec.c Wed Sep 23 12:09:33 2009 +0000 @@ -793,7 +793,11 @@ mode_setup->blockflag=get_bits1(gb); mode_setup->windowtype=get_bits(gb, 16); //FIXME check mode_setup->transformtype=get_bits(gb, 16); //FIXME check - mode_setup->mapping=get_bits(gb, 8); //FIXME check + mode_setup->mapping=get_bits(gb, 8); + if (mode_setup->mapping>=vc->mapping_count) { + av_log(vc->avccontext, AV_LOG_ERROR, "mode mapping value %d out of range. \n", mode_setup->mapping); + return 1; + } AV_DEBUG(" %d mode: blockflag %d, windowtype %d, transformtype %d, mapping %d \n", i, mode_setup->blockflag, mode_setup->windowtype, mode_setup->transformtype, mode_setup->mapping); } @@ -1450,6 +1454,10 @@ } else { mode_number=get_bits(gb, ilog(vc->mode_count-1)); } + if (mode_number>=vc->mode_count) { + av_log(vc->avccontext, AV_LOG_ERROR, "mode number %d out of range.\n", mode_number); + return -1; + } vc->mode_number=mode_number; mapping=&vc->mappings[vc->modes[mode_number].mapping];