summaryrefslogtreecommitdiff
path: root/libavformat/4xm.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2009-01-27 21:56:28 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-01-27 21:56:28 +0000
commit68e1794e3a6e30f9898e67701b0bb111c186b595 (patch)
tree787e6a4ce732abe4b692c4da108aa17082471502 /libavformat/4xm.c
parent4f989885b6fdbb5ae0de8955056173e88544bc18 (diff)
Fix memleak of fourxm->tracks on error return.
Originally committed as revision 16833 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/4xm.c')
-rw-r--r--libavformat/4xm.c39
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,