Index: webrtc/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c |
diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c b/webrtc/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c |
index eeed7ae5530fd36d842aa2549653ff6cc9dd62c4..a463d4853a2688bd48d987fbd47b0339f7f2c3bf 100644 |
--- a/webrtc/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c |
+++ b/webrtc/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c |
@@ -185,11 +185,18 @@ int WebRtcIsac_DecLogisticMulti2( |
int16_t candQ7; |
int k; |
+ // Position just past the end of the stream. STREAM_SIZE_MAX_60 instead of |
+ // STREAM_SIZE_MAX (which is the size of the allocated buffer) because that's |
+ // the limit to how much data is filled in. |
+ const uint8_t* const stream_end = streamdata->stream + STREAM_SIZE_MAX_60; |
+ |
stream_ptr = streamdata->stream + streamdata->stream_index; |
W_upper = streamdata->W_upper; |
if (streamdata->stream_index == 0) /* first time decoder is called for this stream */ |
{ |
/* read first word from bytestream */ |
+ if (stream_ptr + 3 >= stream_end) |
+ return -1; // Would read out of bounds. Malformed input? |
streamval = *stream_ptr << 24; |
streamval |= *++stream_ptr << 16; |
streamval |= *++stream_ptr << 8; |
@@ -277,6 +284,8 @@ int WebRtcIsac_DecLogisticMulti2( |
while ( !(W_upper & 0xFF000000) ) /* W_upper < 2^24 */ |
{ |
/* read next byte from stream */ |
+ if (stream_ptr + 1 >= stream_end) |
+ return -1; // Would read out of bounds. Malformed input? |
streamval = (streamval << 8) | *++stream_ptr; |
W_upper <<= 8; |
} |