aboutsummaryrefslogtreecommitdiff
path: root/compiler-rt/test/fuzzer/StackOverflowTest.cpp
diff options
context:
space:
mode:
authorSebastian Poeplau <poeplau@code-intelligence.com>2021-05-07 08:00:33 -0700
committerMatt Morehouse <mascasa@google.com>2021-05-07 08:18:28 -0700
commit70cbc6dbef7048d3b1aa89a676d96c6ba075b41b (patch)
tree663a81451267ef2a911d6245996b460bf2e814d2 /compiler-rt/test/fuzzer/StackOverflowTest.cpp
parenta970e69d6b62d60c4c222e2a4be0a73999c97651 (diff)
downloadllvm-70cbc6dbef7048d3b1aa89a676d96c6ba075b41b.zip
llvm-70cbc6dbef7048d3b1aa89a676d96c6ba075b41b.tar.gz
llvm-70cbc6dbef7048d3b1aa89a676d96c6ba075b41b.tar.bz2
[libFuzzer] Fix stack overflow detection
Address sanitizer can detect stack exhaustion via its SEGV handler, which is executed on a separate stack using the sigaltstack mechanism. When libFuzzer is used with address sanitizer, it installs its own signal handlers which defer to those put in place by the sanitizer before performing additional actions. In the particular case of a stack overflow, the current setup fails because libFuzzer doesn't preserve the flag for executing the signal handler on a separate stack: when we run out of stack space, the operating system can't run the SEGV handler, so address sanitizer never reports the issue. See the included test for an example. This commit fixes the issue by making libFuzzer preserve the SA_ONSTACK flag when installing its signal handlers; the dedicated signal-handler stack set up by the sanitizer runtime appears to be large enough to support the additional frames from the fuzzer. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D101824
Diffstat (limited to 'compiler-rt/test/fuzzer/StackOverflowTest.cpp')
-rw-r--r--compiler-rt/test/fuzzer/StackOverflowTest.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/compiler-rt/test/fuzzer/StackOverflowTest.cpp b/compiler-rt/test/fuzzer/StackOverflowTest.cpp
new file mode 100644
index 0000000..c8d8984
--- /dev/null
+++ b/compiler-rt/test/fuzzer/StackOverflowTest.cpp
@@ -0,0 +1,26 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Stack overflow test for a fuzzer. The fuzzer must find the string "Hi" and
+// cause a stack overflow.
+#include <cstddef>
+#include <cstdint>
+
+volatile int x;
+volatile int y = 1;
+
+int infinite_recursion(char *p) {
+ char *buf = nullptr;
+
+ if (y)
+ infinite_recursion(buf);
+
+ x = 1;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+ if (Size >= 2 && Data[0] == 'H' && Data[1] == 'i')
+ infinite_recursion(nullptr);
+ return 0;
+}