diff --git a/floor1.c b/floor1.c index d2a5be7bef838a137d5f5e5f2aab22e31b204c2c..a40839209f6cdf4aac65368b7e34201fd841d4a3 100644 --- a/floor1.c +++ b/floor1.c @@ -394,7 +394,7 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ } } - fit_value[i]=val+predicted; + fit_value[i]=(val+predicted)&0x7fff;; fit_value[look->loneighbor[i-2]]&=0x7fff; fit_value[look->hineighbor[i-2]]&=0x7fff; @@ -425,14 +425,20 @@ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, int hx=0; int lx=0; int ly=fit_value[0]*info->mult; + /* guard lookup against out-of-rage values */ + ly=(ly<0?0:ly>255?255:ly); + for(j=1;j<look->posts;j++){ int current=look->forward_index[j]; int hy=fit_value[current]&0x7fff; if(hy==fit_value[current]){ - hy*=info->mult; hx=info->postlist[current]; - + hy*=info->mult; + /* guard lookup against out-of-rage values */ + hy=(hy<0?0:hy>255?255:hy); + + render_line(n,lx,hx,ly,hy,out); lx=hx;