diff options
author | Sverker Eriksson <sverker@erlang.org> | 2015-03-27 17:05:08 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2015-03-27 17:05:08 +0100 |
commit | cd80b9205944583ce5a2b7db3f5ec28e25a527a1 (patch) | |
tree | a59be55645ed8b7b1e8a050e03291203a56633e8 /erts | |
parent | be89d435fbde795bcdc62b99529c5f77d42c6b62 (diff) | |
parent | cbceea683c9f718bc6f0140c2402a7f74455ea14 (diff) | |
download | otp-cd80b9205944583ce5a2b7db3f5ec28e25a527a1.tar.gz otp-cd80b9205944583ce5a2b7db3f5ec28e25a527a1.tar.bz2 otp-cd80b9205944583ce5a2b7db3f5ec28e25a527a1.zip |
Merge branch 'maint'
Conflicts:
lib/stdlib/src/stdlib.appup.src
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/bif.c | 6 | ||||
-rw-r--r-- | erts/emulator/test/num_bif_SUITE.erl | 6 |
2 files changed, 9 insertions, 3 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index cc20ec7440..022150da55 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -2930,7 +2930,7 @@ static int do_list_to_integer(Process *p, Eterm orig_list, Uint ui = 0; int skip = 0; int neg = 0; - int n = 0; + Sint n = 0; int m; int lg2; Eterm res; @@ -3010,7 +3010,9 @@ static int do_list_to_integer(Process *p, Eterm orig_list, else i = (Sint)ui; res = make_small(i); } else { - lg2 = (n+1)*230/69+1; + /* Convert from log10 to log2 by multiplying with 1/log10(2)=3.3219 + which we round up to (3 + 1/3) */ + lg2 = (n+1)*3 + (n+1)/3 + 1; m = (lg2+D_EXP-1)/D_EXP; /* number of digits */ m = BIG_NEED_SIZE(m); /* number of words + thing */ diff --git a/erts/emulator/test/num_bif_SUITE.erl b/erts/emulator/test/num_bif_SUITE.erl index 8cf8377c30..abe5b8eb91 100644 --- a/erts/emulator/test/num_bif_SUITE.erl +++ b/erts/emulator/test/num_bif_SUITE.erl @@ -441,7 +441,11 @@ t_string_to_integer(Config) when is_list(Config) -> {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111z",16}, {"1z111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",16}, {"111z11111111",16}]), - + + %% log2 calculation overflow bug in do_integer_to_list (OTP-12624) + %% Would crash with segv + 0 = list_to_integer(lists:duplicate(10000000,$0)), + ok. test_sti(Num) -> |