Browse Source

movenc: Properly free allocated data on failures in mov_write_header

Signed-off-by: Martin Storsjö <martin@martin.st>
tags/n2.1
Martin Storsjö 11 years ago
parent
commit
2bbad1f94c
1 changed files with 26 additions and 15 deletions
  1. +26
    -15
      libavformat/movenc.c

+ 26
- 15
libavformat/movenc.c View File

@@ -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…
Cancel
Save