File 0222-erts-Fix-bug-in-systask-scheduling.patch of Package erlang

From d563fdd7f3bfa5df218e3965ca45a0348514a2a7 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 6 Nov 2017 17:59:28 +0100
Subject: [PATCH] erts: Fix bug in systask scheduling

when request id is an immediate.

Ex:
erlang:garbage_collect(P, [{async,Immediate}]).
may crash the VM.
---
 erts/emulator/beam/erl_process.c     |  2 +-
 erts/emulator/test/process_SUITE.erl | 13 ++++++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index b4b97d7df1..fd02f10540 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -9824,7 +9824,7 @@ erts_internal_request_system_task_3(BIF_ALIST_3)
 	    goto badarg;
 	req_type = tp[1];
 	req_id = tp[2];
-	req_id_sz = is_immed(req_id) ? req_id : size_object(req_id);
+	req_id_sz = is_immed(req_id) ? 0 : size_object(req_id);
 	tot_sz = req_id_sz;
 	for (i = 0; i < ERTS_MAX_PROC_SYS_TASK_ARGS; i++) {
 	    int tix = 3 + i;
diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl
index bf31655066..932d0f87f1 100644
--- a/erts/emulator/test/process_SUITE.erl
+++ b/erts/emulator/test/process_SUITE.erl
@@ -2365,8 +2365,13 @@ system_task_on_suspended(Config) when is_list(Config) ->
     end.
 
 gc_request_when_gc_disabled(Config) when is_list(Config) ->
-    Master = self(),
     AIS = erts_debug:set_internal_state(available_internal_state, true),
+    gc_request_when_gc_disabled_do(ref),
+    gc_request_when_gc_disabled_do(immed),
+    erts_debug:set_internal_state(available_internal_state, AIS).
+
+gc_request_when_gc_disabled_do(ReqIdType) ->
+    Master = self(),
     {P, M} = spawn_opt(fun () ->
 			       true = erts_debug:set_internal_state(gc_state,
 								    false),
@@ -2378,7 +2383,10 @@ gc_request_when_gc_disabled(Config) when is_list(Config) ->
 			       receive after 100 -> ok end
 		       end, [monitor, link]),
     receive {P, gc_state, false} -> ok end,
-    ReqId = make_ref(),
+    ReqId = case ReqIdType of
+                ref -> make_ref();
+                immed -> immed
+            end,
     async = garbage_collect(P, [{async, ReqId}]),
     receive
 	{garbage_collect, ReqId, Result} ->
@@ -2387,7 +2395,6 @@ gc_request_when_gc_disabled(Config) when is_list(Config) ->
 	    ok
     end,
     receive {garbage_collect, ReqId, true} -> ok end,
-    erts_debug:set_internal_state(available_internal_state, AIS),
     receive {'DOWN', M, process, P, _Reason} -> ok end,
     ok.
 
-- 
2.15.1

openSUSE Build Service is sponsored by