summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2022-12-19 20:28:19 +0100
committerSverker Eriksson <sverker@erlang.org>2022-12-19 20:44:22 +0100
commitad107da8e996ac8040b87fa235df2e39c5828454 (patch)
tree8ec075cc33ce37e25fe871fbdc61d1238e8fd921
parent4ddc5d1126fff0bc583c435c7a84855c1a23d9f8 (diff)
parent9699a899912651f38d563020211f1e7a98d04294 (diff)
downloaderlang-ad107da8e996ac8040b87fa235df2e39c5828454.tar.gz
Merge branch 'sverker/erts/reject-nif-resource-after-load'
OTP-18369
-rw-r--r--erts/emulator/beam/erl_nif.c4
-rw-r--r--erts/emulator/test/nif_SUITE.erl8
-rw-r--r--erts/emulator/test/nif_SUITE_data/nif_SUITE.c23
3 files changed, 34 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index da448ec925..081415eaf2 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -2579,6 +2579,9 @@ ErlNifResourceType* open_resource_type(ErlNifEnv* env,
ErlNifResourceFlags op = flags;
Eterm module_am, name_am;
+ if (!env->mod_nif || !(env->mod_nif->flags & ERTS_MOD_NIF_FLG_LOADING))
+ goto done;
+
ERTS_LC_ASSERT(erts_has_code_mod_permission());
module_am = make_atom(env->mod_nif->mod->module);
name_am = enif_make_atom(env, name_str);
@@ -2635,6 +2638,7 @@ ErlNifResourceType* open_resource_type(ErlNifEnv* env,
ort->next = opened_rt_list;
opened_rt_list = ort;
}
+done:
if (tried != NULL) {
*tried = op;
}
diff --git a/erts/emulator/test/nif_SUITE.erl b/erts/emulator/test/nif_SUITE.erl
index fda41fbd67..359646ca5c 100644
--- a/erts/emulator/test/nif_SUITE.erl
+++ b/erts/emulator/test/nif_SUITE.erl
@@ -104,6 +104,7 @@
tuple_2_list_and_tuple/1,
iolist_2_bin/1,
get_resource_type/1,
+ init_resource_type/2,
alloc_resource/2,
make_resource/1,
get_resource/2,
@@ -2153,6 +2154,12 @@ resource_neg_do(TypeA) ->
ResB= make_new_resource(TypeB, <<"Bobo">>),
{'EXIT',{badarg,_}} = (catch get_resource(TypeA, ResB)),
{'EXIT',{badarg,_}} = (catch get_resource(TypeB, ResA)),
+
+ %% Test init_resource_type fail outside load/upgrade
+ {0, ?RT_CREATE} = init_resource_type("in_vain", ?RT_CREATE),
+ {0, ?RT_TAKEOVER} = init_resource_type("Gold", ?RT_TAKEOVER),
+ {0, ?RT_CREATE bor ?RT_TAKEOVER} =
+ init_resource_type("Gold", ?RT_CREATE bor ?RT_TAKEOVER),
ok.
%% Test enif_make_resource_binary
@@ -4281,6 +4288,7 @@ macros(_) -> ?nif_stub.
tuple_2_list_and_tuple(_) -> ?nif_stub.
iolist_2_bin(_) -> ?nif_stub.
get_resource_type(_) -> ?nif_stub.
+init_resource_type(_,_) -> ?nif_stub.
alloc_resource(_,_) -> ?nif_stub.
make_resource(_) -> ?nif_stub.
get_resource(_,_) -> ?nif_stub.
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
index df2025e9df..897d8baf2a 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
+++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
@@ -932,6 +932,27 @@ static ERL_NIF_TERM get_resource_type(ErlNifEnv* env, int argc, const ERL_NIF_TE
return make_pointer(env, data->rt_arr[ix].vp);
}
+static ERL_NIF_TERM init_resource_type(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+ char name[20];
+ int flags;
+ ErlNifResourceTypeInit init;
+ ErlNifResourceType* ret_ptr;
+ ErlNifResourceFlags tried;
+
+ if (0 >= enif_get_string(env, argv[0], name, sizeof(name), ERL_NIF_UTF8) ||
+ !enif_get_int(env, argv[1], &flags)) {
+ return enif_make_badarg(env);
+ }
+ /* Should fail as we are not in load/upgrade callback */
+ init.members = 0;
+ ret_ptr = enif_init_resource_type(env, name, &init,
+ (ErlNifResourceFlags)flags, &tried);
+
+ return enif_make_tuple2(env, enif_make_uint64(env, (ErlNifUInt64)ret_ptr),
+ enif_make_int(env, (int)tried));
+}
+
static ERL_NIF_TERM alloc_resource(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary data_bin;
@@ -3798,6 +3819,7 @@ static ErlNifFunc nif_funcs[] =
{"tuple_2_list_and_tuple",1,tuple_2_list_and_tuple},
{"iolist_2_bin", 1, iolist_2_bin},
{"get_resource_type", 1, get_resource_type},
+ {"init_resource_type", 2, init_resource_type},
{"alloc_resource", 2, alloc_resource},
{"make_resource", 1, make_resource},
{"get_resource", 2, get_resource},
@@ -3890,7 +3912,6 @@ static ErlNifFunc nif_funcs[] =
{"compare_pids_nif", 2, compare_pids_nif},
{"term_type_nif", 1, term_type_nif},
{"msa_find_y_nif", 1, msa_find_y_nif}
-
};
ERL_NIF_INIT(nif_SUITE,nif_funcs,load,NULL,upgrade,unload)