From 15794f9b24fdeaea96aa6291da3d3028332fee8f Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 14 Sep 2024 17:16:45 -0700 Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 [skip ci] --- compiler-rt/lib/asan/asan_posix.cpp | 8 +-- compiler-rt/lib/asan/asan_rtl.cpp | 6 +- compiler-rt/lib/asan/asan_thread.cpp | 9 +-- compiler-rt/lib/dfsan/dfsan_thread.cpp | 9 +-- compiler-rt/lib/hwasan/hwasan_linux.cpp | 8 +-- compiler-rt/lib/lsan/lsan_posix.cpp | 8 +-- compiler-rt/lib/memprof/memprof_thread.cpp | 8 +-- compiler-rt/lib/msan/msan_thread.cpp | 9 +-- compiler-rt/lib/nsan/nsan_thread.cpp | 9 +-- .../lib/sanitizer_common/sanitizer_common.h | 4 +- .../sanitizer_linux_libcdep.cpp | 30 ++++++---- .../lib/sanitizer_common/sanitizer_mac.cpp | 27 ++++----- .../sanitizer_tls_get_addr.cpp | 1 + .../lib/sanitizer_common/sanitizer_win.cpp | 27 ++++----- .../tests/sanitizer_common_test.cpp | 33 ++++++----- compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp | 10 ++-- .../TestCases/Linux/tls_malloc_hook.c | 56 +++++++++++++++++++ 17 files changed, 145 insertions(+), 117 deletions(-) create mode 100644 compiler-rt/test/sanitizer_common/TestCases/Linux/tls_malloc_hook.c diff --git a/compiler-rt/lib/asan/asan_posix.cpp b/compiler-rt/lib/asan/asan_posix.cpp index 76564538bd5d7..cd57f750d897c 100644 --- a/compiler-rt/lib/asan/asan_posix.cpp +++ b/compiler-rt/lib/asan/asan_posix.cpp @@ -59,10 +59,10 @@ bool PlatformUnpoisonStacks() { // Since we're on the signal alternate stack, we cannot find the DEFAULT // stack bottom using a local variable. - uptr default_bottom, tls_addr, tls_size, stack_size; - GetThreadStackAndTls(/*main=*/false, &default_bottom, &stack_size, &tls_addr, - &tls_size); - UnpoisonStack(default_bottom, default_bottom + stack_size, "default"); + uptr stack_begin, stack_end, tls_begin, tls_end; + GetThreadStackAndTls(/*main=*/false, &stack_begin, &stack_end, &tls_begin, + &tls_end); + UnpoisonStack(stack_begin, stack_end, "default"); return true; } diff --git a/compiler-rt/lib/asan/asan_rtl.cpp b/compiler-rt/lib/asan/asan_rtl.cpp index d42a75e9e5211..a390802af28d0 100644 --- a/compiler-rt/lib/asan/asan_rtl.cpp +++ b/compiler-rt/lib/asan/asan_rtl.cpp @@ -580,10 +580,8 @@ static void UnpoisonDefaultStack() { } else { CHECK(!SANITIZER_FUCHSIA); // If we haven't seen this thread, try asking the OS for stack bounds. - uptr tls_addr, tls_size, stack_size; - GetThreadStackAndTls(/*main=*/false, &bottom, &stack_size, &tls_addr, - &tls_size); - top = bottom + stack_size; + uptr tls_begin, tls_end; + GetThreadStackAndTls(/*main=*/false, &bottom, &top, &tls_begin, &tls_end); } UnpoisonStack(bottom, top, "default"); diff --git a/compiler-rt/lib/asan/asan_thread.cpp b/compiler-rt/lib/asan/asan_thread.cpp index c79c33ab01342..c1a804b9fcccd 100644 --- a/compiler-rt/lib/asan/asan_thread.cpp +++ b/compiler-rt/lib/asan/asan_thread.cpp @@ -306,13 +306,10 @@ AsanThread *CreateMainThread() { // OS-specific implementations that need more information passed through. void AsanThread::SetThreadStackAndTls(const InitOptions *options) { DCHECK_EQ(options, nullptr); - uptr tls_size = 0; - uptr stack_size = 0; - GetThreadStackAndTls(tid() == kMainTid, &stack_bottom_, &stack_size, - &tls_begin_, &tls_size); - stack_top_ = RoundDownTo(stack_bottom_ + stack_size, ASAN_SHADOW_GRANULARITY); + GetThreadStackAndTls(tid() == kMainTid, &stack_bottom_, &stack_top_, + &tls_begin_, &tls_end_); + stack_top_ = RoundDownTo(stack_top_, ASAN_SHADOW_GRANULARITY); stack_bottom_ = RoundDownTo(stack_bottom_, ASAN_SHADOW_GRANULARITY); - tls_end_ = tls_begin_ + tls_size; dtls_ = DTLS_Get(); if (stack_top_ != stack_bottom_) { diff --git a/compiler-rt/lib/dfsan/dfsan_thread.cpp b/compiler-rt/lib/dfsan/dfsan_thread.cpp index c1d47514f4bd9..55d38916ead9e 100644 --- a/compiler-rt/lib/dfsan/dfsan_thread.cpp +++ b/compiler-rt/lib/dfsan/dfsan_thread.cpp @@ -21,13 +21,8 @@ DFsanThread *DFsanThread::Create(thread_callback_t start_routine, void *arg, } void DFsanThread::SetThreadStackAndTls() { - uptr tls_size = 0; - uptr stack_size = 0; - GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_size, &tls_begin_, - &tls_size); - stack_.top = stack_.bottom + stack_size; - tls_end_ = tls_begin_ + tls_size; - + GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_.top, &tls_begin_, + &tls_end_); int local; CHECK(AddrIsInStack((uptr)&local)); } diff --git a/compiler-rt/lib/hwasan/hwasan_linux.cpp b/compiler-rt/lib/hwasan/hwasan_linux.cpp index 68294b5962569..d174fb882ca48 100644 --- a/compiler-rt/lib/hwasan/hwasan_linux.cpp +++ b/compiler-rt/lib/hwasan/hwasan_linux.cpp @@ -499,12 +499,8 @@ void HwasanOnDeadlySignal(int signo, void *info, void *context) { } void Thread::InitStackAndTls(const InitState *) { - uptr tls_size; - uptr stack_size; - GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_, - &tls_size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; + GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_top_, &tls_begin_, + &tls_end_); } uptr TagMemoryAligned(uptr p, uptr size, tag_t tag) { diff --git a/compiler-rt/lib/lsan/lsan_posix.cpp b/compiler-rt/lib/lsan/lsan_posix.cpp index 422c29acca69f..ddd9fee07e89d 100644 --- a/compiler-rt/lib/lsan/lsan_posix.cpp +++ b/compiler-rt/lib/lsan/lsan_posix.cpp @@ -50,12 +50,8 @@ void ThreadContext::OnStarted(void *arg) { void ThreadStart(u32 tid, tid_t os_id, ThreadType thread_type) { OnStartedArgs args; - uptr stack_size = 0; - uptr tls_size = 0; - GetThreadStackAndTls(tid == kMainTid, &args.stack_begin, &stack_size, - &args.tls_begin, &tls_size); - args.stack_end = args.stack_begin + stack_size; - args.tls_end = args.tls_begin + tls_size; + GetThreadStackAndTls(tid == kMainTid, &args.stack_begin, &args.stack_end, + &args.tls_begin, &args.tls_end); GetAllocatorCacheRange(&args.cache_begin, &args.cache_end); args.dtls = DTLS_Get(); ThreadContextLsanBase::ThreadStart(tid, os_id, thread_type, &args); diff --git a/compiler-rt/lib/memprof/memprof_thread.cpp b/compiler-rt/lib/memprof/memprof_thread.cpp index e2bca9bb422f7..50072bb91ee74 100644 --- a/compiler-rt/lib/memprof/memprof_thread.cpp +++ b/compiler-rt/lib/memprof/memprof_thread.cpp @@ -168,12 +168,8 @@ MemprofThread *CreateMainThread() { // OS-specific implementations that need more information passed through. void MemprofThread::SetThreadStackAndTls(const InitOptions *options) { DCHECK_EQ(options, nullptr); - uptr tls_size = 0; - uptr stack_size = 0; - GetThreadStackAndTls(tid() == kMainTid, &stack_bottom_, &stack_size, - &tls_begin_, &tls_size); - stack_top_ = stack_bottom_ + stack_size; - tls_end_ = tls_begin_ + tls_size; + GetThreadStackAndTls(tid() == kMainTid, &stack_bottom_, &stack_top_, + &tls_begin_, &tls_end_); dtls_ = DTLS_Get(); if (stack_top_ != stack_bottom_) { diff --git a/compiler-rt/lib/msan/msan_thread.cpp b/compiler-rt/lib/msan/msan_thread.cpp index e5bdedcd41511..1a1725faa6650 100644 --- a/compiler-rt/lib/msan/msan_thread.cpp +++ b/compiler-rt/lib/msan/msan_thread.cpp @@ -20,13 +20,8 @@ MsanThread *MsanThread::Create(thread_callback_t start_routine, } void MsanThread::SetThreadStackAndTls() { - uptr tls_size = 0; - uptr stack_size = 0; - GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_size, &tls_begin_, - &tls_size); - stack_.top = stack_.bottom + stack_size; - tls_end_ = tls_begin_ + tls_size; - + GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_.top, &tls_begin_, + &tls_end_); int local; CHECK(AddrIsInStack((uptr)&local)); } diff --git a/compiler-rt/lib/nsan/nsan_thread.cpp b/compiler-rt/lib/nsan/nsan_thread.cpp index 85706aea80ebd..6662c9bbfbd00 100644 --- a/compiler-rt/lib/nsan/nsan_thread.cpp +++ b/compiler-rt/lib/nsan/nsan_thread.cpp @@ -29,13 +29,8 @@ NsanThread *NsanThread::Create(thread_callback_t start_routine, void *arg) { } void NsanThread::SetThreadStackAndTls() { - uptr tls_size = 0; - uptr stack_size = 0; - GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_size, &tls_begin_, - &tls_size); - stack_.top = stack_.bottom + stack_size; - tls_end_ = tls_begin_ + tls_size; - + GetThreadStackAndTls(IsMainThread(), &stack_.bottom, &stack_.top, &tls_begin_, + &tls_end_); int local; CHECK(AddrIsInStack((uptr)&local)); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 182dc8f26c88f..082d2158e579b 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -83,8 +83,8 @@ int TgKill(pid_t pid, tid_t tid, int sig); uptr GetThreadSelf(); void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top, uptr *stack_bottom); -void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, - uptr *tls_addr, uptr *tls_size); +void GetThreadStackAndTls(bool main, uptr *stk_begin, uptr *stk_end, + uptr *tls_begin, uptr *tls_end); // Memory management void *MmapOrDie(uptr size, const char *mem_type, bool raw_report = false); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index c3c717bbdbe4c..071ecc4516e0f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -234,7 +234,7 @@ void InitTlsSize() { # if defined(__aarch64__) || defined(__x86_64__) || \ defined(__powerpc64__) || defined(__loongarch__) - void *get_tls_static_info = dlsym(RTLD_NEXT, "_dl_get_tls_static_info"); + void *get_tls_static_info = dlsym(RTLD_DEFAULT, "_dl_get_tls_static_info"); size_t tls_align; ((void (*)(size_t *, size_t *))get_tls_static_info)(&g_tls_size, &tls_align); # endif @@ -626,25 +626,33 @@ uptr GetTlsSize() { } # endif -void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, - uptr *tls_addr, uptr *tls_size) { +void GetThreadStackAndTls(bool main, uptr *stk_begin, uptr *stk_end, + uptr *tls_begin, uptr *tls_end) { # if SANITIZER_GO // Stub implementation for Go. - *stk_addr = *stk_size = *tls_addr = *tls_size = 0; + *stk_begin = 0; + *stk_end = 0; + *tls_begin = 0; + *tls_end = 0; # else - GetTls(tls_addr, tls_size); + uptr tls_addr = 0; + uptr tls_size = 0; + GetTls(&tls_addr, &tls_size); + *tls_begin = tls_addr; + *tls_end = tls_addr + tls_size; uptr stack_top, stack_bottom; GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom); - *stk_addr = stack_bottom; - *stk_size = stack_top - stack_bottom; + *stk_begin = stack_bottom; + *stk_end = stack_top; if (!main) { // If stack and tls intersect, make them non-intersecting. - if (*tls_addr > *stk_addr && *tls_addr < *stk_addr + *stk_size) { - if (*stk_addr + *stk_size < *tls_addr + *tls_size) - *tls_size = *stk_addr + *stk_size - *tls_addr; - *stk_size = *tls_addr - *stk_addr; + CHECK_GE(*tls_begin, *stk_begin); + if (*tls_begin > *stk_begin && *tls_begin < *stk_end) { + if (*stk_end > *tls_end) + *tls_end = *stk_end; + *stk_end = *tls_begin; } } # endif diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp index 35717c610771c..b4a5d687dbdf4 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp @@ -572,21 +572,18 @@ uptr TlsSize() { #endif } -void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, - uptr *tls_addr, uptr *tls_size) { -#if !SANITIZER_GO - uptr stack_top, stack_bottom; - GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom); - *stk_addr = stack_bottom; - *stk_size = stack_top - stack_bottom; - *tls_addr = TlsBaseAddr(); - *tls_size = TlsSize(); -#else - *stk_addr = 0; - *stk_size = 0; - *tls_addr = 0; - *tls_size = 0; -#endif +void GetThreadStackAndTls(bool main, uptr *stk_begin, uptr *stk_end, + uptr *tls_begin, uptr *tls_end) { +# if !SANITIZER_GO + GetThreadStackTopAndBottom(main, stk_begin, stk_end); + *tls_begin = TlsBaseAddr(); + *tls_end = *tls_begin + TlsSize(); +# else + *stk_begin = 0; + *stk_end = 0; + *tls_begin = 0; + *tls_end = 0; +# endif } void ListOfModules::init() { diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp index 087bd801b6e5f..a17a14882d0e1 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_tls_get_addr.cpp @@ -130,6 +130,7 @@ DTLS::DTV *DTLS_on_tls_get_addr(void *arg_void, void *res, DTLS::DTV *dtv = DTLS_Find(dso_id); if (!dtv || dtv->beg) return nullptr; + CHECK_LE(static_tls_begin, static_tls_end); uptr tls_size = 0; uptr tls_beg = reinterpret_cast(res) - arg->offset - kDtvOffset; VReport(2, diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp index 8a80d54751364..d8f51bf020e24 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp @@ -876,21 +876,18 @@ uptr GetTlsSize() { void InitTlsSize() { } -void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, - uptr *tls_addr, uptr *tls_size) { -#if SANITIZER_GO - *stk_addr = 0; - *stk_size = 0; - *tls_addr = 0; - *tls_size = 0; -#else - uptr stack_top, stack_bottom; - GetThreadStackTopAndBottom(main, &stack_top, &stack_bottom); - *stk_addr = stack_bottom; - *stk_size = stack_top - stack_bottom; - *tls_addr = 0; - *tls_size = 0; -#endif +void GetThreadStackAndTls(bool main, uptr *stk_begin, uptr *stk_end, + uptr *tls_begin, uptr *tls_end) { +# if SANITIZER_GO + *stk_begin = 0; + *stk_end = 0; + *tls_begin = 0; + *tls_end = 0; +# else + GetThreadStackTopAndBottom(main, stk_begin, stk_end); + *tls_begin = 0; + *tls_end = 0; +# endif } void ReportFile::Write(const char *buffer, uptr length) { diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp index 918d824f8bc76..7fd6bad4c0e6c 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cpp @@ -204,30 +204,29 @@ TEST(SanitizerCommon, InternalMmapVectorSwap) { } void TestThreadInfo(bool main) { - uptr stk_addr = 0; - uptr stk_size = 0; - uptr tls_addr = 0; - uptr tls_size = 0; - GetThreadStackAndTls(main, &stk_addr, &stk_size, &tls_addr, &tls_size); + uptr stk_begin = 0; + uptr stk_end = 0; + uptr tls_begin = 0; + uptr tls_end = 0; + GetThreadStackAndTls(main, &stk_begin, &stk_end, &tls_begin, &tls_end); int stack_var; - EXPECT_NE(stk_addr, (uptr)0); - EXPECT_NE(stk_size, (uptr)0); - EXPECT_GT((uptr)&stack_var, stk_addr); - EXPECT_LT((uptr)&stack_var, stk_addr + stk_size); + EXPECT_NE(stk_begin, (uptr)0); + EXPECT_GT(stk_end, stk_begin); + EXPECT_GT((uptr)&stack_var, stk_begin); + EXPECT_LT((uptr)&stack_var, stk_end); #if SANITIZER_LINUX && defined(__x86_64__) static __thread int thread_var; - EXPECT_NE(tls_addr, (uptr)0); - EXPECT_NE(tls_size, (uptr)0); - EXPECT_GT((uptr)&thread_var, tls_addr); - EXPECT_LT((uptr)&thread_var, tls_addr + tls_size); + EXPECT_NE(tls_begin, (uptr)0); + EXPECT_GT(tls_end, tls_begin); + EXPECT_GT((uptr)&thread_var, tls_begin); + EXPECT_LT((uptr)&thread_var, tls_end); // Ensure that tls and stack do not intersect. - uptr tls_end = tls_addr + tls_size; - EXPECT_TRUE(tls_addr < stk_addr || tls_addr >= stk_addr + stk_size); - EXPECT_TRUE(tls_end < stk_addr || tls_end >= stk_addr + stk_size); - EXPECT_TRUE((tls_addr < stk_addr) == (tls_end < stk_addr)); + EXPECT_TRUE(tls_begin < stk_begin || tls_begin >= stk_end); + EXPECT_TRUE(tls_end < stk_begin || tls_end >= stk_end); + EXPECT_TRUE((tls_begin < stk_begin) == (tls_end < stk_begin)); #endif } diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp index 5316a7862e449..8d29e25a6dd20 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp @@ -165,14 +165,16 @@ void ThreadStart(ThreadState *thr, Tid tid, tid_t os_id, #endif uptr stk_addr = 0; - uptr stk_size = 0; + uptr stk_end = 0; uptr tls_addr = 0; - uptr tls_size = 0; + uptr tls_end = 0; #if !SANITIZER_GO if (thread_type != ThreadType::Fiber) - GetThreadStackAndTls(tid == kMainTid, &stk_addr, &stk_size, &tls_addr, - &tls_size); + GetThreadStackAndTls(tid == kMainTid, &stk_addr, &stk_end, &tls_addr, + &tls_end); #endif + uptr stk_size = stk_end - stk_addr; + uptr tls_size = tls_end - tls_addr; thr->stk_addr = stk_addr; thr->stk_size = stk_size; thr->tls_addr = tls_addr; diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_malloc_hook.c b/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_malloc_hook.c new file mode 100644 index 0000000000000..587f3b1401f10 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_malloc_hook.c @@ -0,0 +1,56 @@ +// Test that we don't crash accessing DTLS from malloc hook. + +// RUN: %clang %s -o %t +// RUN: %clang %s -DBUILD_SO -fPIC -o %t-so.so -shared +// RUN: %run %t 2>&1 | FileCheck %s + +// REQUIRES: glibc + +// No allocator and hooks. +// XFAIL: ubsan + +#ifndef BUILD_SO +# include +# include +# include +# include +# include + +typedef long *(*get_t)(); +get_t GetTls; +void *Thread(void *unused) { return GetTls(); } + +__thread long recursive_hook; + +// CHECK: __sanitizer_malloc_hook: +void __sanitizer_malloc_hook(const volatile void *ptr, size_t sz) + __attribute__((disable_sanitizer_instrumentation)) { + ++recursive_hook; + if (recursive_hook == 1 && GetTls) + fprintf(stderr, "__sanitizer_malloc_hook: %p\n", GetTls()); + --recursive_hook; +} + +int main(int argc, char *argv[]) { + char path[4096]; + snprintf(path, sizeof(path), "%s-so.so", argv[0]); + int i; + + void *handle = dlopen(path, RTLD_LAZY); + if (!handle) + fprintf(stderr, "%s\n", dlerror()); + assert(handle != 0); + GetTls = (get_t)dlsym(handle, "GetTls"); + assert(dlerror() == 0); + + pthread_t t; + pthread_create(&t, 0, Thread, 0); + pthread_join(t, 0); + pthread_create(&t, 0, Thread, 0); + pthread_join(t, 0); + return 0; +} +#else // BUILD_SO +__thread long huge_thread_local_array[1 << 17]; +long *GetTls() { return &huge_thread_local_array[0]; } +#endif From 120031b584ef6293719008c4c09c274e7953685b Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Mon, 16 Sep 2024 09:52:44 -0700 Subject: [PATCH 2/2] rebase Created using spr 1.3.4 --- compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index 2f57bc5301e19..61bbd3ae3b7c3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -205,7 +205,7 @@ __attribute__((unused)) static bool GetLibcVersion(int *major, int *minor, # ifdef SANITIZER_GLIBC const char *p = gnu_get_libc_version(); *major = internal_simple_strtoll(p, &p, 10); - // Caller do not expect anything else. + // Caller does not expect anything else. CHECK_EQ(*major, 2); *minor = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0; *patch = (*p == '.') ? internal_simple_strtoll(p + 1, &p, 10) : 0;