mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
movenc: Properly free allocated data on failures in mov_write_header
Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
3559fb97c4
commit
2bbad1f94c
@ -3101,6 +3101,30 @@ 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_free(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]);
|
||||
av_freep(&mov->tracks[i].cluster);
|
||||
av_freep(&mov->tracks[i].frag_info);
|
||||
|
||||
if (mov->tracks[i].vos_len)
|
||||
av_free(mov->tracks[i].vos_data);
|
||||
}
|
||||
|
||||
av_freep(&mov->tracks);
|
||||
}
|
||||
|
||||
static int mov_write_header(AVFormatContext *s)
|
||||
{
|
||||
AVIOContext *pb = s->pb;
|
||||
@ -3305,7 +3329,7 @@ static int mov_write_header(AVFormatContext *s)
|
||||
|
||||
return 0;
|
||||
error:
|
||||
av_freep(&mov->tracks);
|
||||
mov_free(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -3469,15 +3493,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_free(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]);
|
||||
if (mov->flags & FF_MOV_FLAG_FRAGMENT &&
|
||||
mov->tracks[i].vc1_info.struct_offset && s->pb->seekable) {
|
||||
int64_t off = avio_tell(pb);
|
||||
@ -3488,14 +3504,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_free(mov->tracks[i].vos_data);
|
||||
}
|
||||
|
||||
av_freep(&mov->tracks);
|
||||
mov_free(s);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user