File 1012-Fix-unsafe-access-to-process-struct-from-dirty-sched.patch of Package erlang
From 02b10a31a01e0e3f67a9a35355378d97535eb86a Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Thu, 2 Oct 2025 16:49:40 +0200
Subject: [PATCH 2/3] Fix unsafe access to process struct from dirty sched
---
erts/emulator/beam/erl_proc_sig_queue.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/erts/emulator/beam/erl_proc_sig_queue.c b/erts/emulator/beam/erl_proc_sig_queue.c
index 74bbb0558c..d77c6c1664 100644
--- a/erts/emulator/beam/erl_proc_sig_queue.c
+++ b/erts/emulator/beam/erl_proc_sig_queue.c
@@ -5086,6 +5086,7 @@ sync_suspend_reply(Process *c_p, ErtsMessage *mp, erts_aint32_t state)
*/
Process *rp;
ErtsSyncSuspendRequest *ssusp;
+ int is_managed;
ssusp = (ErtsSyncSuspendRequest *) (char *) (&mp->hfrag.mem[0]
+ mp->hfrag.used_size);
@@ -5105,7 +5106,10 @@ sync_suspend_reply(Process *c_p, ErtsMessage *mp, erts_aint32_t state)
mp->data.attached = ERTS_MSG_COMBINED_HFRAG;
mp->next = NULL;
- rp = erts_proc_lookup(ssusp->requester);
+ is_managed = erts_thr_progress_is_managed_thread();
+ rp = (is_managed
+ ? erts_proc_lookup(ssusp->requester)
+ : erts_proc_lookup_inc_refc(ssusp->requester));
if (!rp)
erts_cleanup_messages(mp);
else {
@@ -5124,6 +5128,8 @@ sync_suspend_reply(Process *c_p, ErtsMessage *mp, erts_aint32_t state)
}
ERL_MESSAGE_TOKEN(mp) = am_undefined;
erts_queue_proc_message(c_p, rp, 0, mp, ssusp->message);
+ if (!is_managed)
+ erts_proc_dec_refc(rp);
}
}
--
2.51.0