Fixes an out-of-bounds read issue with the padding handling code
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 30 Nov 2012 22:36:36 +0000 (17:36 -0500)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 30 Nov 2012 22:36:36 +0000 (17:36 -0500)
This was reported by Juri Aedla and is limited to reading memory up
to about 60 kB beyond the compressed buffer. This can only be triggered
by a compressed packet more than about 16 MB long, so it's not a problem
for RTP. In theory, it *could* crash an Ogg decoder if the memory just after
the incoming packet is out-of-range.

src/opus_decoder.c

index 167e4e4..0be6730 100644 (file)
@@ -641,16 +641,14 @@ static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
       /* Padding flag is bit 6 */
       if (ch&0x40)
       {
-         int padding=0;
          int p;
          do {
             if (len<=0)
                return OPUS_INVALID_PACKET;
             p = *data++;
             len--;
-            padding += p==255 ? 254: p;
+            len -= p==255 ? 254: p;
          } while (p==255);
-         len -= padding;
       }
       if (len<0)
          return OPUS_INVALID_PACKET;