summaryrefslogtreecommitdiff
path: root/libavcodec/exr.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2013-02-24 11:12:59 +0000
committerPaul B Mahol <onemda@gmail.com>2013-02-24 14:27:39 +0000
commit645f96f129ad9d25dd4cad998b6d15de8f9c4765 (patch)
tree592ca6ff4bb98268c2c3a8f0175e86fc39635c86 /libavcodec/exr.c
parent1a08758e7c4e14a9ea8d2fef6c33ad411b2d3c40 (diff)
downloadffmpeg-645f96f129ad9d25dd4cad998b6d15de8f9c4765.tar.gz
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/exr.c')
-rw-r--r--libavcodec/exr.c10
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