|
|
|
@@ -129,8 +129,12 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref |
|
|
|
/** |
|
|
|
* Decode header tree |
|
|
|
*/ |
|
|
|
static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx) |
|
|
|
static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx, int length) |
|
|
|
{ |
|
|
|
if(length > 500) { // Larger length can cause segmentation faults due to too deep recursion. |
|
|
|
av_log(NULL, AV_LOG_ERROR, "length too long\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
if (hc->current + 1 >= hc->length) { |
|
|
|
av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
@@ -159,12 +163,12 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx |
|
|
|
int r = 0, r_new, t; |
|
|
|
|
|
|
|
t = hc->current++; |
|
|
|
r = smacker_decode_bigtree(gb, hc, ctx); |
|
|
|
r = smacker_decode_bigtree(gb, hc, ctx, length + 1); |
|
|
|
if(r < 0) |
|
|
|
return r; |
|
|
|
hc->values[t] = SMK_NODE | r; |
|
|
|
r++; |
|
|
|
r_new = smacker_decode_bigtree(gb, hc, ctx); |
|
|
|
r_new = smacker_decode_bigtree(gb, hc, ctx, length + 1); |
|
|
|
if (r_new < 0) |
|
|
|
return r_new; |
|
|
|
return r + r_new; |
|
|
|
@@ -275,7 +279,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int |
|
|
|
goto error; |
|
|
|
} |
|
|
|
|
|
|
|
if (smacker_decode_bigtree(gb, &huff, &ctx) < 0) |
|
|
|
if (smacker_decode_bigtree(gb, &huff, &ctx, 0) < 0) |
|
|
|
err = -1; |
|
|
|
skip_bits1(gb); |
|
|
|
if(ctx.last[0] == -1) ctx.last[0] = huff.current++; |
|
|
|
|