On 28.04.2015 22:21, Michael Niedermayer wrote: > On Tue, Apr 28, 2015 at 08:57:39PM +0200, Andreas Cadhalpun wrote: >> The existing check has two problems: >> 1) i + count can overflow, so that the check '< 256' returns true. >> 2) In the (i == 'N') case occurs a j-- so that the loop runs once more. >> >> This can trigger the assertion 'nut->header_len[0] == 0' or cause >> segmentation faults or infinite hangs. >> >> Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> >> --- >> libavformat/nutdec.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c >> index 1bb2091..46946d3 100644 >> --- a/libavformat/nutdec.c >> +++ b/libavformat/nutdec.c >> @@ -294,7 +294,7 @@ static int decode_main_header(NUTContext *nut) >> while (tmp_fields-- > 8) >> ffio_read_varlen(bc); >> >> - if (count == 0 || i + count > 256) { >> + if (count <= 0 || (i > 'N' && count > 256 - i) || (i <= 'N' && >> count > 255 - i)) { > > this could be simplfied to: > > if (count <= 0 || count > 256 - (i <= 'N') - i)) { ^ OK, but there is a bracket too much. New patch attached.
Best regards, Andreas
>From 95cc0bb685be1436e0689ea77daa3c63d691ecd4 Mon Sep 17 00:00:00 2001 From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> Date: Tue, 28 Apr 2015 22:37:19 +0200 Subject: [PATCH] nutdec: fix illegal count check in decode_main_header The existing check has two problems: 1) i + count can overflow, so that the check '< 256' returns true. 2) In the (i == 'N') case occurs a j-- so that the loop runs once more. This can trigger the assertion 'nut->header_len[0] == 0' or cause segmentation faults or infinite hangs. Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> --- libavformat/nutdec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c index 74e3637..6f615c2 100644 --- a/libavformat/nutdec.c +++ b/libavformat/nutdec.c @@ -294,7 +294,7 @@ static int decode_main_header(NUTContext *nut) while (tmp_fields-- > 8) ffio_read_varlen(bc); - if (count == 0 || i + count > 256) { + if (count <= 0 || count > 256 - (i <= 'N') - i) { av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i); return AVERROR_INVALIDDATA; } -- 2.1.4
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel