diff --git a/codebook.c b/codebook.c
index d7d4783a204b9fd7c92480239041fd900b0ee67c..f8b7983841348691dfd10d93a52bd2e10bf79c68 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 50ff5d1a4293c5e043ae610414527ced6bd8d8c8..9f3ef560145ecbd641e19fd712cc740ba5d6b3c6 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];
       }