summaryrefslogtreecommitdiff
path: root/libavformat/movenc.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-08-27 12:47:04 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-08-27 12:47:04 +0200
commitda2038221bc68e28edaaeddecff8d48cce2c9e52 (patch)
tree6a8ff920c6cef98e0468576246aeeb6edae2cb36 /libavformat/movenc.c
parentef4fcb30c4ec55aad8f3872534be06491f8db917 (diff)
parent2bbad1f94cbc5eab0aa2d937bc79d085477d0242 (diff)
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.c45
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;
}