aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-09-28 19:54:25 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-07-01 22:44:41 +0200
commit901048ad96264622489c8d7d8f0db375a080285b (patch)
treeaaf3d584e61a6e235bd9ee697e3153b42d931718
parent26ceb54a28d5d3c411e5eab6ba7a18571d3e076c (diff)
downloadffmpeg-901048ad96264622489c8d7d8f0db375a080285b.tar.gz
avformat/matroskadec: Fix demuxing ProRes
The structure of a ProRes frame in mov/mp4 is that of a typical atom: First a 32 bit BE size field, then a tag detailling the content. Said size field includes the eight bytes of the atom header. This header is actually redundant, as the size of the atom is already known from the containing atom. It is therefore stripped away when muxed into Matroska and so the Matroska demuxer has to recreate upon demuxing. But it did not account for the fact that the size field includes the size of the header and this can lead to problems when a decoder uses the in-band size field. Fixes ticket #8210. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com> (cherry picked from commit 581419ea39de6619c3389b8d10ac2cbe212c62a0) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavformat/matroskadec.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 87ff2db86d..2bec9f6a8e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3051,15 +3051,16 @@ static int matroska_parse_prores(MatroskaTrack *track, uint8_t *src,
int dstlen = *size;
if (AV_RB32(&src[4]) != MKBETAG('i', 'c', 'p', 'f')) {
- dst = av_malloc(dstlen + 8 + AV_INPUT_BUFFER_PADDING_SIZE);
+ dstlen += 8;
+
+ dst = av_malloc(dstlen + AV_INPUT_BUFFER_PADDING_SIZE);
if (!dst)
return AVERROR(ENOMEM);
AV_WB32(dst, dstlen);
AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
- memcpy(dst + 8, src, dstlen);
- memset(dst + 8 + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
- dstlen += 8;
+ memcpy(dst + 8, src, dstlen - 8);
+ memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
}
*pdst = dst;