diff options
author | Magnus Lång <[email protected]> | 2016-05-23 15:41:31 +0200 |
---|---|---|
committer | Magnus Lång <[email protected]> | 2016-07-06 16:08:20 +0200 |
commit | f0131c58c42a286c8b3f611b47106393a37197b6 (patch) | |
tree | caefc37baef32b065e69f23cc363a83ff70dcd12 /erts/emulator/hipe/hipe_risc_gc.h | |
parent | 3b409021a70427bb2fe3834707edf822b6afce2d (diff) | |
download | otp-f0131c58c42a286c8b3f611b47106393a37197b6.tar.gz otp-f0131c58c42a286c8b3f611b47106393a37197b6.tar.bz2 otp-f0131c58c42a286c8b3f611b47106393a37197b6.zip |
check_process_code: Sweep HiPE stack for literals
Because check_process_code neglected checking the HiPE stack for
references to the literal area, such references would survive the purge
and subsequent deletion of a module and its literal area. These dangling
references would then cause incorrect behaviour or even hard crashes of
the VM.
By simply adding a scan of the HiPE stack to check_process_code and
erts_garbage_collect_literals, this problem is fixed.
In order to support full stack walks without deleting the graylimit
trap, a new stack walking interface function,
nstack_walk_init_sdesc_ignore_trap() was introduced.
Diffstat (limited to 'erts/emulator/hipe/hipe_risc_gc.h')
-rw-r--r-- | erts/emulator/hipe/hipe_risc_gc.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/erts/emulator/hipe/hipe_risc_gc.h b/erts/emulator/hipe/hipe_risc_gc.h index 315f8e7f9f..09568c140e 100644 --- a/erts/emulator/hipe/hipe_risc_gc.h +++ b/erts/emulator/hipe/hipe_risc_gc.h @@ -51,6 +51,19 @@ nstack_walk_init_sdesc(const Process *p, struct nstack_walk_state *state) return sdesc; } +static inline const struct sdesc* +nstack_walk_init_sdesc_ignore_trap(const Process *p, + struct nstack_walk_state *state) +{ + unsigned long ra = (unsigned long)p->hipe.nra; + const struct sdesc *sdesc; + if (ra == (unsigned long)&nbif_stack_trap_ra) + ra = (unsigned long)p->hipe.ngra; + sdesc = hipe_find_sdesc(ra); + state->sdesc0 = sdesc; + return sdesc; +} + static inline void nstack_walk_update_trap(Process *p, const struct sdesc *sdesc0) { Eterm *nsp = p->hipe.nsp; |