summaryrefslogtreecommitdiff
path: root/libavformat/utils.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-09-20 22:39:12 +0200
committerJames Almer <jamrial@gmail.com>2019-09-28 18:32:43 -0300
commitbf79e4426a94d17ca49b01ab1624c5d59ae59bb2 (patch)
tree48fafcb0ab89f642d885868708af1241cfe12bff /libavformat/utils.c
parent47a4528abc9702da02b2115c4ad235e70138648a (diff)
avformat/utils: Fix memleaks II
Up until now, avformat_find_stream_info had a potential for memleaks: When everything was fine, it read packets and (depending upon whether AVFMT_FLAG_NOBUFFER was set) put them in a packet list or unreferenced them when they were no longer needed. But upon failure, said packets would leak if they were not already on the packet list. This patch fixes this. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r--libavformat/utils.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 3d42243805..1292fef3df 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3812,7 +3812,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
&ic->internal->packet_buffer_end,
&pkt1, 0);
if (ret < 0)
- goto find_stream_info_err;
+ goto unref_then_goto_end;
pkt = &ic->internal->packet_buffer_end->pkt;
} else {
@@ -3827,7 +3827,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (!st->internal->avctx_inited) {
ret = avcodec_parameters_to_context(avctx, st->codecpar);
if (ret < 0)
- goto find_stream_info_err;
+ goto unref_then_goto_end;
st->internal->avctx_inited = 1;
}
@@ -3915,7 +3915,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (!st->internal->avctx->extradata) {
ret = extract_extradata(st, pkt);
if (ret < 0)
- goto find_stream_info_err;
+ goto unref_then_goto_end;
}
/* If still no information, we try to open the codec and to
@@ -4191,6 +4191,10 @@ find_stream_info_err:
av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
return ret;
+
+unref_then_goto_end:
+ av_packet_unref(&pkt1);
+ goto find_stream_info_err;
}
AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)