diff options
author | Wan-Teh Chang <wtc@google.com> | 2020-06-19 16:41:12 +0300 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2020-06-21 16:18:28 +0300 |
commit | b14711ca0fe92056c6c076abbfad057029a58987 (patch) | |
tree | 3320075ea1efc6f3e56fe9a11a4e5b09cd70ade2 /src/getbits.c | |
parent | 1efea985698591000cfa9b32964a0e7a3be03794 (diff) |
Simplify checks for dav1d_get_uleb128 out overflow
Diffstat (limited to 'src/getbits.c')
-rw-r--r-- | src/getbits.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/getbits.c b/src/getbits.c index 12bac35..04ddd7c 100644 --- a/src/getbits.c +++ b/src/getbits.c @@ -27,6 +27,8 @@ #include "config.h" +#include <limits.h> + #include "common/intops.h" #include "src/getbits.h" @@ -80,17 +82,17 @@ int dav1d_get_sbits(GetBits *const c, const unsigned n) { } unsigned dav1d_get_uleb128(GetBits *c) { - unsigned val = 0, more, i = 0; + unsigned val = 0, more, i = 0, max = UINT_MAX; do { more = dav1d_get_bits(c, 1); unsigned bits = dav1d_get_bits(c, 7); - if (i <= 3 || (i == 4 && bits < (1 << 4))) - val |= bits << (i * 7); - else if (bits) { + if (bits > max) { c->error = 1; return 0; } + val |= bits << (i * 7); + max >>= 7; if (more && ++i == 8) { c->error = 1; return 0; |