aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2015-03-25 11:30:28 +0100
committerSverker Eriksson <[email protected]>2015-03-25 11:30:28 +0100
commit59ec3041469226ef65894e5774ecac0fea1551cd (patch)
tree87cbf0407e29a43576924a00d7fcbd7b3cc30ce3
parentaf87b1c3d4897840d8247589a88d3611106ecedc (diff)
downloadotp-59ec3041469226ef65894e5774ecac0fea1551cd.tar.gz
otp-59ec3041469226ef65894e5774ecac0fea1551cd.tar.bz2
otp-59ec3041469226ef65894e5774ecac0fea1551cd.zip
erts: Fix bug in list_to_integer for very large strings
list_to_integer(lists:duplicate(10000000,$0)). crashed due to overflow when calculating nr heap words.
-rw-r--r--erts/emulator/beam/bif.c6
-rw-r--r--erts/emulator/test/num_bif_SUITE.erl6
2 files changed, 9 insertions, 3 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 42dd160e38..3013ceff21 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -2775,7 +2775,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;
@@ -2855,7 +2855,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) ->