Merge commit '8cb7b7b461b52898765b38e3eff68c0ce88347f3'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Nov 2014 10:08:57 +0000 (11:08 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Nov 2014 10:08:57 +0000 (11:08 +0100)
* commit '8cb7b7b461b52898765b38e3eff68c0ce88347f3':
  movenc: Avoid leaking locally allocated data when returning on errors

Conflicts:
libavformat/movenc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/movenc.c

@@@ -3787,24 -3065,9 +3787,24 @@@ int ff_mov_write_packet(AVFormatContex
      MOVTrack *trk = &mov->tracks[pkt->stream_index];
      AVCodecContext *enc = trk->enc;
      unsigned int samples_in_chunk = 0;
-     int size = pkt->size;
+     int size = pkt->size, ret = 0;
      uint8_t *reformatted_data = NULL;
  
 +    if (trk->entry) {
 +        int64_t duration = pkt->dts - trk->cluster[trk->entry - 1].dts;
 +        if (duration < 0 || duration > INT_MAX) {
 +            av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n",
 +                duration, pkt->dts
 +            );
 +
 +            pkt->dts = trk->cluster[trk->entry - 1].dts + 1;
 +            pkt->pts = AV_NOPTS_VALUE;
 +        }
 +        if (pkt->duration < 0) {
 +            av_log(s, AV_LOG_ERROR, "Application provided duration: %d is invalid\n", pkt->duration);
 +            return AVERROR(EINVAL);
 +        }
 +    }
      if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
          int ret;
          if (mov->fragments > 0) {
      if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams)
          ff_mov_add_hinted_packet(s, pkt, trk->hint_track, trk->entry,
                                   reformatted_data, size);
 +end:
+ err:
++
      av_free(reformatted_data);
-     return 0;
+     return ret;
  }
  
 -static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
 +static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt)
  {
 -    if (!pkt) {
 -        mov_flush_fragment(s);
 -        return 1;
 -    } else {
          MOVMuxContext *mov = s->priv_data;
          MOVTrack *trk = &mov->tracks[pkt->stream_index];
          AVCodecContext *enc = trk->enc;