diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2009-01-27 21:56:28 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2009-01-27 21:56:28 +0000 |
commit | 68e1794e3a6e30f9898e67701b0bb111c186b595 (patch) | |
tree | 787e6a4ce732abe4b692c4da108aa17082471502 | |
parent | 4f989885b6fdbb5ae0de8955056173e88544bc18 (diff) | |
download | ffmpeg-68e1794e3a6e30f9898e67701b0bb111c186b595.tar.gz |
Fix memleak of fourxm->tracks on error return.
Originally committed as revision 16833 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/4xm.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/libavformat/4xm.c b/libavformat/4xm.c index 65963193b7..8d2fbe36d8 100644 --- a/libavformat/4xm.c +++ b/libavformat/4xm.c @@ -99,7 +99,7 @@ static int fourxm_read_header(AVFormatContext *s, 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 @@ static int fourxm_read_header(AVFormatContext *s, } 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 @@ static int fourxm_read_header(AVFormatContext *s, /* 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 @@ static int fourxm_read_header(AVFormatContext *s, } 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 @@ static int fourxm_read_header(AVFormatContext *s, /* 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 @@ static int fourxm_read_header(AVFormatContext *s, } } - 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, |