Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang
erlang
2091-erts-Make-enif_init-open_resource_type-fai...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2091-erts-Make-enif_init-open_resource_type-fail-outside-.patch of Package erlang
From 9699a899912651f38d563020211f1e7a98d04294 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson <sverker@erlang.org> Date: Thu, 24 Nov 2022 23:00:29 +0100 Subject: [PATCH] erts: Make enif_init/open_resource_type fail outside load/upgrade A controlled fail instead of strange behavior. --- erts/emulator/beam/erl_nif.c | 4 ++++ erts/emulator/test/nif_SUITE.erl | 8 +++++++ erts/emulator/test/nif_SUITE_data/nif_SUITE.c | 23 ++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index fb4ffc003f..ce440f2a16 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 26c897c406..31272a5d42 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) -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor