Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: webrtc/modules/audio_coding/codecs/ilbc/smooth.c

Issue 2014033002: Fix UBSan errors (signed integer overflow) (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@bug601787-2
Patch Set: logic fix Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_coding/codecs/ilbc/my_corr.c ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_coding/codecs/ilbc/smooth.c
diff --git a/webrtc/modules/audio_coding/codecs/ilbc/smooth.c b/webrtc/modules/audio_coding/codecs/ilbc/smooth.c
index 58b37ee31cc99a4959c8f1f1b5d4ea93521bdd96..269331cce4d4b7d00f4daccc0c9819ee6afd5c97 100644
--- a/webrtc/modules/audio_coding/codecs/ilbc/smooth.c
+++ b/webrtc/modules/audio_coding/codecs/ilbc/smooth.c
@@ -31,7 +31,7 @@ void WebRtcIlbcfix_Smooth(
int16_t *surround /* (i) The approximation from the
surrounding sequences */
) {
- int16_t maxtot, scale, scale1, scale2;
+ int16_t scale, scale1, scale2;
int16_t A, B, C, denomW16;
int32_t B_W32, denom, num;
int32_t errs;
@@ -40,18 +40,21 @@ void WebRtcIlbcfix_Smooth(
int16_t w11prim;
int16_t bitsw00, bitsw10, bitsw11;
int32_t w11w00, w10w10, w00w00;
- int16_t max1, max2;
+ uint32_t max1, max2, max12;
/* compute some inner products (ensure no overflow by first calculating proper scale factor) */
w00 = w10 = w11 = 0;
- max1=WebRtcSpl_MaxAbsValueW16(current, ENH_BLOCKL);
- max2=WebRtcSpl_MaxAbsValueW16(surround, ENH_BLOCKL);
- maxtot=WEBRTC_SPL_MAX(max1, max2);
-
- scale=WebRtcSpl_GetSizeInBits(maxtot);
- scale = (int16_t)(2 * scale) - 26;
+ // Calculate a right shift that will let us sum ENH_BLOCKL pairwise products
+ // of values from the two sequences without overflowing an int32_t. (The +1
+ // in max1 and max2 are because WebRtcSpl_MaxAbsValueW16 will return 2**15 -
+ // 1 if the input array contains -2**15.)
+ max1 = WebRtcSpl_MaxAbsValueW16(current, ENH_BLOCKL) + 1;
+ max2 = WebRtcSpl_MaxAbsValueW16(surround, ENH_BLOCKL) + 1;
+ max12 = WEBRTC_SPL_MAX(max1, max2);
+ scale = (64 - 31) -
+ WebRtcSpl_CountLeadingZeros64((max12 * max12) * (uint64_t)ENH_BLOCKL);
scale=WEBRTC_SPL_MAX(0, scale);
w00=WebRtcSpl_DotProductWithScale(current,current,ENH_BLOCKL,scale);
« no previous file with comments | « webrtc/modules/audio_coding/codecs/ilbc/my_corr.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698