Mercurial > libavformat.hg
changeset 4298:dad1519b0829 libavformat
Fix memleak of fourxm->tracks on error return.
author | michael |
---|---|
date | Tue, 27 Jan 2009 21:56:28 +0000 |
parents | 85aa6639649a |
children | 59c385f94310 |
files | 4xm.c |
diffstat | 1 files changed, 22 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/4xm.c Tue Jan 27 21:09:22 2009 +0000 +++ b/4xm.c Tue Jan 27 21:56:28 2009 +0000 @@ -99,7 +99,7 @@ int header_size; FourxmDemuxContext *fourxm = s->priv_data; unsigned char *header; - int i; + int i, ret; int current_track = -1; AVStream *st; @@ -136,8 +136,8 @@ } else if (fourcc_tag == vtrk_TAG) { /* check that there is enough data */ if (size != vtrk_SIZE) { - av_free(header); - return AVERROR_INVALIDDATA; + ret= AVERROR_INVALIDDATA; + goto fail; } fourxm->width = AV_RL32(&header[i + 36]); fourxm->height = AV_RL32(&header[i + 40]); @@ -145,8 +145,8 @@ /* allocate a new AVStream */ st = av_new_stream(s, 0); if (!st){ - av_free(header); - return AVERROR(ENOMEM); + ret= AVERROR(ENOMEM); + goto fail; } av_set_pts_info(st, 60, 1, fourxm->fps); @@ -164,21 +164,21 @@ } else if (fourcc_tag == strk_TAG) { /* check that there is enough data */ if (size != strk_SIZE) { - av_free(header); - return AVERROR_INVALIDDATA; + ret= AVERROR_INVALIDDATA; + goto fail; } current_track = AV_RL32(&header[i + 8]); if (current_track + 1 > fourxm->track_count) { fourxm->track_count = current_track + 1; if((unsigned)fourxm->track_count >= UINT_MAX / sizeof(AudioTrack)){ - av_free(header); - return -1; + ret= -1; + goto fail; } fourxm->tracks = av_realloc(fourxm->tracks, fourxm->track_count * sizeof(AudioTrack)); if (!fourxm->tracks) { - av_free(header); - return AVERROR(ENOMEM); + ret= AVERROR(ENOMEM); + goto fail; } } fourxm->tracks[current_track].adpcm = AV_RL32(&header[i + 12]); @@ -190,8 +190,8 @@ /* allocate a new AVStream */ st = av_new_stream(s, current_track); if (!st){ - av_free(header); - return AVERROR(ENOMEM); + ret= AVERROR(ENOMEM); + goto fail; } av_set_pts_info(st, 60, 1, fourxm->tracks[current_track].sample_rate); @@ -215,18 +215,23 @@ } } - av_free(header); - /* skip over the LIST-MOVI chunk (which is where the stream should be */ GET_LIST_HEADER(); - if (fourcc_tag != MOVI_TAG) - return AVERROR_INVALIDDATA; + if (fourcc_tag != MOVI_TAG){ + ret= AVERROR_INVALIDDATA; + goto fail; + } + av_free(header); /* initialize context members */ fourxm->video_pts = -1; /* first frame will push to 0 */ fourxm->audio_pts = 0; return 0; +fail: + av_freep(&fourxm->tracks); + av_free(header); + return ret; } static int fourxm_read_packet(AVFormatContext *s,