mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avformat/libmodplug: Fix memleaks on error
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
9e0c16fcc3
commit
df6dc331dd
@ -99,6 +99,14 @@ static const AVOption options[] = {
|
||||
{NULL},
|
||||
};
|
||||
|
||||
static int modplug_read_close(AVFormatContext *s)
|
||||
{
|
||||
ModPlugContext *modplug = s->priv_data;
|
||||
ModPlug_Unload(modplug->f);
|
||||
av_freep(&modplug->buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define SET_OPT_IF_REQUESTED(libopt, opt, flag) do { \
|
||||
if (modplug->opt) { \
|
||||
settings.libopt = modplug->opt; \
|
||||
@ -168,6 +176,7 @@ static int modplug_read_header(AVFormatContext *s)
|
||||
ModPlug_Settings settings;
|
||||
ModPlugContext *modplug = s->priv_data;
|
||||
int64_t sz = avio_size(pb);
|
||||
int ret;
|
||||
|
||||
if (sz < 0) {
|
||||
av_log(s, AV_LOG_WARNING, "Could not determine file size\n");
|
||||
@ -221,8 +230,10 @@ static int modplug_read_header(AVFormatContext *s)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
st = avformat_new_stream(s, NULL);
|
||||
if (!st)
|
||||
return AVERROR(ENOMEM);
|
||||
if (!st) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
avpriv_set_pts_info(st, 64, 1, 1000);
|
||||
st->duration = ModPlug_GetLength(modplug->f);
|
||||
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
|
||||
@ -235,8 +246,10 @@ static int modplug_read_header(AVFormatContext *s)
|
||||
|
||||
if (modplug->video_stream) {
|
||||
AVStream *vst = avformat_new_stream(s, NULL);
|
||||
if (!vst)
|
||||
return AVERROR(ENOMEM);
|
||||
if (!vst) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
avpriv_set_pts_info(vst, 64, 1, 1000);
|
||||
vst->duration = st->duration;
|
||||
vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
@ -247,7 +260,13 @@ static int modplug_read_header(AVFormatContext *s)
|
||||
modplug->fsize = modplug->linesize * modplug->h;
|
||||
}
|
||||
|
||||
return modplug_load_metadata(s);
|
||||
ret = modplug_load_metadata(s);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
return 0;
|
||||
fail:
|
||||
modplug_read_close(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void write_text(uint8_t *dst, const char *s, int linesize, int x, int y)
|
||||
@ -332,14 +351,6 @@ static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int modplug_read_close(AVFormatContext *s)
|
||||
{
|
||||
ModPlugContext *modplug = s->priv_data;
|
||||
ModPlug_Unload(modplug->f);
|
||||
av_freep(&modplug->buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int modplug_read_seek(AVFormatContext *s, int stream_idx, int64_t ts, int flags)
|
||||
{
|
||||
ModPlugContext *modplug = s->priv_data;
|
||||
|
Loading…
Reference in New Issue
Block a user