mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-28 00:24:18 +00:00
e10ea9608a
This should fix a few broken cc-wrapper tests that also check for libasan[1][2][3]: [...] checking whether sanitizers are fully functional... ==243==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22) [...] The underlying issue is that `SIGSTKSZ` isn't a compile-time constant anymore, but in this case the uninitialized `kAltStackSize` was initialized early enough to evalute to `0`[4]. The issue is already fixed in gcc11 and there's GCC 8.5 which also contains the patch, however the backports to v9 and v10 aren't released yet, so we have to apply patches on our own here. For GCC 7.5 I applied the patch from gcc8 as it doesn't seem as if there's an official upstream backport. [1] https://hydra.nixos.org/build/163102264 [2] https://hydra.nixos.org/build/163624687 [3] https://hydra.nixos.org/build/163619227 [4] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100114
71 lines
2.8 KiB
Diff
71 lines
2.8 KiB
Diff
From ef195a39d0d3b929cc676302d074b42c25460601 Mon Sep 17 00:00:00 2001
|
|
From: Jakub Jelinek <jakub@redhat.com>
|
|
Date: Sat, 17 Apr 2021 11:27:14 +0200
|
|
Subject: [PATCH] sanitizer: Fix asan against glibc 2.34 [PR100114]
|
|
|
|
As mentioned in the PR, SIGSTKSZ is no longer a compile time constant in
|
|
glibc 2.34 and later, so
|
|
static const uptr kAltStackSize = SIGSTKSZ * 4;
|
|
needs dynamic initialization, but is used by a function called indirectly
|
|
from .preinit_array and therefore before the variable is constructed.
|
|
This results in using 0 size instead and all asan instrumented programs
|
|
die with:
|
|
==91==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
|
|
|
|
Here is a cherry-pick from upstream to fix this.
|
|
|
|
2021-04-17 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
PR sanitizer/100114
|
|
* sanitizer_common/sanitizer_posix_libcdep.cc: Cherry-pick
|
|
llvm-project revisions 82150606fb11d28813ae6da1101f5bda638165fe
|
|
and b93629dd335ffee2fc4b9b619bf86c3f9e6b0023.
|
|
|
|
(cherry picked from commit 950bac27d63c1c2ac3a6ed867692d6a13f21feb3)
|
|
---
|
|
.../sanitizer_common/sanitizer_posix_libcdep.cc | 13 ++++++++-----
|
|
1 file changed, 8 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc
|
|
index 1a37118c299..066079b3954 100644
|
|
--- a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc
|
|
+++ b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc
|
|
@@ -159,7 +159,11 @@ bool SupportsColoredOutput(fd_t fd) {
|
|
|
|
#if !SANITIZER_GO
|
|
// TODO(glider): different tools may require different altstack size.
|
|
-static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough.
|
|
+static uptr GetAltStackSize() {
|
|
+ // SIGSTKSZ is not enough.
|
|
+ static const uptr kAltStackSize = SIGSTKSZ * 4;
|
|
+ return kAltStackSize;
|
|
+}
|
|
|
|
void SetAlternateSignalStack() {
|
|
stack_t altstack, oldstack;
|
|
@@ -170,10 +174,9 @@ void SetAlternateSignalStack() {
|
|
// 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()).
|
|
- void* base = MmapOrDie(kAltStackSize, __func__);
|
|
- altstack.ss_sp = (char*) base;
|
|
+ altstack.ss_size = GetAltStackSize();
|
|
+ altstack.ss_sp = (char *)MmapOrDie(altstack.ss_size, __func__);
|
|
altstack.ss_flags = 0;
|
|
- altstack.ss_size = kAltStackSize;
|
|
CHECK_EQ(0, sigaltstack(&altstack, nullptr));
|
|
}
|
|
|
|
@@ -181,7 +184,7 @@ void UnsetAlternateSignalStack() {
|
|
stack_t altstack, oldstack;
|
|
altstack.ss_sp = nullptr;
|
|
altstack.ss_flags = SS_DISABLE;
|
|
- altstack.ss_size = kAltStackSize; // Some sane value required on Darwin.
|
|
+ altstack.ss_size = GetAltStackSize(); // Some sane value required on Darwin.
|
|
CHECK_EQ(0, sigaltstack(&altstack, &oldstack));
|
|
UnmapOrDie(oldstack.ss_sp, oldstack.ss_size);
|
|
}
|
|
--
|
|
2.27.0
|
|
|