diff options
author | Alexey Samsonov <samsonov@google.com> | 2014-05-07 21:23:12 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2014-05-07 21:23:12 +0000 |
commit | 2fccdfbe70c95aa4e010d77c2d19fa5e0deb5d2e (patch) | |
tree | cf16b0b4e3bcb9b0f138ccbfecc96f466740a881 | |
parent | df6860279eff4c4558e8d8ef73920ce0ac002a79 (diff) | |
download | bcm5719-llvm-2fccdfbe70c95aa4e010d77c2d19fa5e0deb5d2e.tar.gz bcm5719-llvm-2fccdfbe70c95aa4e010d77c2d19fa5e0deb5d2e.zip |
[MSan] Fixup for r206983: MsanThread may be unavailable in signal handler: signals may be raised while thread is being destroyed
llvm-svn: 208250
-rw-r--r-- | compiler-rt/lib/msan/msan.cc | 3 | ||||
-rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cc | 10 |
2 files changed, 10 insertions, 3 deletions
diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index cb3498ef847..60004a133de 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -237,7 +237,8 @@ const char *GetOriginDescrIfStack(u32 id, uptr *pc) { } u32 ChainOrigin(u32 id, StackTrace *stack) { - if (GetCurrentThread()->InSignalHandler()) + MsanThread *t = GetCurrentThread(); + if (t && t->InSignalHandler()) return id; uptr idx = Min(stack->size, kStackTraceMax - 1); stack->trace[idx] = TRACE_MAKE_CHAINED(id); diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index e71c4045854..65acf0d3e1c 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -982,8 +982,14 @@ INTERCEPTOR(int, getrusage, int who, void *usage) { class SignalHandlerScope { public: - SignalHandlerScope() { GetCurrentThread()->EnterSignalHandler(); } - ~SignalHandlerScope() { GetCurrentThread()->LeaveSignalHandler(); } + SignalHandlerScope() { + if (MsanThread *t = GetCurrentThread()) + t->EnterSignalHandler(); + } + ~SignalHandlerScope() { + if (MsanThread *t = GetCurrentThread()) + t->LeaveSignalHandler(); + } }; // sigactions_mu guarantees atomicity of sigaction() and signal() calls. |