diff options
author | Lukas Larsson <[email protected]> | 2014-09-22 12:00:05 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2014-09-22 16:02:05 +0200 |
commit | 16d8a6ce56fd066efa9ecb1d3fa3b3dab6d9613c (patch) | |
tree | f9c026a433fd0a620e04a9741882da1b129fa7b4 /erts/emulator/beam/bif.c | |
parent | 743ed31108ee555db18d9833186865e85e34333e (diff) | |
download | otp-16d8a6ce56fd066efa9ecb1d3fa3b3dab6d9613c.tar.gz otp-16d8a6ce56fd066efa9ecb1d3fa3b3dab6d9613c.tar.bz2 otp-16d8a6ce56fd066efa9ecb1d3fa3b3dab6d9613c.zip |
erts: Fix ub in list_to_integer and bignum div
Diffstat (limited to 'erts/emulator/beam/bif.c')
-rw-r--r-- | erts/emulator/beam/bif.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index a5be8e1529..42dd160e38 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -2772,6 +2772,7 @@ static int do_list_to_integer(Process *p, Eterm orig_list, Eterm *integer, Eterm *rest) { Sint i = 0; + Uint ui = 0; int skip = 0; int neg = 0; int n = 0; @@ -2825,8 +2826,8 @@ static int do_list_to_integer(Process *p, Eterm orig_list, unsigned_val(CAR(list_val(lst))) > '9') { break; } - i = i * 10; - i = i + unsigned_val(CAR(list_val(lst))) - '0'; + ui = ui * 10; + ui = ui + unsigned_val(CAR(list_val(lst))) - '0'; n++; lst = CDR(list_val(lst)); if (is_nil(lst)) { @@ -2850,7 +2851,8 @@ static int do_list_to_integer(Process *p, Eterm orig_list, */ if (n <= SMALL_DIGITS) { /* It must be small */ - if (neg) i = -i; + if (neg) i = -(Sint)ui; + else i = (Sint)ui; res = make_small(i); } else { lg2 = (n+1)*230/69+1; |