aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2020-11-03 23:41:36 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2021-02-02 14:18:21 +0100
commit6102e7ca968690ff3c691a0d2d3a7535b9bcbe53 (patch)
tree5ab236fca86be7a050217b6dc0e8fc0c3b58f8e6
parent39006dfef8b5b314209266cb0a65df11ad947417 (diff)
downloadffmpeg-6102e7ca968690ff3c691a0d2d3a7535b9bcbe53.tar.gz
avformat/fitsdec: Better size checks
Fixes: out of array access Fixes: 26819/clusterfuzz-testcase-minimized-ffmpeg_dem_FITS_fuzzer-5634559355650048 Fixes: 26820/clusterfuzz-testcase-minimized-ffmpeg_dem_FITS_fuzzer-5760774955597824 Fixes: 27379/clusterfuzz-testcase-minimized-ffmpeg_dem_FITS_fuzzer-5129775942991872.fuzz Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit 14bbb6bb30a6053e82f865c2d69d1a4dd2297fc1) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/fitsdec.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libavformat/fitsdec.c b/libavformat/fitsdec.c
index e52ddc7e79..df757e868b 100644
--- a/libavformat/fitsdec.c
+++ b/libavformat/fitsdec.c
@@ -24,6 +24,7 @@
* FITS demuxer.
*/
+#include "libavutil/avassert.h"
#include "libavutil/intreadwrite.h"
#include "internal.h"
#include "libavutil/opt.h"
@@ -125,14 +126,14 @@ static int64_t is_image(AVFormatContext *s, FITSContext *fits, FITSHeader *heade
size += header->pcount;
t = (abs(header->bitpix) >> 3) * ((int64_t) header->gcount);
- if(size && t > UINT64_MAX / size)
+ if(size && t > INT64_MAX / size)
return AVERROR_INVALIDDATA;
size *= t;
if (!size) {
image = 0;
} else {
- if(FITS_BLOCK_SIZE - 1 > UINT64_MAX - size)
+ if(FITS_BLOCK_SIZE - 1 > INT64_MAX - size)
return AVERROR_INVALIDDATA;
size = ((size + FITS_BLOCK_SIZE - 1) / FITS_BLOCK_SIZE) * FITS_BLOCK_SIZE;
}
@@ -173,6 +174,11 @@ static int fits_read_packet(AVFormatContext *s, AVPacket *pkt)
goto fail;
}
+ av_assert0(avbuf.len <= INT64_MAX && size <= INT64_MAX);
+ if (avbuf.len + size > INT_MAX - 80) {
+ ret = AVERROR_INVALIDDATA;
+ goto fail;
+ }
// Header is sent with the first line removed...
ret = av_new_packet(pkt, avbuf.len - 80 + size);
if (ret < 0)