Commit d03d3861 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/wavpack: Check bitrate_acc for overflow

Fixes: undefined behavior in 717/clusterfuzz-testcase-5434924129583104

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/targets/ffmpegSigned-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent fab13bbb
...@@ -99,11 +99,13 @@ static av_always_inline int get_tail(GetBitContext *gb, int k) ...@@ -99,11 +99,13 @@ static av_always_inline int get_tail(GetBitContext *gb, int k)
return res; return res;
} }
static void update_error_limit(WavpackFrameContext *ctx) static int update_error_limit(WavpackFrameContext *ctx)
{ {
int i, br[2], sl[2]; int i, br[2], sl[2];
for (i = 0; i <= ctx->stereo_in; i++) { for (i = 0; i <= ctx->stereo_in; i++) {
if (ctx->ch[i].bitrate_acc > UINT_MAX - ctx->ch[i].bitrate_delta)
return AVERROR_INVALIDDATA;
ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta; ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
br[i] = ctx->ch[i].bitrate_acc >> 16; br[i] = ctx->ch[i].bitrate_acc >> 16;
sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level); sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
...@@ -131,6 +133,8 @@ static void update_error_limit(WavpackFrameContext *ctx) ...@@ -131,6 +133,8 @@ static void update_error_limit(WavpackFrameContext *ctx)
ctx->ch[i].error_limit = wp_exp2(br[i]); ctx->ch[i].error_limit = wp_exp2(br[i]);
} }
} }
return 0;
} }
static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
...@@ -200,8 +204,10 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, ...@@ -200,8 +204,10 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
ctx->zero = !ctx->one; ctx->zero = !ctx->one;
} }
if (ctx->hybrid && !channel) if (ctx->hybrid && !channel) {
update_error_limit(ctx); if (update_error_limit(ctx) < 0)
goto error;
}
if (!t) { if (!t) {
base = 0; base = 0;
......
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