aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2013-11-18 16:58:43 +0100
committerSverker Eriksson <[email protected]>2013-11-18 17:03:56 +0100
commitf32368c4b34c86aa772a372cdb3c306a79127185 (patch)
tree76022d856bb7c18bd3616b3ae6c5d6fafc8b11ff /erts
parentee0ca14382e76d97285e64b3396fbb87f33e23da (diff)
downloadotp-f32368c4b34c86aa772a372cdb3c306a79127185.tar.gz
otp-f32368c4b34c86aa772a372cdb3c306a79127185.tar.bz2
otp-f32368c4b34c86aa772a372cdb3c306a79127185.zip
erts: Fix bug in binary_to_term for binaries larger than 2^31
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/external.c4
-rw-r--r--erts/emulator/test/binary_SUITE.erl1
2 files changed, 3 insertions, 2 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index cfdd38df73..22b0a02937 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -2970,7 +2970,7 @@ dec_term_atom_common:
n = get_int32(ep);
ep += 4;
- if (n <= ERL_ONHEAP_BIN_LIMIT) {
+ if ((unsigned)n <= ERL_ONHEAP_BIN_LIMIT) {
ErlHeapBin* hb = (ErlHeapBin *) hp;
hb->thing_word = header_heap_bin(n);
@@ -3010,7 +3010,7 @@ dec_term_atom_common:
if (((bitsize==0) != (n==0)) || bitsize > 8)
goto error;
ep += 5;
- if (n <= ERL_ONHEAP_BIN_LIMIT) {
+ if ((unsigned)n <= ERL_ONHEAP_BIN_LIMIT) {
ErlHeapBin* hb = (ErlHeapBin *) hp;
hb->thing_word = header_heap_bin(n);
diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl
index d2c4a8ff3c..a340a805b5 100644
--- a/erts/emulator/test/binary_SUITE.erl
+++ b/erts/emulator/test/binary_SUITE.erl
@@ -635,6 +635,7 @@ bad_terms(Config) when is_list(Config) ->
{'EXIT',{badarg,_}} = (catch binary_to_term(<<131,$M,3:32,0,11,22,33>>)),
{'EXIT',{badarg,_}} = (catch binary_to_term(<<131,$M,3:32,9,11,22,33>>)),
{'EXIT',{badarg,_}} = (catch binary_to_term(<<131,$M,0:32,1,11,22,33>>)),
+ {'EXIT',{badarg,_}} = (catch binary_to_term(<<131,$M,-1:32,1,11,22,33>>)),
ok.