[FFmpeg-devel] [PATCH] avcodec/argo: Check for end of input in decode_alcd()

Paul B Mahol onemda at gmail.com
Sat Jul 31 12:45:22 EEST 2021


On Fri, Jul 30, 2021 at 1:59 PM Michael Niedermayer <michael at niedermayer.cc>
wrote:

> On Fri, Jul 30, 2021 at 08:44:03AM +0200, Paul B Mahol wrote:
> > On Fri, Jul 30, 2021 at 12:16 AM Andreas Rheinhardt <
> > andreas.rheinhardt at outlook.com> wrote:
> >
> > > Andreas Rheinhardt:
> > > > Michael Niedermayer:
> > > >> Fixes: reading over the end
> > > >> Fixes:
> > >
> 36346/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_ARGO_fuzzer-5366943107383296
> > > >>
> > > >> Found-by: continuous fuzzing process
> > > https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> > > >> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> > > >> ---
> > > >>  libavcodec/argo.c | 2 ++
> > > >>  1 file changed, 2 insertions(+)
> > > >>
> > > >> diff --git a/libavcodec/argo.c b/libavcodec/argo.c
> > > >> index bbdb6ae15f..79a44d2583 100644
> > > >> --- a/libavcodec/argo.c
> > > >> +++ b/libavcodec/argo.c
> > > >> @@ -116,6 +116,8 @@ static int decode_alcd(AVCodecContext *avctx,
> > > AVFrame *frame)
> > > >>              int index;
> > > >>
> > > >>              if (count == 0) {
> > > >> +                if (bytestream2_get_bytes_left(gb) < 1)
> > > >> +                    return AVERROR_INVALIDDATA;
> > > >>                  codes = bytestream2_get_byteu(&sb);
> > > >>                  count = 8;
> > > >>              }
> > > >>
> > > > Does the following also fix the issue?
> > > >
> > > > diff --git a/libavcodec/argo.c b/libavcodec/argo.c
> > > >
> > > > index bbdb6ae15f..602c042568 100644
> > > >
> > > > --- a/libavcodec/argo.c
> > > >
> > > > +++ b/libavcodec/argo.c
> > > >
> > > > @@ -102,13 +102,14 @@ static int decode_alcd(AVCodecContext *avctx,
> > > > AVFrame *frame)
> > > >
> > > >      uint8_t *dst = frame->data[0];
> > > >
> > > >      uint8_t codes = 0;
> > > >
> > > >      int count = 0;
> > > >
> > > > +    int num_codes = ((frame->width + 1) / 2 * (frame->height + 1) /
> 2 +
> > > > 7) >> 3;
> > > >
> > > >
> > > >
> > > > -    if (bytestream2_get_bytes_left(gb) < 1024 + (((frame->width /
> 2) *
> > > > (frame->height / 2) + 7) >> 3))
> > > >
> > > > +    if (bytestream2_get_bytes_left(gb) < 1024 + num_codes)
> > > >
> > > >          return AVERROR_INVALIDDATA;
> > > >
> > > >
> > > >
> > > >      bytestream2_skipu(gb, 1024);
> > > >
> > > >      sb = *gb;
> > > >
> > > > -    bytestream2_skipu(gb, ((frame->width / 2) * (frame->height / 2)
> +
> > > > 7) >> 3);
> > > >
> > > > +    bytestream2_skipu(gb, num_codes);
> > > >
> > > >
> > > >
> > > >      for (int y = 0; y < frame->height; y += 2) {
> > > >
> > > >          for (int x = 0; x < frame->width; x += 2) {
> > > >
> > > As can be seen from the above patch, my guess is that odd dimensions
> are
> > > the cause (because num_codes as above is the number of codes that is
> > > actually read); but my patch would not only change the criterion for
> > > when to error out, but also how much to skip (i.e. where the real data
> > > begins) and this makes me wonder whether we should not error out in
> this
> > > case (and ask for a sample).
> > >
> >
> > I like Andreas solution much more, anway original video files are having
> > even dimensions,
> > so there is nothing to worry.
>
> I did misread the code, andreas patch or a check for even dimensions is
> better
> than what i posted
>
> should i post a patch checking for even dimensions ?
>
Yes

> if yes, which of the cases should be covered by a even check ?
>
just add check for even dimensions at init?


> i assume alcd and avcf at least
>
> Thanks
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Frequently ignored answer#1 FFmpeg bugs should be sent to our bugtracker.
> User
> questions about the command line tools should be sent to the ffmpeg-user
> ML.
> And questions about how to use libav* should be sent to the libav-user ML.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list