Skip to content

Commit 15d7e60

Browse files
committedSep 22, 2017
[lsan] Deadly signal handler for lsan
Summary: Part of google/sanitizers#637 Reviewers: eugenis, alekseyshl Subscribers: llvm-commits, dberris, kubamracek, krytarowski Differential Revision: https://reviews.llvm.org/D37608 llvm-svn: 314041
1 parent a33e156 commit 15d7e60

File tree

11 files changed

+47
-10
lines changed

11 files changed

+47
-10
lines changed
 

‎compiler-rt/lib/lsan/lsan.cc

+13
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ static void InitializeFlags() {
6565
if (common_flags()->help) parser.PrintFlagDescriptions();
6666
}
6767

68+
static void OnStackUnwind(const SignalContext &sig, const void *,
69+
BufferedStackTrace *stack) {
70+
GetStackTraceWithPcBpAndContext(stack, kStackTraceMax, sig.pc, sig.bp,
71+
sig.context,
72+
common_flags()->fast_unwind_on_fatal);
73+
}
74+
75+
void LsanOnDeadlySignal(int signo, void *siginfo, void *context) {
76+
HandleDeadlySignal(siginfo, context, GetCurrentThread(), &OnStackUnwind,
77+
nullptr);
78+
}
79+
6880
extern "C" void __lsan_init() {
6981
CHECK(!lsan_init_is_running);
7082
if (lsan_inited)
@@ -80,6 +92,7 @@ extern "C" void __lsan_init() {
8092
InitTlsSize();
8193
InitializeInterceptors();
8294
InitializeThreadRegistry();
95+
InstallDeadlySignalHandlers(LsanOnDeadlySignal);
8396
u32 tid = ThreadCreate(0, 0, true);
8497
CHECK_EQ(tid, 0);
8598
ThreadStart(tid, GetTid());

‎compiler-rt/lib/lsan/lsan_interceptors.cc

+5
Original file line numberDiff line numberDiff line change
@@ -401,9 +401,14 @@ INTERCEPTOR(void, _exit, int status) {
401401
REAL(_exit)(status);
402402
}
403403

404+
#define COMMON_INTERCEPT_FUNCTION(name) INTERCEPT_FUNCTION(name)
405+
#include "sanitizer_common/sanitizer_signal_interceptors.inc"
406+
404407
namespace __lsan {
405408

406409
void InitializeInterceptors() {
410+
InitializeSignalInterceptors();
411+
407412
INTERCEPT_FUNCTION(malloc);
408413
INTERCEPT_FUNCTION(free);
409414
LSAN_MAYBE_INTERCEPT_CFREE;

‎compiler-rt/lib/sanitizer_common/sanitizer_common.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,24 @@ void SetSoftRssLimitExceededCallback(void (*Callback)(bool exceeded));
318318
typedef void (*SignalHandlerType)(int, void *, void *);
319319
HandleSignalMode GetHandleSignalMode(int signum);
320320
void InstallDeadlySignalHandlers(SignalHandlerType handler);
321+
321322
// Signal reporting.
322-
void StartReportDeadlySignal();
323323
// Each sanitizer uses slightly different implementation of stack unwinding.
324324
typedef void (*UnwindSignalStackCallbackType)(const SignalContext &sig,
325325
const void *callback_context,
326326
BufferedStackTrace *stack);
327+
// Print deadly signal report and die.
328+
void HandleDeadlySignal(void *siginfo, void *context, u32 tid,
329+
UnwindSignalStackCallbackType unwind,
330+
const void *unwind_context);
331+
332+
// Part of HandleDeadlySignal, exposed for asan.
333+
void StartReportDeadlySignal();
334+
// Part of HandleDeadlySignal, exposed for asan.
327335
void ReportDeadlySignal(const SignalContext &sig, u32 tid,
328336
UnwindSignalStackCallbackType unwind,
329337
const void *unwind_context);
338+
330339
// Alternative signal stack (POSIX-only).
331340
void SetAlternateSignalStack();
332341
void UnsetAlternateSignalStack();

‎compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cc

+12
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,18 @@ void ReportDeadlySignal(const SignalContext &sig, u32 tid,
254254
else
255255
ReportDeadlySignalImpl(sig, tid, unwind, unwind_context);
256256
}
257+
258+
void HandleDeadlySignal(void *siginfo, void *context, u32 tid,
259+
UnwindSignalStackCallbackType unwind,
260+
const void *unwind_context) {
261+
StartReportDeadlySignal();
262+
ScopedErrorReportLock rl;
263+
SignalContext sig(siginfo, context);
264+
ReportDeadlySignal(sig, tid, unwind, unwind_context);
265+
Report("ABORTING\n");
266+
Die();
267+
}
268+
257269
#endif // !SANITIZER_FUCHSIA && !SANITIZER_GO
258270

259271
void WriteToSyslog(const char *msg) {

‎compiler-rt/test/sanitizer_common/TestCases/Linux/allow_user_segv.cc

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
// clang-format on
1919

2020
// Remove when fixed: https://github.com/google/sanitizers/issues/637
21-
// XFAIL: lsan
2221
// XFAIL: msan
2322
// XFAIL: tsan
2423
// XFAIL: ubsan

‎compiler-rt/test/sanitizer_common/TestCases/Linux/assert.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
// RUN: %env_tool_opts=handle_abort=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK1 %s
88
// clang-format on
99

10-
// FIXME: implement in other sanitizers, not just asan.
10+
// FIXME: implement in other sanitizers.
1111
// XFAIL: msan
12-
// XFAIL: lsan
1312
// XFAIL: tsan
1413
// XFAIL: ubsan
14+
1515
#include <assert.h>
1616
#include <stdio.h>
1717
#include <sanitizer/asan_interface.h>

‎compiler-rt/test/sanitizer_common/TestCases/Linux/ill.cc

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
// RUN: %env_tool_opts=handle_sigill=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK1 %s
88
// clang-format on
99

10-
// FIXME: implement in other sanitizers, not just asan.
10+
// FIXME: implement in other sanitizers.
1111
// XFAIL: msan
12-
// XFAIL: lsan
1312
// XFAIL: tsan
1413
// XFAIL: ubsan
1514
//

‎compiler-rt/test/sanitizer_common/TestCases/Posix/dedup_token_length_test.cc

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// REQUIRES: stable-runtime
1010
// FIXME: implement SEGV handler in other sanitizers, not just asan.
1111
// XFAIL: msan
12-
// XFAIL: lsan
1312
// XFAIL: tsan
1413
// XFAIL: ubsan
1514

‎compiler-rt/test/sanitizer_common/TestCases/Posix/dump_instruction_bytes.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
// clang-format on
99

1010
// REQUIRES: x86-target-arch
11-
// XFAIL: lsan, msan, tsan, ubsan
11+
// FIXME: implement in other sanitizers.
12+
// XFAIL: msan
13+
// XFAIL: tsan
14+
// XFAIL: ubsan
1215

1316
int main() {
1417
#if defined(__x86_64__)

‎compiler-rt/test/sanitizer_common/TestCases/Posix/fpe.cc

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// RUN: %env_tool_opts=handle_sigfpe=1 not %run %t 2>&1 | FileCheck --check-prefix=CHECK1 %s
66
// FIXME: implement in other sanitizers, not just asan.
77
// XFAIL: msan
8-
// XFAIL: lsan
98
// XFAIL: tsan
109
// XFAIL: ubsan
1110
//

‎compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_set_report_fd_test.cc

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// XFAIL: android && i386-target-arch && asan
99
// FIXME: implement SEGV handler in other sanitizers, not just asan.
1010
// XFAIL: msan
11-
// XFAIL: lsan
1211
// XFAIL: tsan
1312
// XFAIL: ubsan
1413

0 commit comments

Comments
 (0)
Please sign in to comment.