Commit c1947015 authored by Paul B Mahol's avatar Paul B Mahol

smackaud: return meaningful error codes

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 2a374f06
...@@ -98,12 +98,12 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref ...@@ -98,12 +98,12 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref
{ {
if(length > 32) { if(length > 32) {
av_log(NULL, AV_LOG_ERROR, "length too long\n"); av_log(NULL, AV_LOG_ERROR, "length too long\n");
return -1; return AVERROR_INVALIDDATA;
} }
if(!get_bits1(gb)){ //Leaf if(!get_bits1(gb)){ //Leaf
if(hc->current >= 256){ if(hc->current >= 256){
av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
return -1; return AVERROR_INVALIDDATA;
} }
if(length){ if(length){
hc->bits[hc->current] = prefix; hc->bits[hc->current] = prefix;
...@@ -134,14 +134,14 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx ...@@ -134,14 +134,14 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx
{ {
if (hc->current + 1 >= hc->length) { if (hc->current + 1 >= hc->length) {
av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
return -1; return AVERROR_INVALIDDATA;
} }
if(!get_bits1(gb)){ //Leaf if(!get_bits1(gb)){ //Leaf
int val, i1, i2; int val, i1, i2;
i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) : 0; i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) : 0;
i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) : 0; i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) : 0;
if (i1 < 0 || i2 < 0) if (i1 < 0 || i2 < 0)
return -1; return AVERROR_INVALIDDATA;
val = ctx->recode1[i1] | (ctx->recode2[i2] << 8); val = ctx->recode1[i1] | (ctx->recode2[i2] << 8);
if(val == ctx->escapes[0]) { if(val == ctx->escapes[0]) {
ctx->last[0] = hc->current; ctx->last[0] = hc->current;
...@@ -187,7 +187,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ...@@ -187,7 +187,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
if(size >= UINT_MAX>>4){ // (((size + 3) >> 2) + 3) << 2 must not overflow if(size >= UINT_MAX>>4){ // (((size + 3) >> 2) + 3) << 2 must not overflow
av_log(smk->avctx, AV_LOG_ERROR, "size too large\n"); av_log(smk->avctx, AV_LOG_ERROR, "size too large\n");
return -1; return AVERROR_INVALIDDATA;
} }
tmp1.length = 256; tmp1.length = 256;
...@@ -212,7 +212,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ...@@ -212,7 +212,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
tmp1.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); tmp1.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) { if(res < 0) {
av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
return -1; return AVERROR_INVALIDDATA;
} }
} else { } else {
av_log(smk->avctx, AV_LOG_ERROR, "Skipping low bytes tree\n"); av_log(smk->avctx, AV_LOG_ERROR, "Skipping low bytes tree\n");
...@@ -225,7 +225,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ...@@ -225,7 +225,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
tmp2.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); tmp2.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) { if(res < 0) {
av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
return -1; return AVERROR_INVALIDDATA;
} }
} else { } else {
av_log(smk->avctx, AV_LOG_ERROR, "Skipping high bytes tree\n"); av_log(smk->avctx, AV_LOG_ERROR, "Skipping high bytes tree\n");
...@@ -260,7 +260,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ...@@ -260,7 +260,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
if(huff.current > huff.length){ if(huff.current > huff.length){
ctx.last[0] = ctx.last[1] = ctx.last[2] = 1; ctx.last[0] = ctx.last[1] = ctx.last[2] = 1;
av_log(smk->avctx, AV_LOG_ERROR, "bigtree damaged\n"); av_log(smk->avctx, AV_LOG_ERROR, "bigtree damaged\n");
return -1; return AVERROR_INVALIDDATA;
} }
*recodes = huff.values; *recodes = huff.values;
...@@ -297,7 +297,7 @@ static int decode_header_trees(SmackVContext *smk) { ...@@ -297,7 +297,7 @@ static int decode_header_trees(SmackVContext *smk) {
smk->mmap_last[0] = smk->mmap_last[1] = smk->mmap_last[2] = 1; smk->mmap_last[0] = smk->mmap_last[1] = smk->mmap_last[2] = 1;
} else { } else {
if (smacker_decode_header_tree(smk, &gb, &smk->mmap_tbl, smk->mmap_last, mmap_size)) if (smacker_decode_header_tree(smk, &gb, &smk->mmap_tbl, smk->mmap_last, mmap_size))
return -1; return AVERROR_INVALIDDATA;
} }
if(!get_bits1(&gb)) { if(!get_bits1(&gb)) {
av_log(smk->avctx, AV_LOG_INFO, "Skipping MCLR tree\n"); av_log(smk->avctx, AV_LOG_INFO, "Skipping MCLR tree\n");
...@@ -306,7 +306,7 @@ static int decode_header_trees(SmackVContext *smk) { ...@@ -306,7 +306,7 @@ static int decode_header_trees(SmackVContext *smk) {
smk->mclr_last[0] = smk->mclr_last[1] = smk->mclr_last[2] = 1; smk->mclr_last[0] = smk->mclr_last[1] = smk->mclr_last[2] = 1;
} else { } else {
if (smacker_decode_header_tree(smk, &gb, &smk->mclr_tbl, smk->mclr_last, mclr_size)) if (smacker_decode_header_tree(smk, &gb, &smk->mclr_tbl, smk->mclr_last, mclr_size))
return -1; return AVERROR_INVALIDDATA;
} }
if(!get_bits1(&gb)) { if(!get_bits1(&gb)) {
av_log(smk->avctx, AV_LOG_INFO, "Skipping FULL tree\n"); av_log(smk->avctx, AV_LOG_INFO, "Skipping FULL tree\n");
...@@ -315,7 +315,7 @@ static int decode_header_trees(SmackVContext *smk) { ...@@ -315,7 +315,7 @@ static int decode_header_trees(SmackVContext *smk) {
smk->full_last[0] = smk->full_last[1] = smk->full_last[2] = 1; smk->full_last[0] = smk->full_last[1] = smk->full_last[2] = 1;
} else { } else {
if (smacker_decode_header_tree(smk, &gb, &smk->full_tbl, smk->full_last, full_size)) if (smacker_decode_header_tree(smk, &gb, &smk->full_tbl, smk->full_last, full_size))
return -1; return AVERROR_INVALIDDATA;
} }
if(!get_bits1(&gb)) { if(!get_bits1(&gb)) {
av_log(smk->avctx, AV_LOG_INFO, "Skipping TYPE tree\n"); av_log(smk->avctx, AV_LOG_INFO, "Skipping TYPE tree\n");
...@@ -324,7 +324,7 @@ static int decode_header_trees(SmackVContext *smk) { ...@@ -324,7 +324,7 @@ static int decode_header_trees(SmackVContext *smk) {
smk->type_last[0] = smk->type_last[1] = smk->type_last[2] = 1; smk->type_last[0] = smk->type_last[1] = smk->type_last[2] = 1;
} else { } else {
if (smacker_decode_header_tree(smk, &gb, &smk->type_tbl, smk->type_last, type_size)) if (smacker_decode_header_tree(smk, &gb, &smk->type_tbl, smk->type_last, type_size))
return -1; return AVERROR_INVALIDDATA;
} }
return 0; return 0;
...@@ -652,7 +652,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, ...@@ -652,7 +652,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) { if(res < 0) {
av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
return -1; return AVERROR_INVALIDDATA;
} }
} }
} }
...@@ -663,7 +663,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, ...@@ -663,7 +663,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
*samples++ = pred[i]; *samples++ = pred[i];
for(; i < unp_size / 2; i++) { for(; i < unp_size / 2; i++) {
if(get_bits_left(&gb)<0) if(get_bits_left(&gb)<0)
return -1; return AVERROR_INVALIDDATA;
if(i & stereo) { if(i & stereo) {
if(vlc[2].table) if(vlc[2].table)
res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
...@@ -715,7 +715,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, ...@@ -715,7 +715,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
*samples8++ = pred[i]; *samples8++ = pred[i];
for(; i < unp_size; i++) { for(; i < unp_size; i++) {
if(get_bits_left(&gb)<0) if(get_bits_left(&gb)<0)
return -1; return AVERROR_INVALIDDATA;
if(i & stereo){ if(i & stereo){
if(vlc[1].table) if(vlc[1].table)
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment