diff options
author | Lukas Larsson <[email protected]> | 2016-07-07 20:59:28 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2016-07-08 11:03:05 +0200 |
commit | 53bf2a9593a2f34151016f7d84fad6d213d76ee9 (patch) | |
tree | 1d9215f8f1ed508c89ce46bef50ef579655ff7b0 /erts | |
parent | 0573efbc18fc20f8646cf3ff64d2affd06e03cb8 (diff) | |
download | otp-53bf2a9593a2f34151016f7d84fad6d213d76ee9.tar.gz otp-53bf2a9593a2f34151016f7d84fad6d213d76ee9.tar.bz2 otp-53bf2a9593a2f34151016f7d84fad6d213d76ee9.zip |
erts: Check if return_to trace is enabled for bif
We have to do an extra check if the return_to trace is enabled here
as it may have been cleared by the bif after the flags where
created by the call_trace.
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/beam/beam_bp.c | 3 | ||||
-rw-r--r-- | erts/emulator/test/trace_local_SUITE.erl | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c index 8489897d3a..920c8b1ed0 100644 --- a/erts/emulator/beam/beam_bp.c +++ b/erts/emulator/beam/beam_bp.c @@ -858,7 +858,8 @@ erts_bif_trace(int bif_index, Process* p, Eterm* args, BeamInstr* I) if (flags & MATCH_SET_RX_TRACE) { erts_trace_return(p, ep->code, result, &ERTS_TRACER(p)); } - if (flags & MATCH_SET_RETURN_TO_TRACE) { + if (flags & MATCH_SET_RETURN_TO_TRACE && + IS_TRACED_FL(p, F_TRACE_RETURN_TO)) { /* can only happen if(local)*/ if (applying) { /* Apply of BIF, cp is in calling function */ diff --git a/erts/emulator/test/trace_local_SUITE.erl b/erts/emulator/test/trace_local_SUITE.erl index 74c05f24e0..c297acd78b 100644 --- a/erts/emulator/test/trace_local_SUITE.erl +++ b/erts/emulator/test/trace_local_SUITE.erl @@ -439,6 +439,14 @@ return_test() -> ?RT(?MODULE,slave,2), shutdown(), ?NM, + + %% Test a regression where turning off return_to tracing + %% on yourself would cause a segfault. + Pid = setup([call,return_to]), + erlang:trace_pattern({'_','_','_'},[],[local]), + apply_slave(erlang,trace,[Pid, false, [all]]), + shutdown(), + ok. on_and_off_test() -> |