diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 82453cdf2bfdc410b95ea1ee551d027ec0185bea..6c07517c353cf1ef42fa9181411c621d94f12e97 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -39,6 +39,8 @@ #include "modes.h" #include "SKP_Silk_SDK_API.h" +#define MAX_PACKET (1275) + /* Make sure everything's aligned to 4 bytes (this may need to be increased on really weird architectures) */ static inline int align(int i) @@ -433,7 +435,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, /* Number of frames encoded in bits 0 to 5 */ ch = *data++; count = ch&0x3F; - if (st->frame_size*count*25 > 3*st->Fs) + if (count <= 0 || st->frame_size*count*25 > 3*st->Fs) return OPUS_CORRUPTED_DATA; len--; /* Padding bit */ @@ -468,11 +470,10 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, } if (last_size<0) return OPUS_CORRUPTED_DATA; - if (count) - size[count-1]=last_size; + size[count-1]=last_size; } else { /* CBR case */ - int sz = count != 0 ? len/count : 0; + int sz = len/count; if (sz*count!=len) return OPUS_CORRUPTED_DATA; for (i=0;i<count;i++) @@ -480,6 +481,12 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, } break; } + /* Because it's not encoded explicitly, it's possible the size of the + last packet (or all the packets, for the CBR case) is larger than + 1275. + Reject them here.*/ + if (size[count-1] > MAX_PACKET) + return OPUS_CORRUPTED_DATA; if (count*st->frame_size > frame_size) return OPUS_BAD_ARG; nb_samples=0;