diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-12-04 13:37:14 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2019-12-05 17:22:40 +0100 |
commit | 4825d8a98d4cddab8710055213e99e47cfd5257a (patch) | |
tree | 4e47d191656d622783b466306f0e4bdc8d627b9a /libavformat/mpeg.c | |
parent | bc3cf2bbd320e1ade2791dca02b9ba947ca436ab (diff) | |
download | ffmpeg-4825d8a98d4cddab8710055213e99e47cfd5257a.tar.gz |
avformat/mpeg: Fix leaks of AVFormatContext and subtitle packets
If an error happens in vobsub_read_header() after allocating the
AVFormatContext intended to read the sub-file, both the AVFormatContext
as well as the data in the subtitles queues leaks. This has been fixed.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/mpeg.c')
-rw-r--r-- | libavformat/mpeg.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index e4fe16c7d2..e61851bba5 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -713,6 +713,18 @@ static int vobsub_probe(const AVProbeData *p) return 0; } +static int vobsub_read_close(AVFormatContext *s) +{ + VobSubDemuxContext *vobsub = s->priv_data; + int i; + + for (i = 0; i < s->nb_streams; i++) + ff_subtitles_queue_clean(&vobsub->q[i]); + if (vobsub->sub_ctx) + avformat_close_input(&vobsub->sub_ctx); + return 0; +} + static int vobsub_read_header(AVFormatContext *s) { int i, ret = 0, header_parsed = 0, langidx = 0; @@ -896,7 +908,8 @@ static int vobsub_read_header(AVFormatContext *s) memcpy(par->extradata, header.str, header.len); } end: - + if (ret < 0) + vobsub_read_close(s); av_bprint_finalize(&header, NULL); return ret; } @@ -1021,18 +1034,6 @@ static int vobsub_read_seek(AVFormatContext *s, int stream_index, min_ts, ts, max_ts, flags); } -static int vobsub_read_close(AVFormatContext *s) -{ - VobSubDemuxContext *vobsub = s->priv_data; - int i; - - for (i = 0; i < s->nb_streams; i++) - ff_subtitles_queue_clean(&vobsub->q[i]); - if (vobsub->sub_ctx) - avformat_close_input(&vobsub->sub_ctx); - return 0; -} - static const AVOption options[] = { { "sub_name", "URI for .sub file", offsetof(VobSubDemuxContext, sub_name), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_DECODING_PARAM }, { NULL } |