From 2fccd8bfb967276e2b780c446fd7ff9210205cf5 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Fri, 12 Mar 2021 11:00:32 +0100 Subject: [PATCH] avformat/utils: Fix confusing return value for ff_read_packet() Currently, ff_read_packet() sometimes forwards the return value of AVInputFormat.read_packet() (which should be zero on success, but isn't for all demuxers) and sometimes it overwrites this with zero. Furthermore, it uses two variables, one for the read_packet return value and one for other errors, which is a bit confusing; it is also unnecessary given that the documentation explicitly states that ff_read_packet() never returns positive values. Returning a positive value would lead to leaks with some callers (namely asfrtp_parse_packet and estimate_timings_from_pts). So always return zero in case of success. (This behaviour stems from a time before av_read_packet sanitized the return value of read_packet at all: It was added in commit 626004690c23c981f67228ea325dde3f35193988 and was unnecessary since 88b00723906f68b7563214c30333e48888dddf78.) Signed-off-by: Andreas Rheinhardt --- libavformat/utils.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index ee947c195d..f31826f2ea 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -810,7 +810,7 @@ static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_in int ff_read_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, i, err; + int err, i; AVStream *st; #if FF_API_INIT_PACKET @@ -840,17 +840,17 @@ FF_ENABLE_DEPRECATION_WARNINGS } } - ret = s->iformat->read_packet(s, pkt); - if (ret < 0) { + err = s->iformat->read_packet(s, pkt); + if (err < 0) { av_packet_unref(pkt); /* Some demuxers return FFERROR_REDO when they consume data and discard it (ignored streams, junk, extradata). We must re-call the demuxer to get the real packet. */ - if (ret == FFERROR_REDO) + if (err == FFERROR_REDO) continue; - if (!pktl || ret == AVERROR(EAGAIN)) - return ret; + if (!pktl || err == AVERROR(EAGAIN)) + return err; for (i = 0; i < s->nb_streams; i++) { st = s->streams[i]; if (st->probe_packets || st->internal->request_probe > 0) @@ -904,7 +904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base); if (!pktl && st->internal->request_probe <= 0) - return ret; + return 0; err = avpriv_packet_list_put(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end,