On 05.01.2016 12:18, Michael Niedermayer wrote:
> On Tue, Jan 05, 2016 at 12:02:29PM +0100, Andreas Cadhalpun wrote:
>> That wouldn't work, as the codec id wasn't changed in force_codec_ids,
>> but in the API using program.
>> To reiterate, the problematic steps were:
>>  * call avformat_find_stream_info, which detects a codec and initializes
>>    a parser for it
>>  * afterwards change the codec id in the API using program, so it
>>    doesn't match with the parser
>>
>> Thus I think the only reliable way to detect this is a check in 
>> av_parser_parse2.
> 
> shouldnt this be a av_assert1/2() then ?
> i mean this is a programming error in the user app not a error
> condition that should happen that way in correct usage
> IMHO if we need 5 extra checks thats fine but if this is just to
> detect a user app bug then iam not sure these checks should be run
> for every packet

I would prefer av_assert0, but if you think that could cause relevant slowdowns,
I'm also fine with av_assert1. Patch for that attached.

Best regards,
Andreas

>From 80f6baa6d091807538461bab28656e3cf7303a2d Mon Sep 17 00:00:00 2001
From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
Date: Mon, 4 Jan 2016 23:52:20 +0100
Subject: [PATCH] parser: add av_assert1 to make sure the codec matches

Otherwise this can have some surprising effects (crashes), so let's
better not allow it.

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libavcodec/parser.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index 2809158..d25d261 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -141,6 +141,13 @@ int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx,
     int index, i;
     uint8_t dummy_buf[AV_INPUT_BUFFER_PADDING_SIZE];
 
+    /* Parsers only work for the specified codec ids. */
+    av_assert1(avctx->codec_id == s->parser->codec_ids[0] ||
+               avctx->codec_id == s->parser->codec_ids[1] ||
+               avctx->codec_id == s->parser->codec_ids[2] ||
+               avctx->codec_id == s->parser->codec_ids[3] ||
+               avctx->codec_id == s->parser->codec_ids[4]);
+
     if (!(s->flags & PARSER_FLAG_FETCHED_OFFSET)) {
         s->next_frame_offset =
         s->cur_offset        = pos;
-- 
2.6.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to