diff options
author | Sverker Eriksson <sverker@erlang.org> | 2022-11-08 13:19:40 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2022-11-08 13:19:40 +0100 |
commit | a482c7cab61c37c4e818bf3c918df4d5f8dc1804 (patch) | |
tree | 602770444027c272ed89b88904c481e3094f8eb0 /erts/emulator/beam/external.c | |
parent | c9a766d6f7e81d8f892aa807142e11932fb12cea (diff) | |
parent | 2ac0aede4cf48c0eea401562b2e94e4baf45dfe2 (diff) | |
download | erlang-a482c7cab61c37c4e818bf3c918df4d5f8dc1804.tar.gz |
Merge branch 'sverker/23/fix-binary_to_term-integer-overflow-2'
into sverker/24/fix-binary_to_term-integer-overflow-2
Diffstat (limited to 'erts/emulator/beam/external.c')
-rw-r--r-- | erts/emulator/beam/external.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 8ef71beeb4..d42d50cfd5 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -4355,37 +4355,39 @@ dec_term_atom_common: *objp = NIL; break; case LIST_EXT: - n = get_int32(ep); + { + Uint32 nu = get_uint32(ep); ep += 4; - if (n == 0) { + if (nu == 0) { next = objp; break; } *objp = make_list(hp); - hp += 2 * n; + hp += 2 * (Uint) nu; objp = hp - 2; objp[0] = (Eterm) (objp+1); objp[1] = (Eterm) next; next = objp; objp -= 2; - n--; + nu--; if (ctx) { - if (reds < n) { + if ((Uint) reds < nu) { ASSERT(reds > 0); ctx->state = B2TDecodeList; - ctx->u.dc.remaining_n = n - reds; - n = reds; + ctx->u.dc.remaining_n = nu - reds; + nu = reds; } - reds -= n; + reds -= nu; } - while (n > 0) { + while (nu > 0) { objp[0] = (Eterm) next; objp[1] = make_list(next); next = objp; objp -= 2; - n--; + nu--; } break; + } case STRING_EXT: n = get_int16(ep); ep += 2; |