aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-05-20 15:56:56 +0200
committerSverker Eriksson <[email protected]>2016-05-25 14:29:30 +0200
commitdcaa52d75e3bcbc808696597a34f2fca5677fff9 (patch)
treee2ea3b21d680442d31dbaaf51886b682b6f4e410 /erts/emulator
parentf9cb80861f169743a96099a06d68149a91f18dfa (diff)
downloadotp-dcaa52d75e3bcbc808696597a34f2fca5677fff9.tar.gz
otp-dcaa52d75e3bcbc808696597a34f2fca5677fff9.tar.bz2
otp-dcaa52d75e3bcbc808696597a34f2fca5677fff9.zip
erts: Make erlang:halt/2 truncate string arg
if too long.
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/bif.c11
-rw-r--r--erts/emulator/beam/utils.c8
-rw-r--r--erts/emulator/test/bif_SUITE.erl2
3 files changed, 14 insertions, 7 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 81477422ff..21763edc5b 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -3838,7 +3838,7 @@ BIF_RETTYPE display_nl_0(BIF_ALIST_0)
#define HALT_MSG_SIZE 200
-static char halt_msg[HALT_MSG_SIZE];
+static char halt_msg[HALT_MSG_SIZE+1];
/* stop the system with exit code and flags */
BIF_RETTYPE halt_2(BIF_ALIST_2)
@@ -3892,9 +3892,12 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)
else if (is_string(BIF_ARG_1) || BIF_ARG_1 == NIL) {
Sint i;
- if ((i = intlist_to_buf(BIF_ARG_1, halt_msg, HALT_MSG_SIZE-1)) < 0) {
- goto error;
- }
+ if ((i = intlist_to_buf(BIF_ARG_1, halt_msg, HALT_MSG_SIZE)) == -1) {
+ goto error;
+ }
+ if (i == -2) /* truncated string */
+ i = HALT_MSG_SIZE;
+ ASSERT(i >= 0 && i <= HALT_MSG_SIZE);
halt_msg[i] = '\0';
VERBOSE(DEBUG_SYSTEM,
("System halted by BIF halt(%T, %T)\n", BIF_ARG_1, BIF_ARG_2));
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index cedc88e5fe..f0418446a8 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -3893,8 +3893,10 @@ void bin_write(int to, void *to_arg, byte* buf, size_t sz)
}
/* Fill buf with the contents of bytelist list
- return number of chars in list or -1 for error */
-
+ * return number of chars in list
+ * or -1 for type error
+ * or -2 for not enough buffer space (buffer contains truncated result)
+ */
Sint
intlist_to_buf(Eterm list, char *buf, Sint len)
{
@@ -3917,7 +3919,7 @@ intlist_to_buf(Eterm list, char *buf, Sint len)
return -1;
listptr = list_val(*(listptr + 1));
}
- return -1; /* not enough space */
+ return -2; /* not enough space */
}
/*
diff --git a/erts/emulator/test/bif_SUITE.erl b/erts/emulator/test/bif_SUITE.erl
index 26bb416bf0..ec6cb6ab72 100644
--- a/erts/emulator/test/bif_SUITE.erl
+++ b/erts/emulator/test/bif_SUITE.erl
@@ -646,6 +646,8 @@ erlang_halt(Config) when is_list(Config) ->
{badrpc,nodedown} = rpc:call(N2, erlang, halt, [0]),
{ok,N3} = slave:start(H, halt_node3),
{badrpc,nodedown} = rpc:call(N3, erlang, halt, [0,[]]),
+ {ok,N4} = slave:start(H, halt_node4),
+ {badrpc,nodedown} = rpc:call(N4, erlang, halt, [lists:duplicate(300,$x)]),
% This test triggers a segfault when dumping a crash dump
% to make sure that we can handle it properly.