diff options
author | Sverker Eriksson <sverker@erlang.org> | 2022-12-19 20:28:19 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2022-12-19 20:44:22 +0100 |
commit | ad107da8e996ac8040b87fa235df2e39c5828454 (patch) | |
tree | 8ec075cc33ce37e25fe871fbdc61d1238e8fd921 | |
parent | 4ddc5d1126fff0bc583c435c7a84855c1a23d9f8 (diff) | |
parent | 9699a899912651f38d563020211f1e7a98d04294 (diff) | |
download | erlang-ad107da8e996ac8040b87fa235df2e39c5828454.tar.gz |
Merge branch 'sverker/erts/reject-nif-resource-after-load'
OTP-18369
-rw-r--r-- | erts/emulator/beam/erl_nif.c | 4 | ||||
-rw-r--r-- | erts/emulator/test/nif_SUITE.erl | 8 | ||||
-rw-r--r-- | erts/emulator/test/nif_SUITE_data/nif_SUITE.c | 23 |
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) |