File 1133-erts-Fix-potential-lock-order-conflict-in-NIF-monito.patch of Package erlang
From 520edad65567eb03cd170135cbddaf440d64983d Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 28 Oct 2024 20:00:26 +0100
Subject: [PATCH] erts: Fix potential lock order conflict in NIF monitor down
callbacks
by releasing main lock of the exiting process.
---
erts/emulator/beam/erl_process.c | 2 ++
erts/emulator/test/nif_SUITE_data/nif_SUITE.c | 10 ++++++++++
2 files changed, 12 insertions(+)
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index c2ca5a03f3..6c95146f60 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -13483,7 +13483,9 @@ erts_proc_exit_handle_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
break;
}
case ERTS_MON_TYPE_RESOURCE:
+ erts_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN);
erts_fire_nif_monitor(mon);
+ erts_proc_lock(c_p, ERTS_PROC_LOCK_MAIN);
mon = NULL;
break;
case ERTS_MON_TYPE_DIST_PORT:
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
index 7a47c2ea99..e8e485a32c 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
+++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
@@ -2855,6 +2855,16 @@ static void monitor_resource_down(ErlNifEnv* env, void* obj, ErlNifPid* pid,
enif_send(env, &rsrc->receiver, msg_env, msg);
if (msg_env)
enif_free_env(msg_env);
+
+ /* OTP-19330 GH-8983:
+ * Verify calling enif_whereis_pid/port in down callback
+ * without lock order violation. */
+ {
+ ErlNifPid pid;
+ ErlNifPid port;
+ enif_whereis_pid(env, atom_null, &pid);
+ enif_whereis_port(env, atom_null, &port);
+ }
}
static ERL_NIF_TERM alloc_monitor_resource_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
--
2.43.0