Commit 0075d9ec authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/dvbsubdec: check region dimensions

Fixes: 1408/clusterfuzz-testcase-minimized-6529985844084736
Fixes: integer overflow

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/targets/ffmpegSigned-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 8824b737
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "bytestream.h" #include "bytestream.h"
#include "internal.h" #include "internal.h"
#include "libavutil/colorspace.h" #include "libavutil/colorspace.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#define DVBSUB_PAGE_SEGMENT 0x10 #define DVBSUB_PAGE_SEGMENT 0x10
...@@ -1127,6 +1128,7 @@ static int dvbsub_parse_region_segment(AVCodecContext *avctx, ...@@ -1127,6 +1128,7 @@ static int dvbsub_parse_region_segment(AVCodecContext *avctx,
DVBSubObject *object; DVBSubObject *object;
DVBSubObjectDisplay *display; DVBSubObjectDisplay *display;
int fill; int fill;
int ret;
if (buf_size < 10) if (buf_size < 10)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -1155,6 +1157,12 @@ static int dvbsub_parse_region_segment(AVCodecContext *avctx, ...@@ -1155,6 +1157,12 @@ static int dvbsub_parse_region_segment(AVCodecContext *avctx,
region->height = AV_RB16(buf); region->height = AV_RB16(buf);
buf += 2; buf += 2;
ret = av_image_check_size(region->width, region->height, 0, avctx);
if (ret < 0) {
region->width= region->height= 0;
return ret;
}
if (region->width * region->height != region->buf_size) { if (region->width * region->height != region->buf_size) {
av_free(region->pbuf); av_free(region->pbuf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment