[compiler-rt] Formatted approved PR #179000 (PR #196674)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 8 18:06:30 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-compiler-rt-sanitizer
Author: accauble
<details>
<summary>Changes</summary>
PR #<!-- -->179000 was approved by @<!-- -->DanBlackwell and @<!-- -->vitalybuka a few weeks ago but cannot be merged because of formatting issues. The only changes this makes to @<!-- -->ilovepi's code is the formatting.
---
Full diff: https://github.com/llvm/llvm-project/pull/196674.diff
7 Files Affected:
- (modified) compiler-rt/lib/asan/asan_thread.cpp (+2-2)
- (modified) compiler-rt/lib/asan/asan_thread.h (+1)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_common.h (+2-2)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp (+2-2)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp (+8-4)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_win.cpp (+3-2)
- (added) compiler-rt/test/asan/TestCases/Posix/multiple_sigaltstack.cpp (+24)
``````````diff
diff --git a/compiler-rt/lib/asan/asan_thread.cpp b/compiler-rt/lib/asan/asan_thread.cpp
index 32ab723e89001..ec96ec9b8082b 100644
--- a/compiler-rt/lib/asan/asan_thread.cpp
+++ b/compiler-rt/lib/asan/asan_thread.cpp
@@ -132,7 +132,7 @@ void AsanThread::Destroy() {
CHECK_EQ(this, thread);
malloc_storage().CommitBack();
if (common_flags()->use_sigaltstack)
- UnsetAlternateSignalStack();
+ UnsetAlternateSignalStack(altstack_base_);
FlushToDeadThreadStats(&stats_);
// We also clear the shadow on thread destruction because
// some code may still be executing in later TSD destructors
@@ -288,7 +288,7 @@ void AsanThread::ThreadStart(ThreadID os_id) {
asanThreadRegistry().StartThread(tid(), os_id, ThreadType::Regular, nullptr);
if (common_flags()->use_sigaltstack)
- SetAlternateSignalStack();
+ altstack_base_ = SetAlternateSignalStack();
}
AsanThread *CreateMainThread() {
diff --git a/compiler-rt/lib/asan/asan_thread.h b/compiler-rt/lib/asan/asan_thread.h
index e9ca6b6a59016..6dbac7f3d8162 100644
--- a/compiler-rt/lib/asan/asan_thread.h
+++ b/compiler-rt/lib/asan/asan_thread.h
@@ -190,6 +190,7 @@ class AsanThread {
AsanStats stats_;
bool unwinding_;
uptr extra_spill_area_;
+ void* altstack_base_ = nullptr;
char start_data_[];
};
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
index 4dd2187df2272..2aacec1cd8994 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
@@ -387,8 +387,8 @@ void ReportDeadlySignal(const SignalContext &sig, u32 tid,
const void *unwind_context);
// Alternative signal stack (POSIX-only).
-void SetAlternateSignalStack();
-void UnsetAlternateSignalStack();
+void* SetAlternateSignalStack();
+void UnsetAlternateSignalStack(void* altstack_base);
bool IsSignalHandlerFromSanitizer(int signum);
bool SetSignalHandlerFromSanitizer(int signum, bool new_state);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp
index 3c61b60802996..4dc31f4e51efa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_fuchsia.cpp
@@ -93,8 +93,8 @@ void CheckMPROTECT() {}
void PlatformPrepareForSandboxing(void *args) {}
void DisableCoreDumperIfNecessary() {}
void InstallDeadlySignalHandlers(SignalHandlerType handler) {}
-void SetAlternateSignalStack() {}
-void UnsetAlternateSignalStack() {}
+void* SetAlternateSignalStack() { return nullptr; }
+void UnsetAlternateSignalStack(void* altstack_base) {}
bool SignalContext::IsStackOverflow() const { return false; }
void SignalContext::DumpAllRegisters(void *context) { UNIMPLEMENTED(); }
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
index 35b596de30fff..056eb677f0441 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
@@ -188,12 +188,13 @@ static uptr GetAltStackSize() {
return SIGSTKSZ * 4;
}
-void SetAlternateSignalStack() {
+void* SetAlternateSignalStack() {
stack_t altstack, oldstack;
CHECK_EQ(0, sigaltstack(nullptr, &oldstack));
// If the alternate stack is already in place, do nothing.
// Android always sets an alternate stack, but it's too small for us.
- if (!SANITIZER_ANDROID && !(oldstack.ss_flags & SS_DISABLE)) return;
+ if (!SANITIZER_ANDROID && !(oldstack.ss_flags & SS_DISABLE))
+ return nullptr;
// TODO(glider): the mapped stack should have the MAP_STACK flag in the
// future. It is not required by man 2 sigaltstack now (they're using
// malloc()).
@@ -201,15 +202,18 @@ void SetAlternateSignalStack() {
altstack.ss_sp = (char *)MmapOrDie(altstack.ss_size, __func__);
altstack.ss_flags = 0;
CHECK_EQ(0, sigaltstack(&altstack, nullptr));
+ return altstack.ss_sp;
}
-void UnsetAlternateSignalStack() {
+void UnsetAlternateSignalStack(void* altstack_base) {
stack_t altstack, oldstack;
altstack.ss_sp = nullptr;
altstack.ss_flags = SS_DISABLE;
altstack.ss_size = GetAltStackSize(); // Some sane value required on Darwin.
CHECK_EQ(0, sigaltstack(&altstack, &oldstack));
- UnmapOrDie(oldstack.ss_sp, oldstack.ss_size);
+ if (altstack_base && altstack_base == oldstack.ss_sp) {
+ UnmapOrDie(oldstack.ss_sp, oldstack.ss_size);
+ }
}
bool IsSignalHandlerFromSanitizer(int signum) {
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
index ed4f60deeffc8..70f4a936c1329 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
@@ -913,11 +913,12 @@ void ReportFile::Write(const char *buffer, uptr length) {
}
}
-void SetAlternateSignalStack() {
+void* SetAlternateSignalStack() {
// FIXME: Decide what to do on Windows.
+ return nullptr;
}
-void UnsetAlternateSignalStack() {
+void UnsetAlternateSignalStack(void* altstack_base) {
// FIXME: Decide what to do on Windows.
}
diff --git a/compiler-rt/test/asan/TestCases/Posix/multiple_sigaltstack.cpp b/compiler-rt/test/asan/TestCases/Posix/multiple_sigaltstack.cpp
new file mode 100644
index 0000000000000..a7cf4b3a43b91
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/Posix/multiple_sigaltstack.cpp
@@ -0,0 +1,24 @@
+// RUN: %clangxx_asan %s -o %t && %env_asan_opts=use_sigaltstack=1 %run %t
+
+#include <pthread.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char global_alt_stack[4096 * 4];
+
+int main() {
+ stack_t altstack;
+ altstack.ss_sp = global_alt_stack;
+ altstack.ss_size = sizeof(global_alt_stack);
+ altstack.ss_flags = 0;
+ if (sigaltstack(&altstack, nullptr) != 0) {
+ perror("sigaltstack");
+ exit(1);
+ }
+
+ // UnsetAlternateSignalStack will get called when the thread exists. If we
+ // don't *only* unmap a signal stack the runtime owns, we'll get a fault on
+ // the munmap operation, since that memory isn't mmaped.
+ return 0;
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/196674
More information about the llvm-commits
mailing list