1*4882a593SmuzhiyunFrom 077bfc4e7bf67efda437583bac7e94197da88881 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jakub Jelinek <jakub@redhat.com> 3*4882a593SmuzhiyunDate: Sat, 17 Apr 2021 11:27:14 +0200 4*4882a593SmuzhiyunSubject: [PATCH] sanitizer: Fix asan against glibc 2.34 [PR100114] 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunAs mentioned in the PR, SIGSTKSZ is no longer a compile time constant in 7*4882a593Smuzhiyunglibc 2.34 and later, so 8*4882a593Smuzhiyunstatic const uptr kAltStackSize = SIGSTKSZ * 4; 9*4882a593Smuzhiyunneeds dynamic initialization, but is used by a function called indirectly 10*4882a593Smuzhiyunfrom .preinit_array and therefore before the variable is constructed. 11*4882a593SmuzhiyunThis results in using 0 size instead and all asan instrumented programs 12*4882a593Smuzhiyundie with: 13*4882a593Smuzhiyun==91==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22) 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunHere is a cherry-pick from upstream to fix this. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun2021-04-17 Jakub Jelinek <jakub@redhat.com> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun PR sanitizer/100114 20*4882a593Smuzhiyun * sanitizer_common/sanitizer_posix_libcdep.cc: Cherry-pick 21*4882a593Smuzhiyun llvm-project revisions 82150606fb11d28813ae6da1101f5bda638165fe 22*4882a593Smuzhiyun and b93629dd335ffee2fc4b9b619bf86c3f9e6b0023. 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun(cherry picked from commit 950bac27d63c1c2ac3a6ed867692d6a13f21feb3) 25*4882a593Smuzhiyun--- 26*4882a593Smuzhiyun .../sanitizer_common/sanitizer_posix_libcdep.cc | 13 ++++++++----- 27*4882a593Smuzhiyun 1 file changed, 8 insertions(+), 5 deletions(-) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyundiff --git a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc 30*4882a593Smuzhiyunindex 1a37118c2..066079b39 100644 31*4882a593Smuzhiyun--- a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc 32*4882a593Smuzhiyun+++ b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc 33*4882a593Smuzhiyun@@ -159,7 +159,11 @@ bool SupportsColoredOutput(fd_t fd) { 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #if !SANITIZER_GO 36*4882a593Smuzhiyun // TODO(glider): different tools may require different altstack size. 37*4882a593Smuzhiyun-static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough. 38*4882a593Smuzhiyun+static uptr GetAltStackSize() { 39*4882a593Smuzhiyun+ // SIGSTKSZ is not enough. 40*4882a593Smuzhiyun+ static const uptr kAltStackSize = SIGSTKSZ * 4; 41*4882a593Smuzhiyun+ return kAltStackSize; 42*4882a593Smuzhiyun+} 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun void SetAlternateSignalStack() { 45*4882a593Smuzhiyun stack_t altstack, oldstack; 46*4882a593Smuzhiyun@@ -170,10 +174,9 @@ void SetAlternateSignalStack() { 47*4882a593Smuzhiyun // TODO(glider): the mapped stack should have the MAP_STACK flag in the 48*4882a593Smuzhiyun // future. It is not required by man 2 sigaltstack now (they're using 49*4882a593Smuzhiyun // malloc()). 50*4882a593Smuzhiyun- void* base = MmapOrDie(kAltStackSize, __func__); 51*4882a593Smuzhiyun- altstack.ss_sp = (char*) base; 52*4882a593Smuzhiyun+ altstack.ss_size = GetAltStackSize(); 53*4882a593Smuzhiyun+ altstack.ss_sp = (char *)MmapOrDie(altstack.ss_size, __func__); 54*4882a593Smuzhiyun altstack.ss_flags = 0; 55*4882a593Smuzhiyun- altstack.ss_size = kAltStackSize; 56*4882a593Smuzhiyun CHECK_EQ(0, sigaltstack(&altstack, nullptr)); 57*4882a593Smuzhiyun } 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun@@ -181,7 +184,7 @@ void UnsetAlternateSignalStack() { 60*4882a593Smuzhiyun stack_t altstack, oldstack; 61*4882a593Smuzhiyun altstack.ss_sp = nullptr; 62*4882a593Smuzhiyun altstack.ss_flags = SS_DISABLE; 63*4882a593Smuzhiyun- altstack.ss_size = kAltStackSize; // Some sane value required on Darwin. 64*4882a593Smuzhiyun+ altstack.ss_size = GetAltStackSize(); // Some sane value required on Darwin. 65*4882a593Smuzhiyun CHECK_EQ(0, sigaltstack(&altstack, &oldstack)); 66*4882a593Smuzhiyun UnmapOrDie(oldstack.ss_sp, oldstack.ss_size); 67*4882a593Smuzhiyun } 68*4882a593Smuzhiyun-- 69*4882a593Smuzhiyun2.20.1 70*4882a593Smuzhiyun 71