Paul B Mahol
2018-12-10 16:58:45 UTC
ffmpeg | branch: master | Paul B Mahol <***@gmail.com> | Mon Dec 10 13:32:10 2018 +0100| [8affd753c86d7e2ddefd24beafe4e892914c63bc] | committer: Paul B Mahol
avcodec/gifdec: truncate too big width/height for invalid gif files
Fixes #6874.
libavcodec/gifdec.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c
index 54f1d4c0ba..2115da163f 100644
--- a/libavcodec/gifdec.c
+++ b/libavcodec/gifdec.c
@@ -179,12 +179,20 @@ static int gif_read_image(GifState *s, AVFrame *frame)
}
/* verify that all the image is inside the screen dimensions */
- if (!width || width > s->screen_width || left >= s->screen_width) {
- av_log(s->avctx, AV_LOG_ERROR, "Invalid image width.\n");
+ if (!width || width > s->screen_width) {
+ av_log(s->avctx, AV_LOG_WARNING, "Invalid image width: %d, truncating.\n", width);
+ width = s->screen_width;
+ }
+ if (left >= s->screen_width) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid left position: %d.\n", left);
return AVERROR_INVALIDDATA;
}
- if (!height || height > s->screen_height || top >= s->screen_height) {
- av_log(s->avctx, AV_LOG_ERROR, "Invalid image height.\n");
+ if (!height || height > s->screen_height) {
+ av_log(s->avctx, AV_LOG_WARNING, "Invalid image height: %d, truncating.\n", height);
+ height = s->screen_height;
+ }
+ if (top >= s->screen_height) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid top position: %d.\n", top);
return AVERROR_INVALIDDATA;
}
if (left + width > s->screen_width) {
avcodec/gifdec: truncate too big width/height for invalid gif files
Fixes #6874.
http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8affd753c86d7e2ddefd24beafe4e892914c63bc
---libavcodec/gifdec.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c
index 54f1d4c0ba..2115da163f 100644
--- a/libavcodec/gifdec.c
+++ b/libavcodec/gifdec.c
@@ -179,12 +179,20 @@ static int gif_read_image(GifState *s, AVFrame *frame)
}
/* verify that all the image is inside the screen dimensions */
- if (!width || width > s->screen_width || left >= s->screen_width) {
- av_log(s->avctx, AV_LOG_ERROR, "Invalid image width.\n");
+ if (!width || width > s->screen_width) {
+ av_log(s->avctx, AV_LOG_WARNING, "Invalid image width: %d, truncating.\n", width);
+ width = s->screen_width;
+ }
+ if (left >= s->screen_width) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid left position: %d.\n", left);
return AVERROR_INVALIDDATA;
}
- if (!height || height > s->screen_height || top >= s->screen_height) {
- av_log(s->avctx, AV_LOG_ERROR, "Invalid image height.\n");
+ if (!height || height > s->screen_height) {
+ av_log(s->avctx, AV_LOG_WARNING, "Invalid image height: %d, truncating.\n", height);
+ height = s->screen_height;
+ }
+ if (top >= s->screen_height) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid top position: %d.\n", top);
return AVERROR_INVALIDDATA;
}
if (left + width > s->screen_width) {