summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2016-06-27 23:44:18 -0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2016-06-27 23:44:18 -0400
commit914476c6531f63a69f66a1e8af20050a21bcdf21 (patch)
treefa199327c84b710662f98baee7b739ef3090cc48
parentb66080a8794f7e49d519a8e3e063ae5c645f465e (diff)
downloadopus-914476c6531f63a69f66a1e8af20050a21bcdf21.tar.gz
Fixes an invalid read in compute_stereo_width() for 2.5 ms frames at 12 kHz
That's the only size that's not a multiple of 4, so we just discard 2 samples from the calculation.
-rw-r--r--src/opus_encoder.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index e7b2f931..7333b718 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -873,7 +873,10 @@ opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int3
frame_rate = Fs/frame_size;
short_alpha = Q15ONE - MULT16_16(25, Q15ONE)/IMAX(50,frame_rate);
xx=xy=yy=0;
- for (i=0;i<frame_size;i+=4)
+ /* Unroll by 4. The frame size is always a multiple of 4 *except* for
+ 2.5 ms frames at 12 kHz. Since this setting is very rare (and very
+ stupid), we just discard the last two samples. */
+ for (i=0;i<frame_size-3;i+=4)
{
opus_val32 pxx=0;
opus_val32 pxy=0;