diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2013-09-18 19:55:40 +0200 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2013-09-21 09:51:10 +0200 |
commit | 29f244e08ee0ef83098a65648b6880cb55a8c242 (patch) | |
tree | ed7a5ddc878668036ecad52997aea0f4708abd14 /libavcodec/dvbsubdec.c | |
parent | 97ff584af432b4ad77c388b201a6861bfeb95e3f (diff) | |
download | ffmpeg-29f244e08ee0ef83098a65648b6880cb55a8c242.tar.gz |
dvbsubdec: Check for invalid clut selector.
Fail decoding if strict compliance is requested.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavcodec/dvbsubdec.c')
-rw-r--r-- | libavcodec/dvbsubdec.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c index faa510a858..ab09e4f8a3 100644 --- a/libavcodec/dvbsubdec.c +++ b/libavcodec/dvbsubdec.c @@ -933,7 +933,7 @@ static void dvbsub_parse_object_segment(AVCodecContext *avctx, } -static void dvbsub_parse_clut_segment(AVCodecContext *avctx, +static int dvbsub_parse_clut_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { DVBSubContext *ctx = avctx->priv_data; @@ -986,7 +986,7 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx, if (depth == 0) { av_log(avctx, AV_LOG_ERROR, "Invalid clut depth 0x%x!\n", *buf); - return; + return 0; } full_range = (*buf++) & 1; @@ -1012,6 +1012,11 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx, YUV_TO_RGB2_CCIR(r, g, b, y); av_dlog(avctx, "clut %d := (%d,%d,%d,%d)\n", entry_id, r, g, b, alpha); + if (!!(depth & 0x80) + !!(depth & 0x40) + !!(depth & 0x20) > 1) { + av_dlog(avctx, "More than one bit level marked: %x\n", depth); + if (avctx->strict_std_compliance > FF_COMPLIANCE_NORMAL) + return AVERROR_INVALIDDATA; + } if (depth & 0x80) clut->clut4[entry_id] = RGBA(r,g,b,255 - alpha); @@ -1021,6 +1026,7 @@ static void dvbsub_parse_clut_segment(AVCodecContext *avctx, clut->clut256[entry_id] = RGBA(r,g,b,255 - alpha); } } + return 0; } @@ -1456,6 +1462,7 @@ static int dvbsub_decode(AVCodecContext *avctx, int page_id; int segment_length; int i; + int ret; int got_segment = 0; av_dlog(avctx, "DVB sub packet:\n"); @@ -1502,7 +1509,8 @@ static int dvbsub_decode(AVCodecContext *avctx, got_segment |= 2; break; case DVBSUB_CLUT_SEGMENT: - dvbsub_parse_clut_segment(avctx, p, segment_length); + ret = dvbsub_parse_clut_segment(avctx, p, segment_length); + if (ret < 0) return ret; got_segment |= 4; break; case DVBSUB_OBJECT_SEGMENT: |