summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Terriberry <tterribe@xiph.org>2010-10-14 00:17:09 +0000
committerTim Terriberry <tterribe@xiph.org>2010-10-14 00:17:09 +0000
commit6e25b5c1e60f1b5d7d6ad3f17ef1490b0d72b00b (patch)
treea0243ab09f43cfadb888d6a98e8747120f1a6680
parent699d1778f89e1bec3903805c7e0430cd6d484ab5 (diff)
downloadtremor-6e25b5c1e60f1b5d7d6ad3f17ef1490b0d72b00b.tar.gz
Port of r16182 from libvorbis.
Second half of fix to https://bugzilla.mozilla.org/show_bug.cgi?id=500254 Sanity check the floor 1 post list to reject files with repeated values that would result in floor line segments with zero length. git-svn-id: https://svn.xiph.org/trunk/Tremor@17523 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r--floor1.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/floor1.c b/floor1.c
index 259cd10..a77e642 100644
--- a/floor1.c
+++ b/floor1.c
@@ -68,6 +68,10 @@ static int ilog(unsigned int v){
return(ret);
}
+static int icomp(const void *a,const void *b){
+ return(**(int **)a-**(int **)b);
+}
+
static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
codec_setup_info *ci=(codec_setup_info *)vi->codec_setup;
int j,k,count=0,maxclass=-1,rangebits;
@@ -111,6 +115,17 @@ static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
info->postlist[0]=0;
info->postlist[1]=1<<rangebits;
+ /* don't allow repeated values in post list as they'd result in
+ zero-length segments */
+ {
+ int *sortpointer[VIF_POSIT+2];
+ for(j=0;j<count+2;j++)sortpointer[j]=info->postlist+j;
+ qsort(sortpointer,count+2,sizeof(*sortpointer),icomp);
+
+ for(j=1;j<count+2;j++)
+ if(*sortpointer[j-1]==*sortpointer[j])goto err_out;
+ }
+
return(info);
err_out:
@@ -118,10 +133,6 @@ static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
return(NULL);
}
-static int icomp(const void *a,const void *b){
- return(**(int **)a-**(int **)b);
-}
-
static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,vorbis_info_mode *mi,
vorbis_info_floor *in){