From 0759c8eb100a6ed992f6cff6861dd99c3c52ff3c Mon Sep 17 00:00:00 2001
From: Justin Ruggles <justin.ruggles@gmail.com>
Date: Wed, 1 Feb 2012 20:11:36 -0500
Subject: apedec: fix handling of packet sizes that are not a multiple of 4
 bytes

---
 libavcodec/apedec.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

(limited to 'libavcodec/apedec.c')

diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index fa50d6178d..c9bcc0919d 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -814,7 +814,6 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
                             int *got_frame_ptr, AVPacket *avpkt)
 {
     const uint8_t *buf = avpkt->data;
-    int buf_size = avpkt->size;
     APEContext *s = avctx->priv_data;
     int16_t *samples;
     int i, ret;
@@ -828,17 +827,23 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
     if(!s->samples){
         uint32_t nblocks, offset;
         void *tmp_data;
+        int buf_size;
 
-        if (!buf_size) {
+        if (!avpkt->size) {
             *got_frame_ptr = 0;
             return 0;
         }
-        if (buf_size < 8) {
+        if (avpkt->size < 8) {
             av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
             return AVERROR_INVALIDDATA;
         }
+        buf_size = avpkt->size & ~3;
+        if (buf_size != avpkt->size) {
+            av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
+                   "extra bytes at the end will be skipped.\n");
+        }
 
-        tmp_data = av_realloc(s->data, FFALIGN(buf_size, 4));
+        tmp_data = av_realloc(s->data, buf_size);
         if (!tmp_data)
             return AVERROR(ENOMEM);
         s->data = tmp_data;
@@ -874,12 +879,12 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
             return AVERROR_INVALIDDATA;
         }
 
-        bytes_used = buf_size;
+        bytes_used = avpkt->size;
     }
 
     if (!s->data) {
         *got_frame_ptr = 0;
-        return buf_size;
+        return avpkt->size;
     }
 
     blockstodecode = FFMIN(BLOCKS_PER_LOOP, s->samples);
-- 
cgit v1.2.3