summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxim Ostapenko <m.ostapenko@partner.samsung.com>2016-05-06 07:09:22 +0000
committerMaxim Ostapenko <m.ostapenko@partner.samsung.com>2016-05-06 07:09:22 +0000
commit6dccd5bc1f35a15403dd9b1f1f9ccc75d5394a2f (patch)
tree5f12a04fa8ef48dd4e5d71ff2d316a45932dffed
parentc6b36698844d76ed5baf66361f28bfb8f59c3335 (diff)
downloadbcm5719-llvm-6dccd5bc1f35a15403dd9b1f1f9ccc75d5394a2f.tar.gz
bcm5719-llvm-6dccd5bc1f35a15403dd9b1f1f9ccc75d5394a2f.zip
[asan] Bail out on stack overflow in recovery mode.
In recovery mode, when ASan detects stack overflow (say, when infinite recursion detected), it tries to continue program execution and hangs on repetitive error reports. There isn't any sense to do it, we can just bail out on stack overflow error, because the program would crash soon anyway. Differential Revision: http://reviews.llvm.org/D19958 llvm-svn: 268713
-rw-r--r--compiler-rt/lib/asan/asan_report.cc2
-rw-r--r--compiler-rt/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc36
2 files changed, 37 insertions, 1 deletions
diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc
index 568d06bb1e5..15817e3a659 100644
--- a/compiler-rt/lib/asan/asan_report.cc
+++ b/compiler-rt/lib/asan/asan_report.cc
@@ -739,7 +739,7 @@ StaticSpinMutex ScopedInErrorReport::lock_;
u32 ScopedInErrorReport::reporting_thread_tid_;
void ReportStackOverflow(const SignalContext &sig) {
- ScopedInErrorReport in_report;
+ ScopedInErrorReport in_report(/*report*/ nullptr, /*fatal*/ true);
Decorator d;
Printf("%s", d.Warning());
Report(
diff --git a/compiler-rt/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc b/compiler-rt/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc
new file mode 100644
index 00000000000..e9966595378
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc
@@ -0,0 +1,36 @@
+// Test that ASan doesn't hang on stack overflow in recovery mode.
+//
+// RUN: %clang_asan -O0 -fsanitize-recover=address %s -o %t
+// RUN: %env_asan_opts=halt_on_error=false not %run %t 2>&1 | FileCheck %s
+
+#include <assert.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/resource.h>
+
+static volatile int *recurse(volatile int n, volatile int *p) {
+ // CHECK: {{stack-overflow on address 0x.* \(pc 0x.* bp 0x.* sp 0x.* T.*\)}}
+ if (n >= 0) *recurse(n + 1, p) += n;
+ return p;
+}
+
+
+void LimitStackAndReexec(int argc, char **argv) {
+ struct rlimit rlim;
+ int res = getrlimit(RLIMIT_STACK, &rlim);
+ assert(res == 0);
+ if (rlim.rlim_cur == RLIM_INFINITY) {
+ rlim.rlim_cur = 256 * 1024;
+ res = setrlimit(RLIMIT_STACK, &rlim);
+ assert(res == 0);
+
+ execv(argv[0], argv);
+ assert(0 && "unreachable");
+ }
+}
+
+int main(int argc, char **argv) {
+ LimitStackAndReexec(argc, argv);
+ volatile int res;
+ return *recurse(argc + 1, &res);
+}
OpenPOWER on IntegriCloud