diff mbox

[FFmpeg-devel] aformat/movenc: add missing padding to output track extradata

Message ID 20190925172107.885-1-jamrial@gmail.com
State Accepted
Commit 58aa0ed8f10753ee90f4a4a1f4f3da803cf7c145
Headers show

Commit Message

James Almer Sept. 25, 2019, 5:21 p.m. UTC
Fixes ticket #8183.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/movenc.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

Comments

Thierry Foucu Sept. 26, 2019, 6:04 p.m. UTC | #1
On Wed, Sep 25, 2019 at 10:30 AM James Almer <jamrial@gmail.com> wrote:

> Fixes ticket #8183.
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavformat/movenc.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index c824ff5ba1..e3283871d0 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -5377,12 +5377,13 @@ int ff_mov_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>          !TAG_IS_AVCI(trk->tag) &&
>          (par->codec_id != AV_CODEC_ID_DNXHD)) {
>          trk->vos_len  = par->extradata_size;
> -        trk->vos_data = av_malloc(trk->vos_len);
> +        trk->vos_data = av_malloc(trk->vos_len +
> AV_INPUT_BUFFER_PADDING_SIZE);
>          if (!trk->vos_data) {
>              ret = AVERROR(ENOMEM);
>              goto err;
>          }
>          memcpy(trk->vos_data, par->extradata, trk->vos_len);
> +        memset(trk->vos_data + trk->vos_len, 0,
> AV_INPUT_BUFFER_PADDING_SIZE);
>      }
>
>      if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
> @@ -5460,12 +5461,13 @@ int ff_mov_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>           par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
>          /* copy frame to create needed atoms */
>          trk->vos_len  = size;
> -        trk->vos_data = av_malloc(size);
> +        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
>          if (!trk->vos_data) {
>              ret = AVERROR(ENOMEM);
>              goto err;
>          }
>          memcpy(trk->vos_data, pkt->data, size);
> +        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>      }
>
>      if (trk->entry >= trk->cluster_capacity) {
> @@ -6090,12 +6092,13 @@ static int
> mov_create_dvd_sub_decoder_specific_info(MOVTrack *track,
>          cur += strspn(cur, "\n\r");
>      }
>      if (have_palette) {
> -        track->vos_data = av_malloc(16*4);
> +        track->vos_data = av_malloc(16*4 + AV_INPUT_BUFFER_PADDING_SIZE);
>          if (!track->vos_data)
>              return AVERROR(ENOMEM);
>          for (i = 0; i < 16; i++) {
>              AV_WB32(track->vos_data + i * 4, palette[i]);
>          }
> +        memset(track->vos_data + 16*4, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>          track->vos_len = 16 * 4;
>      }
>      st->codecpar->width = width;
> @@ -6453,11 +6456,12 @@ static int mov_write_header(AVFormatContext *s)
>                  mov_create_dvd_sub_decoder_specific_info(track, st);
>              else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id
> != AV_CODEC_ID_DNXHD) {
>                  track->vos_len  = st->codecpar->extradata_size;
> -                track->vos_data = av_malloc(track->vos_len);
> +                track->vos_data = av_malloc(track->vos_len +
> AV_INPUT_BUFFER_PADDING_SIZE);
>                  if (!track->vos_data) {
>                      return AVERROR(ENOMEM);
>                  }
>                  memcpy(track->vos_data, st->codecpar->extradata,
> track->vos_len);
> +                memset(track->vos_data + track->vos_len, 0,
> AV_INPUT_BUFFER_PADDING_SIZE);
>              }
>          }
>
> @@ -6713,10 +6717,11 @@ static int mov_write_trailer(AVFormatContext *s)
>              AVCodecParameters *par = track->par;
>
>              track->vos_len  = par->extradata_size;
> -            track->vos_data = av_malloc(track->vos_len);
> +            track->vos_data = av_malloc(track->vos_len +
> AV_INPUT_BUFFER_PADDING_SIZE);
>              if (!track->vos_data)
>                  return AVERROR(ENOMEM);
>              memcpy(track->vos_data, par->extradata, track->vos_len);
> +            memset(track->vos_data + track->vos_len, 0,
> AV_INPUT_BUFFER_PADDING_SIZE);
>          }
>          mov->need_rewrite_extradata = 0;
>      }
> --
> 2.22.0
>
>
I confirm that this patch fixes the issue i have here as well.


> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
James Almer Sept. 26, 2019, 6:22 p.m. UTC | #2
On 9/26/2019 3:04 PM, Thierry Foucu wrote:
> On Wed, Sep 25, 2019 at 10:30 AM James Almer <jamrial@gmail.com> wrote:
> 
>> Fixes ticket #8183.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>  libavformat/movenc.c | 15 ++++++++++-----
>>  1 file changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>> index c824ff5ba1..e3283871d0 100644
>> --- a/libavformat/movenc.c
>> +++ b/libavformat/movenc.c
>> @@ -5377,12 +5377,13 @@ int ff_mov_write_packet(AVFormatContext *s,
>> AVPacket *pkt)
>>          !TAG_IS_AVCI(trk->tag) &&
>>          (par->codec_id != AV_CODEC_ID_DNXHD)) {
>>          trk->vos_len  = par->extradata_size;
>> -        trk->vos_data = av_malloc(trk->vos_len);
>> +        trk->vos_data = av_malloc(trk->vos_len +
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>          if (!trk->vos_data) {
>>              ret = AVERROR(ENOMEM);
>>              goto err;
>>          }
>>          memcpy(trk->vos_data, par->extradata, trk->vos_len);
>> +        memset(trk->vos_data + trk->vos_len, 0,
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>      }
>>
>>      if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
>> @@ -5460,12 +5461,13 @@ int ff_mov_write_packet(AVFormatContext *s,
>> AVPacket *pkt)
>>           par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
>>          /* copy frame to create needed atoms */
>>          trk->vos_len  = size;
>> -        trk->vos_data = av_malloc(size);
>> +        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
>>          if (!trk->vos_data) {
>>              ret = AVERROR(ENOMEM);
>>              goto err;
>>          }
>>          memcpy(trk->vos_data, pkt->data, size);
>> +        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>>      }
>>
>>      if (trk->entry >= trk->cluster_capacity) {
>> @@ -6090,12 +6092,13 @@ static int
>> mov_create_dvd_sub_decoder_specific_info(MOVTrack *track,
>>          cur += strspn(cur, "\n\r");
>>      }
>>      if (have_palette) {
>> -        track->vos_data = av_malloc(16*4);
>> +        track->vos_data = av_malloc(16*4 + AV_INPUT_BUFFER_PADDING_SIZE);
>>          if (!track->vos_data)
>>              return AVERROR(ENOMEM);
>>          for (i = 0; i < 16; i++) {
>>              AV_WB32(track->vos_data + i * 4, palette[i]);
>>          }
>> +        memset(track->vos_data + 16*4, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>>          track->vos_len = 16 * 4;
>>      }
>>      st->codecpar->width = width;
>> @@ -6453,11 +6456,12 @@ static int mov_write_header(AVFormatContext *s)
>>                  mov_create_dvd_sub_decoder_specific_info(track, st);
>>              else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id
>> != AV_CODEC_ID_DNXHD) {
>>                  track->vos_len  = st->codecpar->extradata_size;
>> -                track->vos_data = av_malloc(track->vos_len);
>> +                track->vos_data = av_malloc(track->vos_len +
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>                  if (!track->vos_data) {
>>                      return AVERROR(ENOMEM);
>>                  }
>>                  memcpy(track->vos_data, st->codecpar->extradata,
>> track->vos_len);
>> +                memset(track->vos_data + track->vos_len, 0,
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>              }
>>          }
>>
>> @@ -6713,10 +6717,11 @@ static int mov_write_trailer(AVFormatContext *s)
>>              AVCodecParameters *par = track->par;
>>
>>              track->vos_len  = par->extradata_size;
>> -            track->vos_data = av_malloc(track->vos_len);
>> +            track->vos_data = av_malloc(track->vos_len +
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>              if (!track->vos_data)
>>                  return AVERROR(ENOMEM);
>>              memcpy(track->vos_data, par->extradata, track->vos_len);
>> +            memset(track->vos_data + track->vos_len, 0,
>> AV_INPUT_BUFFER_PADDING_SIZE);
>>          }
>>          mov->need_rewrite_extradata = 0;
>>      }
>> --
>> 2.22.0
>>
>>
> I confirm that this patch fixes the issue i have here as well.

Applied, thanks.
diff mbox

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index c824ff5ba1..e3283871d0 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5377,12 +5377,13 @@  int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
         !TAG_IS_AVCI(trk->tag) &&
         (par->codec_id != AV_CODEC_ID_DNXHD)) {
         trk->vos_len  = par->extradata_size;
-        trk->vos_data = av_malloc(trk->vos_len);
+        trk->vos_data = av_malloc(trk->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!trk->vos_data) {
             ret = AVERROR(ENOMEM);
             goto err;
         }
         memcpy(trk->vos_data, par->extradata, trk->vos_len);
+        memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
 
     if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
@@ -5460,12 +5461,13 @@  int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
          par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
         /* copy frame to create needed atoms */
         trk->vos_len  = size;
-        trk->vos_data = av_malloc(size);
+        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!trk->vos_data) {
             ret = AVERROR(ENOMEM);
             goto err;
         }
         memcpy(trk->vos_data, pkt->data, size);
+        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
 
     if (trk->entry >= trk->cluster_capacity) {
@@ -6090,12 +6092,13 @@  static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track,
         cur += strspn(cur, "\n\r");
     }
     if (have_palette) {
-        track->vos_data = av_malloc(16*4);
+        track->vos_data = av_malloc(16*4 + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!track->vos_data)
             return AVERROR(ENOMEM);
         for (i = 0; i < 16; i++) {
             AV_WB32(track->vos_data + i * 4, palette[i]);
         }
+        memset(track->vos_data + 16*4, 0, AV_INPUT_BUFFER_PADDING_SIZE);
         track->vos_len = 16 * 4;
     }
     st->codecpar->width = width;
@@ -6453,11 +6456,12 @@  static int mov_write_header(AVFormatContext *s)
                 mov_create_dvd_sub_decoder_specific_info(track, st);
             else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id != AV_CODEC_ID_DNXHD) {
                 track->vos_len  = st->codecpar->extradata_size;
-                track->vos_data = av_malloc(track->vos_len);
+                track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
                 if (!track->vos_data) {
                     return AVERROR(ENOMEM);
                 }
                 memcpy(track->vos_data, st->codecpar->extradata, track->vos_len);
+                memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
             }
         }
 
@@ -6713,10 +6717,11 @@  static int mov_write_trailer(AVFormatContext *s)
             AVCodecParameters *par = track->par;
 
             track->vos_len  = par->extradata_size;
-            track->vos_data = av_malloc(track->vos_len);
+            track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
             if (!track->vos_data)
                 return AVERROR(ENOMEM);
             memcpy(track->vos_data, par->extradata, track->vos_len);
+            memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
         }
         mov->need_rewrite_extradata = 0;
     }