prevent infinite loop and memcpy of negative amounts
[ffmpeg.git] / libavcodec / ac3_parser.c
index 0563b8b..034a0bd 100644 (file)
@@ -44,33 +44,33 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
 
     hdr->sync_word = get_bits(&gbc, 16);
     if(hdr->sync_word != 0x0B77)
-        return -1;
+        return AC3_PARSE_ERROR_SYNC;
 
     /* read ahead to bsid to make sure this is AC-3, not E-AC-3 */
     hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
     if(hdr->bsid > 10)
-        return -2;
+        return AC3_PARSE_ERROR_BSID;
 
     hdr->crc1 = get_bits(&gbc, 16);
     hdr->fscod = get_bits(&gbc, 2);
     if(hdr->fscod == 3)
-        return -3;
+        return AC3_PARSE_ERROR_SAMPLE_RATE;
 
     hdr->frmsizecod = get_bits(&gbc, 6);
     if(hdr->frmsizecod > 37)
-        return -4;
+        return AC3_PARSE_ERROR_FRAME_SIZE;
 
     skip_bits(&gbc, 5); // skip bsid, already got it
 
     hdr->bsmod = get_bits(&gbc, 3);
     hdr->acmod = get_bits(&gbc, 3);
-    if((hdr->acmod & 1) && hdr->acmod != 1) {
+    if((hdr->acmod & 1) && hdr->acmod != AC3_ACMOD_MONO) {
         hdr->cmixlev = get_bits(&gbc, 2);
     }
     if(hdr->acmod & 4) {
         hdr->surmixlev = get_bits(&gbc, 2);
     }
-    if(hdr->acmod == 2) {
+    if(hdr->acmod == AC3_ACMOD_STEREO) {
         hdr->dsurmod = get_bits(&gbc, 2);
     }
     hdr->lfeon = get_bits1(&gbc);
@@ -114,6 +114,9 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
             return 0;   /* Currently don't support additional streams */
 
         frmsiz = get_bits(&bits, 11) + 1;
+        if(frmsiz*2 < AC3_HEADER_SIZE)
+            return 0;
+
         fscod = get_bits(&bits, 2);
         if (fscod == 3) {
             fscod2 = get_bits(&bits, 2);
@@ -145,7 +148,7 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
 
 static int ac3_parse_init(AVCodecParserContext *s1)
 {
-    AC3ParseContext *s = s1->priv_data;
+    AACAC3ParseContext *s = s1->priv_data;
     s->inbuf_ptr = s->inbuf;
     s->header_size = AC3_HEADER_SIZE;
     s->sync = ac3_sync;
@@ -155,8 +158,8 @@ static int ac3_parse_init(AVCodecParserContext *s1)
 
 AVCodecParser ac3_parser = {
     { CODEC_ID_AC3 },
-    sizeof(AC3ParseContext),
+    sizeof(AACAC3ParseContext),
     ac3_parse_init,
-    ac3_parse,
+    ff_aac_ac3_parse,
     NULL,
 };