Skip to content

Commit

Permalink
avformat/microdvddec: Fix memleak upon read header failure
Browse files Browse the repository at this point in the history
The already parsed subtitles (contained in an FFDemuxSubtitlesQueue)
would leak if an error happened upon reading a subsequent subtitle
or when allocating extradata.

Signed-off-by: Andreas Rheinhardt <[email protected]>
  • Loading branch information
mkver committed Jun 15, 2020
1 parent d38694c commit b12014a
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions libavformat/microdvddec.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ static int microdvd_read_header(AVFormatContext *s)
AVRational pts_info = (AVRational){ 2997, 125 }; /* default: 23.976 fps */
MicroDVDContext *microdvd = s->priv_data;
AVStream *st = avformat_new_stream(s, NULL);
int i = 0;
int i = 0, ret;
char line_buf[MAX_LINESIZE];
int has_real_fps = 0;

Expand Down Expand Up @@ -117,10 +117,10 @@ static int microdvd_read_header(AVFormatContext *s)
continue;
}
if (!st->codecpar->extradata && sscanf(line, "{DEFAULT}{}%c", &c) == 1) {
int ret, size = strlen(line + 11);
int size = strlen(line + 11);
ret = ff_alloc_extradata(st->codecpar, size);
if (ret < 0)
return ret;
goto fail;
memcpy(st->codecpar->extradata, line + 11, size);
continue;
}
Expand All @@ -138,8 +138,10 @@ static int microdvd_read_header(AVFormatContext *s)
if (!*p)
continue;
sub = ff_subtitles_queue_insert(&microdvd->q, p, strlen(p), 0);
if (!sub)
return AVERROR(ENOMEM);
if (!sub) {
ret = AVERROR(ENOMEM);
goto fail;
}
sub->pos = pos;
sub->pts = get_pts(line);
sub->duration = get_duration(line);
Expand All @@ -156,6 +158,9 @@ static int microdvd_read_header(AVFormatContext *s)
st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
st->codecpar->codec_id = AV_CODEC_ID_MICRODVD;
return 0;
fail:
ff_subtitles_queue_clean(&microdvd->q);
return ret;
}

static int microdvd_read_packet(AVFormatContext *s, AVPacket *pkt)
Expand Down

0 comments on commit b12014a

Please sign in to comment.