summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/external.c
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2022-11-08 13:19:40 +0100
committerSverker Eriksson <sverker@erlang.org>2022-11-08 13:19:40 +0100
commita482c7cab61c37c4e818bf3c918df4d5f8dc1804 (patch)
tree602770444027c272ed89b88904c481e3094f8eb0 /erts/emulator/beam/external.c
parentc9a766d6f7e81d8f892aa807142e11932fb12cea (diff)
parent2ac0aede4cf48c0eea401562b2e94e4baf45dfe2 (diff)
downloaderlang-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.c22
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;