diff options
author | Sverker Eriksson <[email protected]> | 2015-03-25 11:30:28 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2015-03-25 11:30:28 +0100 |
commit | 59ec3041469226ef65894e5774ecac0fea1551cd (patch) | |
tree | 87cbf0407e29a43576924a00d7fcbd7b3cc30ce3 /erts/emulator/beam | |
parent | af87b1c3d4897840d8247589a88d3611106ecedc (diff) | |
download | otp-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.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/bif.c | 6 |
1 files changed, 4 insertions, 2 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 */ |