aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Tremolo/codebook.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Tremolo/codebook.c b/Tremolo/codebook.c
index 2fbb392..8e7d4eb 100644
--- a/Tremolo/codebook.c
+++ b/Tremolo/codebook.c
@@ -858,8 +858,11 @@ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
for (j=0;j<step;j++){
if(decode_map(book,b,v,point))return -1;
- for(i=0,o=j;i<book->dim;i++,o+=step)
- a[o]+=v[i];
+ for(i=0,o=j;i<book->dim;i++,o+=step){
+ if (__builtin_add_overflow(a[o], v[i], &a[o])){
+ a[o] = v[i] > 0 ? INT32_MAX : INT32_MIN;
+ }
+ }
}
}
return 0;
@@ -926,7 +929,10 @@ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
for(i=offset;i<offset+n;){
if(decode_map(book,b,v,point))return -1;
for (j=0;j<book->dim && i < offset + n;j++){
- a[chptr++][i]+=v[j];
+ if (__builtin_add_overflow(a[chptr][i], v[j], &a[chptr][i])) {
+ a[chptr][i] = v[j] > 0 ? INT32_MAX : INT32_MIN;
+ }
+ chptr++;
if(chptr==ch){
chptr=0;
i++;