File 0412-erts-Assert-enif_schedule_nif-1st-argument-is-proces.patch of Package erlang
From 461dad8e28b741ea85cece8aa2862c0c8637ecf1 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 8 Feb 2021 17:32:32 +0100
Subject: [PATCH 12/34] erts: Assert enif_schedule_nif 1st argument is process
env
---
erts/doc/src/erl_nif.xml | 16 ++++++++++++----
erts/emulator/beam/erl_nif.c | 5 +++++
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/erts/doc/src/erl_nif.xml b/erts/doc/src/erl_nif.xml
index d2a1581e35..8797034623 100644
--- a/erts/doc/src/erl_nif.xml
+++ b/erts/doc/src/erl_nif.xml
@@ -3061,10 +3061,11 @@ enif_map_iterator_destroy(env, &iter);</code>
</func>
<func>
- <name since="OTP 17.3"><ret>ERL_NIF_TERM</ret><nametext>enif_schedule_nif(ErlNifEnv* env,
- const char* fun_name, int flags, ERL_NIF_TERM (*fp)(ErlNifEnv* env, int
- argc, const ERL_NIF_TERM argv[]), int argc, const ERL_NIF_TERM
- argv[])</nametext></name>
+ <name since="OTP 17.3"><ret>ERL_NIF_TERM</ret><nametext>enif_schedule_nif(
+ ErlNifEnv* caller_env, const char* fun_name, int flags,
+ ERL_NIF_TERM (*fp)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]),
+ int argc, const ERL_NIF_TERM argv[])</nametext>
+ </name>
<fsummary>Schedule a NIF for execution.</fsummary>
<desc>
<p>Schedules NIF <c>fp</c> to execute. This function allows an
@@ -3072,6 +3073,13 @@ enif_map_iterator_destroy(env, &iter);</code>
calls or to schedule a <seecref marker="#dirty_nifs">
dirty NIF</seecref> to execute on a dirty scheduler thread.</p>
<taglist>
+ <tag><c>caller_env</c></tag>
+ <item>
+ <p>
+ Must be <seecref marker="#proc_bound_env">process bound</seecref>
+ environment of the calling NIF.
+ </p>
+ </item>
<tag><c>fun_name</c></tag>
<item>
<p>Provides a name for the NIF that is scheduled for execution.
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index 9b825c4739..357dd3658d 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -337,6 +337,8 @@ schedule(ErlNifEnv* env, NativeFunPtr direct_fp, NativeFunPtr indirect_fp,
Process *c_p, *dirty_shadow_proc;
execution_state(env, &c_p, NULL);
+ ASSERT(c_p);
+
if (c_p == env->proc)
dirty_shadow_proc = NULL;
else
@@ -3064,6 +3066,7 @@ static_schedule_dirty_nif(ErlNifEnv* env, erts_aint32_t dirty_psflg,
NativeFunPtr fp;
execution_state(env, &proc, NULL);
+ ASSERT(proc);
/*
* Called in order to schedule statically determined
@@ -3170,6 +3173,8 @@ enif_schedule_nif(ErlNifEnv* env, const char* fun_name, int flags,
return fun_name_atom;
execution_state(env, &proc, &scheduler);
+ ASSERT(proc);
+
if (scheduler <= 0) {
if (scheduler == 0)
enif_make_badarg(env);
--
2.26.2