[FFmpeg-devel] [PATCH] tools/target_dec_fuzzer: add support to fuzz bitstream filters

James Almer jamrial at gmail.com
Wed Nov 27 18:17:34 EET 2019


On 11/27/2019 1:09 PM, Michael Niedermayer wrote:
> On Wed, Nov 27, 2019 at 11:41:09AM -0300, James Almer wrote:
>> On 9/3/2019 10:49 AM, James Almer wrote:
>>> On 8/30/2019 1:39 PM, James Almer wrote:
>>>> Signed-off-by: James Almer <jamrial at gmail.com>
>>>> ---
> 
>>>> Untested.
> 
> i can test if it applies
> 
> 
>>>> I'm also not sure how to add the FFMPEG_BSF define to tools/Makefile,
>>>> and have it coexist with FFMPEG_DECODER. Assuming it's needed.
> 
> maybe something like
> tools/target_bsf_%_fuzzer.o: tools/target_dec_fuzzer.c
>     $(COMPILE_C) -DFFMPEG_BSF=$*
>     
> but maybe i misunderdtand ...

But then what's the decoder used for it? Where is FFMPEG_CODEC defined
in the absence of FFMPEG_DECODER?

> 
> 
> 
>>>>
>>>>  tools/target_dec_fuzzer.c | 43 +++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 43 insertions(+)
>>>>
>>>> diff --git a/tools/target_dec_fuzzer.c b/tools/target_dec_fuzzer.c
>>>> index 0d10503cfb..b8fe1f2aa1 100644
>>>> --- a/tools/target_dec_fuzzer.c
>>>> +++ b/tools/target_dec_fuzzer.c
>>>> @@ -65,6 +65,8 @@ static void error(const char *err)
>>>>  }
>>>>  
>>>>  static AVCodec *c = NULL;
>>>> +static AVBitStreamFilter *f = NULL;
>>>> +
>>>>  static AVCodec *AVCodecInitialize(enum AVCodecID codec_id)
>>>>  {
>>>>      AVCodec *res;
>>>> @@ -102,6 +104,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
>>>>                            int *got_picture_ptr,
>>>>                            const AVPacket *avpkt) = NULL;
>>>>      AVCodecParserContext *parser = NULL;
>>>> +    AVBSFContext *bsf = NULL;
>>>>  
>>>>  
>>>>      if (!c) {
>>>> @@ -120,6 +123,27 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
>>>>          av_log_set_level(AV_LOG_PANIC);
>>>>      }
>>>>  
>>>> +    if (!f) {
>>>> +#ifdef FFMPEG_BSF
>>>> +#define BSF_SYMBOL0(BSF) ff_##BSF##_bsf
>>>> +#define BSF_SYMBOL(BSF) BSF_SYMBOL0(BSF)
>>>> +        extern AVBitStreamFilter BSF_SYMBOL(FFMPEG_BSF);
>>>> +        f = &BSF_SYMBOL(FFMPEG_BSF);
>>>> +
>>>> +        if (f->codec_ids) {
>>>> +            const enum AVCodecID *ids;
>>>> +            for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
>>>> +                if (*ids == c->id)
>>>> +                    break;
>>>> +            if (ids == AV_CODEC_ID_NONE)
>>>> +                error("Invalid bsf");
>>>> +        }
>>>> +#else
>>>> +        extern AVBitStreamFilter ff_null_bsf;
>>>> +        f = &ff_null_bsf;
>>>> +#endif
>>>> +    }
>>>> +
>>>>      switch (c->type) {
>>>>      case AVMEDIA_TYPE_AUDIO   : decode_handler = avcodec_decode_audio4; break;
>>>>      case AVMEDIA_TYPE_VIDEO   : decode_handler = avcodec_decode_video2; break;
>>>> @@ -181,6 +205,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
>>>>      }
>>>>      parser_avctx->codec_id = ctx->codec_id;
>>>>  
>>>> +    res = av_bsf_alloc(f, &bsf);
>>>> +    if (res < 0)
>>>> +        error("Failed memory allocation");
>>>> +
>>>> +    res = avcodec_parameters_from_context(bsf->par_in, ctx);
>>>> +    if (res < 0)
>>>> +        error("Failed memory allocation");
>>>> +
>>>> +    res = av_bsf_init(bsf);
>>>> +    if (res < 0)
>>>> +        return 0; // Failure of av_bsf_init() does not imply that a issue was found
>>>> +
>>>>      int got_frame;
>>>>      AVFrame *frame = av_frame_alloc();
>>>>      if (!frame)
>>>> @@ -237,6 +273,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
>>>>              }
>>>>  
>>>>            // Iterate through all data
>>>> +          res = av_bsf_send_packet(bsf, &avpkt);
>>>> +          while (res >= 0) {
>>>> +            res = av_bsf_receive_packet(bsf, &avpkt);
>>>> +            if (res < 0)
>>>> +                break;
>>>>            while (avpkt.size > 0 && it++ < maxiteration) {
>>>>              av_frame_unref(frame);
>>>>              int ret = decode_handler(ctx, frame, &got_frame, &avpkt);
>>>> @@ -255,6 +296,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
>>>>              avpkt.size -= ret;
>>>>            }
>>>>            av_packet_unref(&avpkt);
>>>> +          }
>>>>          }
>>>>          av_packet_unref(&parsepkt);
>>>>      }
>>>> @@ -270,6 +312,7 @@ maximums_reached:
>>>>  
>>>>      fprintf(stderr, "pixels decoded: %"PRId64", iterations: %d\n", ec_pixels, it);
>>>>  
>>>> +    av_bsf_free(&bsf);
>>>>      av_frame_free(&frame);
>>>>      avcodec_free_context(&ctx);
>>>>      avcodec_free_context(&parser_avctx);
>>>
>>> Ping.
>>
>> Another ping.
> 
> doesnt apply
> 
> Applying: tools/target_dec_fuzzer: add support to fuzz bitstream filters
> error: sha1 information is lacking or useless (tools/target_dec_fuzzer.c).
> error: could not build fake ancestor
> Patch failed at 0001 tools/target_dec_fuzzer: add support to fuzz bitstream filters
> hint: Use 'git am --show-current-patch' to see the failed patch
> When you have resolved this problem, run "git am --continue".
> If you prefer to skip this patch, run "git am --skip" instead.
> To restore the original branch and stop patching, run "git am --abort".

One chunk failed to apply. I fixed it, but will wait for an answer to
the above, so i can also add something to tools/Makefile.


More information about the ffmpeg-devel mailing list