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, &amp;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, &amp;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

openSUSE Build Service is sponsored by