File 2102-erts-Include-argument-list-on-badarg-in-fixed_apply.patch of Package erlang

From 8473827449cfb8de65709278b4a23bb1577b6a0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Thu, 21 Mar 2019 14:52:10 +0100
Subject: [PATCH] erts: Include argument list on badarg in fixed_apply

---
 erts/emulator/beam/beam_emu.c    | 14 +++++++++-----
 erts/emulator/test/bif_SUITE.erl | 22 ++++++++++++++++++++--
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 04a2a83123..d68d021679 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -2326,12 +2326,16 @@ fixed_apply(Process* p, Eterm* reg, Uint arity,
     function = reg[arity+1];
 
     if (is_not_atom(function)) {
+        Eterm bad_args;
     error:
-	p->freason = BADARG;
-	reg[0] = module;
-	reg[1] = function;
-	reg[2] = NIL;
-	return 0;
+        bad_args = make_arglist(p, reg, arity);
+
+        p->freason = BADARG;
+        reg[0] = module;
+        reg[1] = function;
+        reg[2] = bad_args;
+
+        return 0;
     }
 
     /* The module argument may be either an atom or an abstract module
diff --git a/erts/emulator/test/bif_SUITE.erl b/erts/emulator/test/bif_SUITE.erl
index 3eedf2f6a6..43975d1800 100644
--- a/erts/emulator/test/bif_SUITE.erl
+++ b/erts/emulator/test/bif_SUITE.erl
@@ -38,7 +38,8 @@
          is_process_alive/1,
          process_info_blast/1,
          os_env_case_sensitivity/1,
-         test_length/1]).
+         test_length/1,
+         fixed_apply_badarg/1]).
 
 suite() ->
     [{ct_hooks,[ts_install_cth]},
@@ -54,7 +55,7 @@ all() ->
      error_stacktrace, error_stacktrace_during_call_trace,
      group_leader_prio, group_leader_prio_dirty,
      is_process_alive, process_info_blast, os_env_case_sensitivity,
-     test_length].
+     test_length,fixed_apply_badarg].
 
 init_per_testcase(guard_bifs_in_erl_bif_types, Config) when is_list(Config) ->
     skip_missing_erl_bif_types(Config);
@@ -1230,6 +1231,23 @@ test_length(I, N, Inc, Good, Bad) when I < N ->
                 lists:reverse(IncSeq, Bad));
 test_length(_, _, _, _, _) -> ok.
 
+%% apply/3 with a fixed number of arguments didn't include all arguments on
+%% badarg exceptions.
+fixed_apply_badarg(Config) when is_list(Config) ->
+    Bad = id({}),
+
+    {'EXIT',{badarg, [{erlang,apply,[{},baz,[a,b]],[]} | _]}} =
+        (catch Bad:baz(a,b)),
+    {'EXIT',{badarg, [{erlang,apply,[baz,{},[c,d]],[]} | _]}} =
+        (catch baz:Bad(c,d)),
+
+    {'EXIT',{badarg, [{erlang,apply,[{},baz,[e,f]],[]} | _]}} =
+        (catch apply(Bad,baz,[e,f])),
+    {'EXIT',{badarg, [{erlang,apply,[baz,{},[g,h]],[]} | _]}} =
+        (catch apply(baz,Bad,[g,h])),
+
+    ok.
+
 %% helpers
     
 id(I) -> I.
-- 
2.16.4

openSUSE Build Service is sponsored by