summaryrefslogtreecommitdiff
path: root/avtools
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2017-02-08 09:53:26 +0100
committerMartin Storsjö <martin@martin.st>2018-08-01 09:55:34 +0300
commitc011beda2611acfeb6f67d4fdf30d1eceed9e62f (patch)
treebd72babbc3499348517e8e51cbcabc3a6a799f7a /avtools
parentc1bcd321ea2c2ae1765a1e64f03278712221d726 (diff)
avconv: make sure packets put into the muxing FIFO are refcounted
Some callers (like do_subtitle_out(), or do_streamcopy()) call this with an AVPacket that is not refcounted. This can cause undefined behavior. Calling av_packet_move_ref() does not make a packet refcounted if it isn't yet. (And it can't be made to, because it always succeeds, and can't return ENOMEM.) Call av_packet_ref() instead to make sure it's refcounted. Cc: libav-stable@libav.org Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'avtools')
-rw-r--r--avtools/avconv.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/avtools/avconv.c b/avtools/avconv.c
index ac15464a8d..3abb7f872f 100644
--- a/avtools/avconv.c
+++ b/avtools/avconv.c
@@ -281,7 +281,7 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
int ret;
if (!of->header_written) {
- AVPacket tmp_pkt;
+ AVPacket tmp_pkt = {0};
/* the muxer is not initialized yet, buffer the packet */
if (!av_fifo_space(ost->muxing_queue)) {
int new_size = FFMIN(2 * av_fifo_size(ost->muxing_queue),
@@ -296,8 +296,11 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
if (ret < 0)
exit_program(1);
}
- av_packet_move_ref(&tmp_pkt, pkt);
+ ret = av_packet_ref(&tmp_pkt, pkt);
+ if (ret < 0)
+ exit_program(1);
av_fifo_generic_write(ost->muxing_queue, &tmp_pkt, sizeof(tmp_pkt), NULL);
+ av_packet_unref(pkt);
return;
}