diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-08-27 12:47:04 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-08-27 12:47:04 +0200 |
commit | da2038221bc68e28edaaeddecff8d48cce2c9e52 (patch) | |
tree | 6a8ff920c6cef98e0468576246aeeb6edae2cb36 /libavformat/movenc.c | |
parent | ef4fcb30c4ec55aad8f3872534be06491f8db917 (diff) | |
parent | 2bbad1f94cbc5eab0aa2d937bc79d085477d0242 (diff) | |
download | ffmpeg-da2038221bc68e28edaaeddecff8d48cce2c9e52.tar.gz |
Merge commit '2bbad1f94cbc5eab0aa2d937bc79d085477d0242'
* commit '2bbad1f94cbc5eab0aa2d937bc79d085477d0242':
movenc: Properly free allocated data on failures in mov_write_header
Conflicts:
libavformat/movenc.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r-- | libavformat/movenc.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 1baf1a182b..4c8cc9646d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3568,6 +3568,32 @@ static void enable_tracks(AVFormatContext *s) } } +static void mov_free(AVFormatContext *s) +{ + MOVMuxContext *mov = s->priv_data; + int i; + + if (mov->chapter_track) { + if (mov->tracks[mov->chapter_track].enc) + av_freep(&mov->tracks[mov->chapter_track].enc->extradata); + av_freep(&mov->tracks[mov->chapter_track].enc); + } + + for (i = 0; i < mov->nb_streams; i++) { + if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) + ff_mov_close_hinting(&mov->tracks[i]); + else if (mov->tracks[i].tag == MKTAG('t','m','c','d') && mov->nb_meta_tmcd) + av_freep(&mov->tracks[i].enc); + av_freep(&mov->tracks[i].cluster); + av_freep(&mov->tracks[i].frag_info); + + if (mov->tracks[i].vos_len) + av_freep(&mov->tracks[i].vos_data); + } + + av_freep(&mov->tracks); +} + static int mov_write_header(AVFormatContext *s) { AVIOContext *pb = s->pb; @@ -3853,7 +3879,7 @@ static int mov_write_header(AVFormatContext *s) return 0; error: - av_freep(&mov->tracks); + mov_free(s); return -1; } @@ -4043,17 +4069,7 @@ static int mov_write_trailer(AVFormatContext *s) mov_write_mfra_tag(pb, mov); } - if (mov->chapter_track) { - if (mov->tracks[mov->chapter_track].enc) - av_freep(&mov->tracks[mov->chapter_track].enc->extradata); - av_freep(&mov->tracks[mov->chapter_track].enc); - } - for (i = 0; i < mov->nb_streams; i++) { - if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) - ff_mov_close_hinting(&mov->tracks[i]); - else if (mov->tracks[i].tag == MKTAG('t','m','c','d') && mov->nb_meta_tmcd) - av_freep(&mov->tracks[i].enc); if (mov->flags & FF_MOV_FLAG_FRAGMENT && mov->tracks[i].vc1_info.struct_offset && s->pb->seekable) { int64_t off = avio_tell(pb); @@ -4064,14 +4080,9 @@ static int mov_write_trailer(AVFormatContext *s) avio_seek(pb, off, SEEK_SET); } } - av_freep(&mov->tracks[i].cluster); - av_freep(&mov->tracks[i].frag_info); - - if (mov->tracks[i].vos_len) - av_freep(&mov->tracks[i].vos_data); } - av_freep(&mov->tracks); + mov_free(s); return res; } |