summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-09-17 09:14:11 +0000
committerAlexey Samsonov <samsonov@google.com>2012-09-17 09:14:11 +0000
commit3b339c923b4eefa6a58a349c1a7a1d279612215e (patch)
tree455e687ac8c9126fb8da626c969bf565c9e87e24 /lib
parentd7e5bb4043adf4756e6f8cfe0f5a3165b185474d (diff)
[TSan] If we detect an unlimited stack, try to re-exec with limited stack
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@164021 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/tsan/rtl/tsan_platform_linux.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc
index 4a9172d84..eaaf96e21 100644
--- a/lib/tsan/rtl/tsan_platform_linux.cc
+++ b/lib/tsan/rtl/tsan_platform_linux.cc
@@ -202,6 +202,17 @@ const char *InitializePlatform() {
lim.rlim_max = 0;
setrlimit(RLIMIT_CORE, (rlimit*)&lim);
}
+ // TSan doesn't play well with unlimited stack size (as stack
+ // overlaps with shadow memory). If we detect unlimited stack size,
+ // we re-exec the program with limited stack size as a best effort.
+ if (StackSizeIsUnlimited()) {
+ const uptr kMaxStackSize = 32 * 1024 * 1024; // 32 Mb
+ Report("WARNING: Program is run with unlimited stack size, which "
+ "wouldn't work with ThreadSanitizer.\n");
+ Report("Re-execing with stack size limited to %zd bytes.\n", kMaxStackSize);
+ SetStackSizeLimitInBytes(kMaxStackSize);
+ ReExec();
+ }
#ifndef TSAN_GO
CheckPIE();