diff mbox

[FFmpeg-devel,2/2] avcodec/jpeg2000dec: Fix division by zero in jp2_find_codestream()

Message ID 20170724153425.21586-2-michael@niedermayer.cc
State Accepted
Commit 1b00600319506a9bd81b114d2b374051dc1a29a6
Headers show

Commit Message

Michael Niedermayer July 24, 2017, 3:34 p.m. UTC
Fixes: 2707/clusterfuzz-testcase-minimized-5179636394754048

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

Comments

Carl Eugen Hoyos July 24, 2017, 5:56 p.m. UTC | #1
2017-07-24 17:34 GMT+02:00 Michael Niedermayer <michael@niedermayer.cc>:
> Fixes: 2707/clusterfuzz-testcase-minimized-5179636394754048
>
> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/jpeg2000dec.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
> index b67efc76bb..dd9c60feb4 100644
> --- a/libavcodec/jpeg2000dec.c
> +++ b/libavcodec/jpeg2000dec.c
> @@ -2075,6 +2075,11 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s)
>                      hden = bytestream2_get_be16u(&s->g);
>                      vexp = bytestream2_get_byteu(&s->g);
>                      hexp = bytestream2_get_byteu(&s->g);
> +                    if (!vnum || !vden || !hnum || !vden) {
> +                        bytestream2_seek(&s->g, atom2_end, SEEK_SET);
> +                        av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
> +                        continue;
> +                    }

Thank you!

I believe it is possible to move the "resd"/"resc" check above down if you think
that simplifies the code.

Carl Eugen
Michael Niedermayer July 26, 2017, 1:50 p.m. UTC | #2
On Mon, Jul 24, 2017 at 07:56:34PM +0200, Carl Eugen Hoyos wrote:
> 2017-07-24 17:34 GMT+02:00 Michael Niedermayer <michael@niedermayer.cc>:
> > Fixes: 2707/clusterfuzz-testcase-minimized-5179636394754048
> >
> > Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> > ---
> >  libavcodec/jpeg2000dec.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
> > index b67efc76bb..dd9c60feb4 100644
> > --- a/libavcodec/jpeg2000dec.c
> > +++ b/libavcodec/jpeg2000dec.c
> > @@ -2075,6 +2075,11 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s)
> >                      hden = bytestream2_get_be16u(&s->g);
> >                      vexp = bytestream2_get_byteu(&s->g);
> >                      hexp = bytestream2_get_byteu(&s->g);
> > +                    if (!vnum || !vden || !hnum || !vden) {
> > +                        bytestream2_seek(&s->g, atom2_end, SEEK_SET);
> > +                        av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
> > +                        continue;
> > +                    }
> 
> Thank you!
> 
> I believe it is possible to move the "resd"/"resc" check above down if you think
> that simplifies the code.

That could be done, but it somehow doesnt feel right. The type
should be checked before reading the values.

ill apply the patches as they are

thx

[...]
diff mbox

Patch

diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index b67efc76bb..dd9c60feb4 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -2075,6 +2075,11 @@  static int jp2_find_codestream(Jpeg2000DecoderContext *s)
                     hden = bytestream2_get_be16u(&s->g);
                     vexp = bytestream2_get_byteu(&s->g);
                     hexp = bytestream2_get_byteu(&s->g);
+                    if (!vnum || !vden || !hnum || !vden) {
+                        bytestream2_seek(&s->g, atom2_end, SEEK_SET);
+                        av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
+                        continue;
+                    }
                     if (vexp > hexp) {
                         vexp -= hexp;
                         hexp = 0;