summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <xiphmont@xiph.org>2010-10-18 09:54:48 +0000
committerMonty <xiphmont@xiph.org>2010-10-18 09:54:48 +0000
commit80661a13c93a01f25b8df4e89fecad0eee69ddcc (patch)
tree367a82d5c9eb92fc1cdc26fa525c457eeb5d9ada
parent6d554493835180c9a56b6d18d1cba5fd5e4e1ffc (diff)
downloadtremor-80661a13c93a01f25b8df4e89fecad0eee69ddcc.tar.gz
floor0 code could potentially use a book where the number of vals it
needed to decode was not an integer number of dims wide. This caused it to overflow the output vector as the termination condition was in the outer loop of vorbis_book_decodev_set. None of the various vorbis_book_decodeXXXX calls internally guard against this case either, but in every other use the calling code does properly guard (and avoids putting more checks in the tight inner decode loop). For floor0, move the checks into the inner loop as there's little penalty for doing so. Add commentary indicating where guarding is done for each call variant. git-svn-id: https://svn.xiph.org/trunk/Tremor@17546 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r--codebook.c14
-rw-r--r--floor0.c5
2 files changed, 11 insertions, 8 deletions
diff --git a/codebook.c b/codebook.c
index d7d4783..f8b7983 100644
--- a/codebook.c
+++ b/codebook.c
@@ -241,6 +241,7 @@ long vorbis_book_decode(codebook *book, oggpack_buffer *b){
}
/* returns 0 on OK or -1 on eof *************************************/
+/* decode vector / dim granularity gaurding is done in the upper layer */
long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
oggpack_buffer *b,int n,int point){
if(book->used_entries>0){
@@ -273,6 +274,7 @@ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
return(0);
}
+/* decode vector / dim granularity gaurding is done in the upper layer */
long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
oggpack_buffer *b,int n,int point){
if(book->used_entries>0){
@@ -301,6 +303,9 @@ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
return(0);
}
+/* unlike the others, we guard against n not being an integer number
+ of <dim> internally rather than in the upper layer (called only by
+ floor0) */
long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
oggpack_buffer *b,int n,int point){
if(book->used_entries>0){
@@ -314,7 +319,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
entry = decode_packed_entry_number(book,b);
if(entry==-1)return(-1);
t = book->valuelist+entry*book->dim;
- for (j=0;j<book->dim;){
+ for (j=0;i<n && j<book->dim;){
a[i++]=t[j++]>>shift;
}
}
@@ -324,7 +329,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
entry = decode_packed_entry_number(book,b);
if(entry==-1)return(-1);
t = book->valuelist+entry*book->dim;
- for (j=0;j<book->dim;){
+ for (j=0;i<n && j<book->dim;){
a[i++]=t[j++]<<-shift;
}
}
@@ -333,14 +338,13 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
int i,j;
for(i=0;i<n;){
- for (j=0;j<book->dim;){
- a[i++]=0;
- }
+ a[i++]=0;
}
}
return(0);
}
+/* decode vector / dim granularity gaurding is done in the upper layer */
long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,\
long offset,int ch,
oggpack_buffer *b,int n,int point){
diff --git a/floor0.c b/floor0.c
index 50ff5d1..9f3ef56 100644
--- a/floor0.c
+++ b/floor0.c
@@ -397,10 +397,9 @@ static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){
ogg_int32_t last=0;
ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1));
- for(j=0;j<look->m;j+=b->dim)
- if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim,-24)==-1)goto eop;
+ if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m,-24)==-1)goto eop;
for(j=0;j<look->m;){
- for(k=0;k<b->dim;k++,j++)lsp[j]+=last;
+ for(k=0;j<look->m && k<b->dim;k++,j++)lsp[j]+=last;
last=lsp[j-1];
}