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