File 2239-erts-Make-erlang-halt-2-truncate-string-arg.patch of Package erlang

From dcaa52d75e3bcbc808696597a34f2fca5677fff9 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Fri, 20 May 2016 15:56:56 +0200
Subject: [PATCH 5/7] erts: Make erlang:halt/2 truncate string arg

if too long.
---
 erts/doc/src/erlang.xml          |  4 ++--
 erts/emulator/beam/bif.c         | 11 +++++++----
 erts/emulator/beam/utils.c       |  8 +++++---
 erts/emulator/test/bif_SUITE.erl |  2 ++
 4 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 1e251d3..665429d 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -1802,8 +1802,8 @@ os_prompt% </pre>
 	  <tag>string()</tag>
 	  <item>An Erlang crash dump is produced with <c><anno>Status</anno></c>
 	  as slogan. Then the runtime system exits with status code <c>1</c>.
-	  Note that the string may not be longer than 200 characters and only
-	  code points in the range 0-255 may be used.
+	  Note that only code points in the range 0-255 may be used
+	  and the string will be truncated if longer than 200 characters.
 	  </item>
 	  <tag><c>abort</c></tag>
 	  <item>
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 8147742..21763ed 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 cedc88e..f041844 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 26bb416..ec6cb6a 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.
-- 
2.1.4

openSUSE Build Service is sponsored by