aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/vorbis_dec.c
diff options
context:
space:
mode:
authorGoogle Chrome <>2009-09-23 13:08:48 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-09-23 13:08:48 +0000
commit36b7e983a664d20dc3809704b47cf8d59895b4de (patch)
treee4f8f8681519fd8124d3b4dffc0c161e61dff3d3 /libavcodec/vorbis_dec.c
parent310afddfe0c31ffd844eb640bdf2b3f052286dbe (diff)
downloadffmpeg-36b7e983a664d20dc3809704b47cf8d59895b4de.tar.gz
Check begin/end/partition_size.
23_vorbis_sane_partition.patch by chrome. Also this should be better documented but i prefer not to leave potential security issues open due to missing documentation. Originally committed as revision 19996 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vorbis_dec.c')
-rw-r--r--libavcodec/vorbis_dec.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/libavcodec/vorbis_dec.c b/libavcodec/vorbis_dec.c
index ca43e99d9b..ec3c561991 100644
--- a/libavcodec/vorbis_dec.c
+++ b/libavcodec/vorbis_dec.c
@@ -37,6 +37,7 @@
#define V_NB_BITS 8
#define V_NB_BITS2 11
#define V_MAX_VLCS (1<<16)
+#define V_MAX_PARTITIONS (1<<20)
#ifndef V_DEBUG
#define AV_DEBUG(...)
@@ -638,6 +639,14 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc){
res_setup->begin=get_bits(gb, 24);
res_setup->end=get_bits(gb, 24);
res_setup->partition_size=get_bits(gb, 24)+1;
+ /* Validations to prevent a buffer overflow later. */
+ if (res_setup->begin>res_setup->end
+ || res_setup->end>vc->blocksize[1]/(res_setup->type==2?1:2)
+ || (res_setup->end-res_setup->begin)/res_setup->partition_size>V_MAX_PARTITIONS) {
+ av_log(vc->avccontext, AV_LOG_ERROR, "partition out of bounds: type, begin, end, size, blocksize: %d, %d, %d, %d, %d\n", res_setup->type, res_setup->begin, res_setup->end, res_setup->partition_size, vc->blocksize[1]/2);
+ return 1;
+ }
+
res_setup->classifications=get_bits(gb, 6)+1;
res_setup->classbook=get_bits(gb, 8);
if (res_setup->classbook>=vc->codebook_count) {