diff options
author | Paul B Mahol <onemda@gmail.com> | 2013-02-24 15:12:59 +0400 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2013-02-24 18:27:39 +0400 |
commit | 645f96f129ad9d25dd4cad998b6d15de8f9c4765 (patch) | |
tree | 592ca6ff4bb98268c2c3a8f0175e86fc39635c86 /libavcodec | |
parent | 1a08758e7c4e14a9ea8d2fef6c33ad411b2d3c40 (diff) |
exr: check color channel subsampling too
If there is unsupported subsampling encountered abort
early instead of failing decoding later.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/exr.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/libavcodec/exr.c b/libavcodec/exr.c index 238348369c..83d1cc99f7 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -434,6 +434,7 @@ static int decode_frame(AVCodecContext *avctx, while (channel_list_end - buf >= 19) { int current_bits_per_color_id = -1; int channel_index = -1; + int xsub, ysub; if (!strcmp(buf, "R")) channel_index = 0; @@ -460,6 +461,14 @@ static int decode_frame(AVCodecContext *avctx, return AVERROR_INVALIDDATA; } + buf += 4; + xsub = bytestream_get_le32(&buf); + ysub = bytestream_get_le32(&buf); + if (xsub != 1 || ysub != 1) { + av_log(avctx, AV_LOG_ERROR, "Unsupported subsampling %dx%d\n", xsub, ysub); + return AVERROR_PATCHWELCOME; + } + if (channel_index >= 0) { if (s->bits_per_color_id != -1 && s->bits_per_color_id != current_bits_per_color_id) { av_log(avctx, AV_LOG_ERROR, "RGB channels not of the same depth\n"); @@ -470,7 +479,6 @@ static int decode_frame(AVCodecContext *avctx, } current_channel_offset += 1 << current_bits_per_color_id; - buf += 12; } /* Check if all channels are set with an offset or if the channels |