From 4dcf71aacca695fecba2c04e14d2b44bb3d8b764 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Fri, 12 Oct 2012 09:18:58 +0000 Subject: takdec: stop decoding in case of unknown bps Signed-off-by: Paul B Mahol --- libavcodec/takdec.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c index d55f51a26d..76bde55c56 100644 --- a/libavcodec/takdec.c +++ b/libavcodec/takdec.c @@ -146,7 +146,7 @@ static const struct CParam { { 0x1A, 0x1800000, 0x1800000, 0x6800000, 0xC000000 }, }; -static void tak_set_bps(AVCodecContext *avctx, int bps) +static int tak_set_bps(AVCodecContext *avctx, int bps) { switch (bps) { case 8: @@ -158,7 +158,12 @@ static void tak_set_bps(AVCodecContext *avctx, int bps) case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32P; break; + default: + av_log(avctx, AV_LOG_ERROR, "invalid/unsupported bits per sample\n"); + return AVERROR_INVALIDDATA; } + + return 0; } static int get_shift(int sample_rate) @@ -185,6 +190,7 @@ static int get_scale(int sample_rate, int shift) static av_cold int tak_decode_init(AVCodecContext *avctx) { TAKDecContext *s = avctx->priv_data; + int ret; ff_tak_init_crc(); ff_dsputil_init(&s->dsp, avctx); @@ -196,7 +202,8 @@ static av_cold int tak_decode_init(AVCodecContext *avctx) s->uval = get_scale(avctx->sample_rate, get_shift(avctx->sample_rate)); s->subframe_scale = get_scale(avctx->sample_rate, 1); - tak_set_bps(avctx, avctx->bits_per_coded_sample); + if ((ret = tak_set_bps(avctx, avctx->bits_per_coded_sample)) < 0) + return ret; return 0; } @@ -775,7 +782,8 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, if (s->ti.bps != avctx->bits_per_raw_sample) { avctx->bits_per_raw_sample = s->ti.bps; - tak_set_bps(avctx, avctx->bits_per_raw_sample); + if ((ret = tak_set_bps(avctx, avctx->bits_per_raw_sample)) < 0) + return ret; } if (s->ti.sample_rate != avctx->sample_rate) { avctx->sample_rate = s->ti.sample_rate; -- cgit v1.2.3