diff mbox series

[FFmpeg-devel,2/4] avcodec/cbs_vp8: Do not use assert to check for end

Message ID 20231216121619.19436-2-michael@niedermayer.cc
State New
Headers show
Series [FFmpeg-devel,1/4] tools/target_dec_fuzzer: Adjust Threshold for VP6A | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Michael Niedermayer Dec. 16, 2023, 12:16 p.m. UTC
Fixes: abort()
Fixes: 64232/clusterfuzz-testcase-minimized-ffmpeg_BSF_TRACE_HEADERS_fuzzer-5417957987319808

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/cbs_vp8.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

James Almer Dec. 16, 2023, 12:20 p.m. UTC | #1
On 12/16/2023 9:16 AM, Michael Niedermayer wrote:
> Fixes: abort()
> Fixes: 64232/clusterfuzz-testcase-minimized-ffmpeg_BSF_TRACE_HEADERS_fuzzer-5417957987319808
> 
> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>   libavcodec/cbs_vp8.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/cbs_vp8.c b/libavcodec/cbs_vp8.c
> index 01d4b9cefef..b76cde98517 100644
> --- a/libavcodec/cbs_vp8.c
> +++ b/libavcodec/cbs_vp8.c
> @@ -329,7 +329,9 @@ static int cbs_vp8_read_unit(CodedBitstreamContext *ctx,
>   
>       pos = get_bits_count(&gbc);
>       pos /= 8;
> -    av_assert0(pos <= unit->data_size);
> +
> +    if (pos > unit->data_size)
> +        return AVERROR_INVALIDDATA;

Wouldn't this be hiding a bug in the parsing code? The assert is there 
to ensure no overread happened.

>   
>       frame->data_ref = av_buffer_ref(unit->data_ref);
>       if (!frame->data_ref)
Michael Niedermayer Dec. 17, 2023, 12:09 p.m. UTC | #2
On Sat, Dec 16, 2023 at 09:20:24AM -0300, James Almer wrote:
> On 12/16/2023 9:16 AM, Michael Niedermayer wrote:
> > Fixes: abort()
> > Fixes: 64232/clusterfuzz-testcase-minimized-ffmpeg_BSF_TRACE_HEADERS_fuzzer-5417957987319808
> > 
> > Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> > ---
> >   libavcodec/cbs_vp8.c | 4 +++-
> >   1 file changed, 3 insertions(+), 1 deletion(-)
> > 
> > diff --git a/libavcodec/cbs_vp8.c b/libavcodec/cbs_vp8.c
> > index 01d4b9cefef..b76cde98517 100644
> > --- a/libavcodec/cbs_vp8.c
> > +++ b/libavcodec/cbs_vp8.c
> > @@ -329,7 +329,9 @@ static int cbs_vp8_read_unit(CodedBitstreamContext *ctx,
> >       pos = get_bits_count(&gbc);
> >       pos /= 8;
> > -    av_assert0(pos <= unit->data_size);
> > +
> > +    if (pos > unit->data_size)
> > +        return AVERROR_INVALIDDATA;
> 
> Wouldn't this be hiding a bug in the parsing code? The assert is there to
> ensure no overread happened.

ill send a better patch, this patch is bad and wrong

thx

[...]
Dai, Jianhui J Dec. 18, 2023, 11:57 a.m. UTC | #3
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Michael
> Niedermayer
> Sent: Saturday, December 16, 2023 8:16 PM
> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> Subject: [FFmpeg-devel] [PATCH 2/4] avcodec/cbs_vp8: Do not use assert to
> check for end
> 
> Fixes: abort()
> Fixes: 64232/clusterfuzz-testcase-minimized-
> ffmpeg_BSF_TRACE_HEADERS_fuzzer-5417957987319808
> 
> Found-by: continuous fuzzing process https://github.com/google/oss-
> fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/cbs_vp8.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/cbs_vp8.c b/libavcodec/cbs_vp8.c index
> 01d4b9cefef..b76cde98517 100644
> --- a/libavcodec/cbs_vp8.c
> +++ b/libavcodec/cbs_vp8.c
> @@ -329,7 +329,9 @@ static int cbs_vp8_read_unit(CodedBitstreamContext
> *ctx,
> 
>      pos = get_bits_count(&gbc);
>      pos /= 8;
> -    av_assert0(pos <= unit->data_size);
> +
> +    if (pos > unit->data_size)
> +        return AVERROR_INVALIDDATA;
> 

This is a potentially fatal error caused by the parser overreading past the expected data. This should not occur after the fix GetBitContext setup patch was applied.
BTW, the VP8 compressed header does not guarantee 8-bit alignment according to the SPEC.
It could be better to check the bit pos.

```
pos = get_bits_count(&gbc);
av_assert0(pos <= unit->data_size * 8);
```

>      frame->data_ref = av_buffer_ref(unit->data_ref);
>      if (!frame->data_ref)
> --
> 2.17.1
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with
> subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavcodec/cbs_vp8.c b/libavcodec/cbs_vp8.c
index 01d4b9cefef..b76cde98517 100644
--- a/libavcodec/cbs_vp8.c
+++ b/libavcodec/cbs_vp8.c
@@ -329,7 +329,9 @@  static int cbs_vp8_read_unit(CodedBitstreamContext *ctx,
 
     pos = get_bits_count(&gbc);
     pos /= 8;
-    av_assert0(pos <= unit->data_size);
+
+    if (pos > unit->data_size)
+        return AVERROR_INVALIDDATA;
 
     frame->data_ref = av_buffer_ref(unit->data_ref);
     if (!frame->data_ref)