diff options
author | Sverker Eriksson <[email protected]> | 2017-02-03 15:22:48 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2017-02-03 17:23:35 +0100 |
commit | 3fe6f3c0caecec522c7e14353eda6bbb86c9e8d6 (patch) | |
tree | 29710e0dcc08a4798d61027f2f7762a0fc275ad8 /erts/emulator/beam/beam_load.c | |
parent | 69b928b12d9206d00879c08e46143f599f9dc34e (diff) | |
download | otp-3fe6f3c0caecec522c7e14353eda6bbb86c9e8d6.tar.gz otp-3fe6f3c0caecec522c7e14353eda6bbb86c9e8d6.tar.bz2 otp-3fe6f3c0caecec522c7e14353eda6bbb86c9e8d6.zip |
erts: Add deallocation veto for magic destructors
A magic destructor can return 0 and thereby take control
and prolong the lifetime of a magic binary.
Diffstat (limited to 'erts/emulator/beam/beam_load.c')
-rw-r--r-- | erts/emulator/beam/beam_load.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 309465bcd3..119c004f1f 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -481,7 +481,7 @@ typedef struct LoaderState { static void free_loader_state(Binary* magic); static ErlHeapFragment* new_literal_fragment(Uint size); static void free_literal_fragment(ErlHeapFragment*); -static void loader_state_dtor(Binary* magic); +static int loader_state_dtor(Binary* magic); #ifdef HIPE static Eterm stub_insert_new_code(Process *c_p, ErtsProcLocks c_p_locks, Eterm group_leader, Eterm module, @@ -1012,7 +1012,7 @@ static void free_literal_fragment(ErlHeapFragment* bp) /* * This destructor function can safely be called multiple times. */ -static void +static int loader_state_dtor(Binary* magic) { LoaderState* stp = ERTS_MAGIC_BIN_DATA(magic); @@ -1097,6 +1097,7 @@ loader_state_dtor(Binary* magic) */ ASSERT(stp->genop_blocks == 0); + return 1; } #ifdef HIPE |