authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-07-16 11:22:46+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-08-30 06:36:41+02:00
logac2050609055d76a58b058b064f0b0c4d54e2faa
tree54855b2bde3e1eed89d870251b044e93972f6c5c
parent85438e75e04b356ca319051c33e0987a9958ad4a
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

libtsan: update to LLVM 21


58 files changed, 1898 insertions(+), 842 deletions(-)

lib/libtsan/builtins/assembly.h+42-15
...@@ -61,7 +61,7 @@...@@ -61,7 +61,7 @@
61#define LOCAL_LABEL(name) .L ## name61#define LOCAL_LABEL(name) .L ## name
62#define FILE_LEVEL_DIRECTIVE62#define FILE_LEVEL_DIRECTIVE
63#define SYMBOL_IS_FUNC(name) \63#define SYMBOL_IS_FUNC(name) \
64 .def name SEPARATOR \64 .def FUNC_SYMBOL(name) SEPARATOR \
65 .scl 2 SEPARATOR \65 .scl 2 SEPARATOR \
66 .type 32 SEPARATOR \66 .type 32 SEPARATOR \
67 .endef67 .endef
...@@ -71,7 +71,7 @@...@@ -71,7 +71,7 @@
7171
72#endif72#endif
7373
74#if defined(__arm__) || defined(__aarch64__)74#if defined(__arm__) || defined(__aarch64__) || defined(__arm64ec__)
75#define FUNC_ALIGN \75#define FUNC_ALIGN \
76 .text SEPARATOR \76 .text SEPARATOR \
77 .balign 16 SEPARATOR77 .balign 16 SEPARATOR
...@@ -194,6 +194,23 @@...@@ -194,6 +194,23 @@
194#else194#else
195#define WIDE(op) op195#define WIDE(op) op
196#endif196#endif
197
198#if defined(__ARM_FEATURE_PAC_DEFAULT) && defined(__ARM_FEATURE_BTI_DEFAULT)
199#define PACBTI_LANDING pacbti r12, lr, sp
200#elif defined(__ARM_FEATURE_PAC_DEFAULT)
201#define PACBTI_LANDING pac r12, lr, sp
202#elif defined(__ARM_FEATURE_BTI_DEFAULT)
203#define PACBTI_LANDING bti
204#else
205#define PACBTI_LANDING
206#endif
207
208#if defined(__ARM_FEATURE_PAUTH)
209#define PAC_RETURN bxaut r12, lr, sp
210#else
211#define PAC_RETURN aut r12, lr, sp SEPARATOR bx lr
212#endif
213
197#else // !defined(__arm)214#else // !defined(__arm)
198#define DECLARE_FUNC_ENCODING215#define DECLARE_FUNC_ENCODING
199#define DEFINE_CODE_STATE216#define DEFINE_CODE_STATE
...@@ -208,6 +225,16 @@...@@ -208,6 +225,16 @@
208#define GLUE4(a, b, c, d) GLUE4_(a, b, c, d)225#define GLUE4(a, b, c, d) GLUE4_(a, b, c, d)
209226
210#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)227#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
228#ifndef __arm64ec__
229#define FUNC_SYMBOL(name) name
230#else
231// On ARM64EC, function names and calls (but not address-taking or data symbol
232// references) use symbols prefixed with "#".
233#define QUOTE(a) #a
234#define STR(a) QUOTE(a)
235#define HASH #
236#define FUNC_SYMBOL(name) STR(GLUE2(HASH, name))
237#endif
211238
212#ifdef VISIBILITY_HIDDEN239#ifdef VISIBILITY_HIDDEN
213#define DECLARE_SYMBOL_VISIBILITY(name) \240#define DECLARE_SYMBOL_VISIBILITY(name) \
...@@ -222,54 +249,54 @@...@@ -222,54 +249,54 @@
222#define DEFINE_COMPILERRT_FUNCTION(name) \249#define DEFINE_COMPILERRT_FUNCTION(name) \
223 DEFINE_CODE_STATE \250 DEFINE_CODE_STATE \
224 FILE_LEVEL_DIRECTIVE SEPARATOR \251 FILE_LEVEL_DIRECTIVE SEPARATOR \
225 .globl SYMBOL_NAME(name) SEPARATOR \252 .globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
226 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \253 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
227 DECLARE_SYMBOL_VISIBILITY(name) \254 DECLARE_SYMBOL_VISIBILITY(name) \
228 DECLARE_FUNC_ENCODING \255 DECLARE_FUNC_ENCODING \
229 SYMBOL_NAME(name):256 FUNC_SYMBOL(SYMBOL_NAME(name)):
230257
231#define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \258#define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \
232 DEFINE_CODE_STATE \259 DEFINE_CODE_STATE \
233 FILE_LEVEL_DIRECTIVE SEPARATOR \260 FILE_LEVEL_DIRECTIVE SEPARATOR \
234 .globl SYMBOL_NAME(name) SEPARATOR \261 .globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
235 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \262 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
236 DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \263 DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \
237 .thumb_func SEPARATOR \264 .thumb_func SEPARATOR \
238 SYMBOL_NAME(name):265 FUNC_SYMBOL(SYMBOL_NAME(name)):
239266
240#define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \267#define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \
241 DEFINE_CODE_STATE \268 DEFINE_CODE_STATE \
242 FILE_LEVEL_DIRECTIVE SEPARATOR \269 FILE_LEVEL_DIRECTIVE SEPARATOR \
243 .globl SYMBOL_NAME(name) SEPARATOR \270 .globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
244 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \271 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
245 HIDDEN(SYMBOL_NAME(name)) SEPARATOR \272 HIDDEN(SYMBOL_NAME(name)) SEPARATOR \
246 DECLARE_FUNC_ENCODING \273 DECLARE_FUNC_ENCODING \
247 SYMBOL_NAME(name):274 FUNC_SYMBOL(SYMBOL_NAME(name)):
248275
249#define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \276#define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \
250 DEFINE_CODE_STATE \277 DEFINE_CODE_STATE \
251 .globl name SEPARATOR \278 .globl FUNC_SYMBOL(name) SEPARATOR \
252 SYMBOL_IS_FUNC(name) SEPARATOR \279 SYMBOL_IS_FUNC(name) SEPARATOR \
253 HIDDEN(name) SEPARATOR \280 HIDDEN(name) SEPARATOR \
254 DECLARE_FUNC_ENCODING \281 DECLARE_FUNC_ENCODING \
255 name:282 FUNC_SYMBOL(name):
256283
257#define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name) \284#define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name) \
258 DEFINE_CODE_STATE \285 DEFINE_CODE_STATE \
259 FUNC_ALIGN \286 FUNC_ALIGN \
260 .globl name SEPARATOR \287 .globl FUNC_SYMBOL(name) SEPARATOR \
261 SYMBOL_IS_FUNC(name) SEPARATOR \288 SYMBOL_IS_FUNC(name) SEPARATOR \
262 DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) SEPARATOR \289 DECLARE_SYMBOL_VISIBILITY_UNMANGLED(FUNC_SYMBOL(name)) SEPARATOR \
263 DECLARE_FUNC_ENCODING \290 DECLARE_FUNC_ENCODING \
264 name: \291 FUNC_SYMBOL(name): \
265 SEPARATOR CFI_START \292 SEPARATOR CFI_START \
266 SEPARATOR BTI_C293 SEPARATOR BTI_C
267294
268#define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \295#define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \
269 .globl SYMBOL_NAME(name) SEPARATOR \296 .globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
270 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \297 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
271 DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \298 DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \
272 .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR299 .set FUNC_SYMBOL(SYMBOL_NAME(name)), FUNC_SYMBOL(target) SEPARATOR
273300
274#if defined(__ARM_EABI__)301#if defined(__ARM_EABI__)
275#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \302#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \
lib/libtsan/interception/interception.h+21-6
...@@ -19,7 +19,7 @@...@@ -19,7 +19,7 @@
1919
20#if !SANITIZER_LINUX && !SANITIZER_FREEBSD && !SANITIZER_APPLE && \20#if !SANITIZER_LINUX && !SANITIZER_FREEBSD && !SANITIZER_APPLE && \
21 !SANITIZER_NETBSD && !SANITIZER_WINDOWS && !SANITIZER_FUCHSIA && \21 !SANITIZER_NETBSD && !SANITIZER_WINDOWS && !SANITIZER_FUCHSIA && \
22 !SANITIZER_SOLARIS22 !SANITIZER_SOLARIS && !SANITIZER_HAIKU && !SANITIZER_AIX
23# error "Interception doesn't work on this operating system."23# error "Interception doesn't work on this operating system."
24#endif24#endif
2525
...@@ -168,6 +168,16 @@ const interpose_substitution substitution_##func_name[] \...@@ -168,6 +168,16 @@ const interpose_substitution substitution_##func_name[] \
168 extern "C" ret_type func(__VA_ARGS__);168 extern "C" ret_type func(__VA_ARGS__);
169# define DECLARE_WRAPPER_WINAPI(ret_type, func, ...) \169# define DECLARE_WRAPPER_WINAPI(ret_type, func, ...) \
170 extern "C" __declspec(dllimport) ret_type __stdcall func(__VA_ARGS__);170 extern "C" __declspec(dllimport) ret_type __stdcall func(__VA_ARGS__);
171#elif SANITIZER_AIX
172# define WRAP(x) __interceptor_##x
173# define TRAMPOLINE(x) WRAP(x)
174// # define WRAPPER_NAME(x) "__interceptor_" #x
175# define INTERCEPTOR_ATTRIBUTE __attribute__((visibility("default")))
176// AIX's linker will not select the weak symbol, so don't use weak for the
177// interceptors.
178# define DECLARE_WRAPPER(ret_type, func, ...) \
179 extern "C" ret_type func(__VA_ARGS__) \
180 __attribute__((alias("__interceptor_" #func), visibility("default")));
171#elif !SANITIZER_FUCHSIA // LINUX, FREEBSD, NETBSD, SOLARIS181#elif !SANITIZER_FUCHSIA // LINUX, FREEBSD, NETBSD, SOLARIS
172# define INTERCEPTOR_ATTRIBUTE __attribute__((visibility("default")))182# define INTERCEPTOR_ATTRIBUTE __attribute__((visibility("default")))
173# if ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT183# if ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT
...@@ -367,12 +377,17 @@ inline void DoesNotSupportStaticLinking() {}...@@ -367,12 +377,17 @@ inline void DoesNotSupportStaticLinking() {}
367377
368#define INCLUDED_FROM_INTERCEPTION_LIB378#define INCLUDED_FROM_INTERCEPTION_LIB
369379
370#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \380#if SANITIZER_AIX
371 SANITIZER_SOLARIS381# include "interception_aix.h"
382# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_AIX(func)
383# define INTERCEPT_FUNCTION_VER(func, symver) INTERCEPT_FUNCTION_AIX(func)
372384
373# include "interception_linux.h"385#elif SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \
374# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func)386 SANITIZER_SOLARIS || SANITIZER_HAIKU
375# define INTERCEPT_FUNCTION_VER(func, symver) \387
388# include "interception_linux.h"
389# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func)
390# define INTERCEPT_FUNCTION_VER(func, symver) \
376 INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver)391 INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver)
377#elif SANITIZER_APPLE392#elif SANITIZER_APPLE
378# include "interception_mac.h"393# include "interception_mac.h"
lib/libtsan/interception/interception_aix.cpp created+45
...@@ -0,0 +1,45 @@
1//===-- interception_aix.cpp ------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of AddressSanitizer, an address sanity checker.
10//
11// AIX-specific interception methods.
12//===----------------------------------------------------------------------===//
13
14#include "interception.h"
15#include "sanitizer_common/sanitizer_common.h"
16
17#if SANITIZER_AIX
18
19# include <dlfcn.h> // for dlsym()
20
21namespace __interception {
22
23static void *GetFuncAddr(const char *name, uptr wrapper_addr) {
24 // AIX dlsym can only defect the functions that are exported, so
25 // on AIX, we can not intercept some basic functions like memcpy.
26 // FIXME: if we are going to ship dynamic asan library, we may need to search
27 // all the loaded modules with RTLD_DEFAULT if RTLD_NEXT failed.
28 void *addr = dlsym(RTLD_NEXT, name);
29
30 // In case `name' is not loaded, dlsym ends up finding the actual wrapper.
31 // We don't want to intercept the wrapper and have it point to itself.
32 if ((uptr)addr == wrapper_addr)
33 addr = nullptr;
34 return addr;
35}
36
37bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func,
38 uptr wrapper) {
39 void *addr = GetFuncAddr(name, wrapper);
40 *ptr_to_real = (uptr)addr;
41 return addr && (func == wrapper);
42}
43
44} // namespace __interception
45#endif // SANITIZER_AIX
lib/libtsan/interception/interception_aix.h created+36
...@@ -0,0 +1,36 @@
1//===-- interception_aix.h --------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of AddressSanitizer, an address sanity checker.
10//
11// AIX-specific interception methods.
12//===----------------------------------------------------------------------===//
13
14#if SANITIZER_AIX
15
16# if !defined(INCLUDED_FROM_INTERCEPTION_LIB)
17# error \
18 "interception_aix.h should be included from interception library only"
19# endif
20
21# ifndef INTERCEPTION_AIX_H
22# define INTERCEPTION_AIX_H
23
24namespace __interception {
25bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func,
26 uptr wrapper);
27} // namespace __interception
28
29# define INTERCEPT_FUNCTION_AIX(func) \
30 ::__interception::InterceptFunction( \
31 #func, (::__interception::uptr *)&REAL(func), \
32 (::__interception::uptr) & (func), \
33 (::__interception::uptr) & WRAP(func))
34
35# endif // INTERCEPTION_AIX_H
36#endif // SANITIZER_AIX
lib/libtsan/interception/interception_linux.cpp+2-2
...@@ -14,7 +14,7 @@...@@ -14,7 +14,7 @@
14#include "interception.h"14#include "interception.h"
1515
16#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \16#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \
17 SANITIZER_SOLARIS17 SANITIZER_SOLARIS || SANITIZER_HAIKU
1818
19#include <dlfcn.h> // for dlsym() and dlvsym()19#include <dlfcn.h> // for dlsym() and dlvsym()
2020
...@@ -80,4 +80,4 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real,...@@ -80,4 +80,4 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real,
80} // namespace __interception80} // namespace __interception
8181
82#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD ||82#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD ||
83 // SANITIZER_SOLARIS83 // SANITIZER_SOLARIS || SANITIZER_HAIKU
lib/libtsan/interception/interception_linux.h+2-2
...@@ -12,7 +12,7 @@...@@ -12,7 +12,7 @@
12//===----------------------------------------------------------------------===//12//===----------------------------------------------------------------------===//
1313
14#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \14#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \
15 SANITIZER_SOLARIS15 SANITIZER_SOLARIS || SANITIZER_HAIKU
1616
17#if !defined(INCLUDED_FROM_INTERCEPTION_LIB)17#if !defined(INCLUDED_FROM_INTERCEPTION_LIB)
18# error interception_linux.h should be included from interception library only18# error interception_linux.h should be included from interception library only
...@@ -52,4 +52,4 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real,...@@ -52,4 +52,4 @@ bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real,
5252
53#endif // INTERCEPTION_LINUX_H53#endif // INTERCEPTION_LINUX_H
54#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD ||54#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD ||
55 // SANITIZER_SOLARIS55 // SANITIZER_SOLARIS || SANITIZER_HAIKU
lib/libtsan/interception/interception_win.cpp+8-1
...@@ -646,6 +646,7 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {...@@ -646,6 +646,7 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
646 case 0xC033: // 33 C0 : xor eax, eax646 case 0xC033: // 33 C0 : xor eax, eax
647 case 0xC933: // 33 C9 : xor ecx, ecx647 case 0xC933: // 33 C9 : xor ecx, ecx
648 case 0xD233: // 33 D2 : xor edx, edx648 case 0xD233: // 33 D2 : xor edx, edx
649 case 0x9066: // 66 90 : xchg %ax,%ax (Two-byte NOP)
649 case 0xDB84: // 84 DB : test bl,bl650 case 0xDB84: // 84 DB : test bl,bl
650 case 0xC084: // 84 C0 : test al,al651 case 0xC084: // 84 C0 : test al,al
651 case 0xC984: // 84 C9 : test cl,cl652 case 0xC984: // 84 C9 : test cl,cl
...@@ -726,7 +727,6 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {...@@ -726,7 +727,6 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
726 case 0x5541: // push r13727 case 0x5541: // push r13
727 case 0x5641: // push r14728 case 0x5641: // push r14
728 case 0x5741: // push r15729 case 0x5741: // push r15
729 case 0x9066: // Two-byte NOP
730 case 0xc084: // test al, al730 case 0xc084: // test al, al
731 case 0x018a: // mov al, byte ptr [rcx]731 case 0x018a: // mov al, byte ptr [rcx]
732 return 2;732 return 2;
...@@ -743,6 +743,7 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {...@@ -743,6 +743,7 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
743 case 0x058B: // 8B 05 XX XX XX XX : mov eax, dword ptr [XX XX XX XX]743 case 0x058B: // 8B 05 XX XX XX XX : mov eax, dword ptr [XX XX XX XX]
744 if (rel_offset)744 if (rel_offset)
745 *rel_offset = 2;745 *rel_offset = 2;
746 FALLTHROUGH;
746 case 0xB841: // 41 B8 XX XX XX XX : mov r8d, XX XX XX XX747 case 0xB841: // 41 B8 XX XX XX XX : mov r8d, XX XX XX XX
747 return 6;748 return 6;
748749
...@@ -753,6 +754,12 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {...@@ -753,6 +754,12 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
753 case 0x7B81: // 81 7B YY XX XX XX XX cmp DWORD PTR [rbx+YY], XX XX XX XX754 case 0x7B81: // 81 7B YY XX XX XX XX cmp DWORD PTR [rbx+YY], XX XX XX XX
754 case 0x7981: // 81 79 YY XX XX XX XX cmp dword ptr [rcx+YY], XX XX XX XX755 case 0x7981: // 81 79 YY XX XX XX XX cmp dword ptr [rcx+YY], XX XX XX XX
755 return 7;756 return 7;
757
758 case 0xb848: // 48 b8 XX XX XX XX XX XX XX XX :
759 // movabsq XX XX XX XX XX XX XX XX, rax
760 case 0xba48: // 48 ba XX XX XX XX XX XX XX XX :
761 // movabsq XX XX XX XX XX XX XX XX, rdx
762 return 10;
756 }763 }
757764
758 switch (0x00FFFFFF & *(u32 *)address) {765 switch (0x00FFFFFF & *(u32 *)address) {
lib/libtsan/sanitizer_common/sanitizer_allocator_internal.h+1-1
...@@ -23,7 +23,7 @@ namespace __sanitizer {...@@ -23,7 +23,7 @@ namespace __sanitizer {
23typedef CompactSizeClassMap InternalSizeClassMap;23typedef CompactSizeClassMap InternalSizeClassMap;
2424
25struct AP32 {25struct AP32 {
26 static const uptr kSpaceBeg = 0;26 static const uptr kSpaceBeg = SANITIZER_MMAP_BEGIN;
27 static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;27 static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;
28 static const uptr kMetadataSize = 0;28 static const uptr kMetadataSize = 0;
29 typedef InternalSizeClassMap SizeClassMap;29 typedef InternalSizeClassMap SizeClassMap;
lib/libtsan/sanitizer_common/sanitizer_allocator_local_cache.h+1-1
...@@ -166,7 +166,7 @@ struct SizeClassAllocator32LocalCache {...@@ -166,7 +166,7 @@ struct SizeClassAllocator32LocalCache {
166 DCHECK_GT(c->count, 0);166 DCHECK_GT(c->count, 0);
167 }167 }
168 void *res = c->batch[--c->count];168 void *res = c->batch[--c->count];
169 PREFETCH(c->batch[c->count - 1]);169 PREFETCH(c->batch[c->count > 0 ? c->count - 1 : 0]);
170 stats_.Add(AllocatorStatAllocated, c->class_size);170 stats_.Add(AllocatorStatAllocated, c->class_size);
171 return res;171 return res;
172 }172 }
lib/libtsan/sanitizer_common/sanitizer_atomic_clang.h+15
...@@ -14,6 +14,18 @@...@@ -14,6 +14,18 @@
14#ifndef SANITIZER_ATOMIC_CLANG_H14#ifndef SANITIZER_ATOMIC_CLANG_H
15#define SANITIZER_ATOMIC_CLANG_H15#define SANITIZER_ATOMIC_CLANG_H
1616
17// Helper to suppress warnings related to 8-byte atomic accesses when the target
18// is 32-bit AIX (where such accesses use libatomic).
19#if defined(_AIX) && !defined(__powerpc64__) && defined(__clang__)
20# define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN \
21 _Pragma("clang diagnostic push") \
22 _Pragma("clang diagnostic ignored \"-Watomic-alignment\"")
23# define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END _Pragma("clang diagnostic pop")
24#else
25# define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
26# define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
27#endif
28
17namespace __sanitizer {29namespace __sanitizer {
1830
19// We use the compiler builtin atomic operations for loads and stores, which31// We use the compiler builtin atomic operations for loads and stores, which
...@@ -35,6 +47,7 @@ inline void proc_yield(int cnt) {...@@ -35,6 +47,7 @@ inline void proc_yield(int cnt) {
35#endif47#endif
36}48}
3749
50SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
38template <typename T>51template <typename T>
39inline typename T::Type atomic_load(const volatile T *a, memory_order mo) {52inline typename T::Type atomic_load(const volatile T *a, memory_order mo) {
40 DCHECK(mo == memory_order_relaxed || mo == memory_order_consume ||53 DCHECK(mo == memory_order_relaxed || mo == memory_order_consume ||
...@@ -92,6 +105,8 @@ inline bool atomic_compare_exchange_weak(volatile T *a, typename T::Type *cmp,...@@ -92,6 +105,8 @@ inline bool atomic_compare_exchange_weak(volatile T *a, typename T::Type *cmp,
92 return atomic_compare_exchange_strong(a, cmp, xchg, mo);105 return atomic_compare_exchange_strong(a, cmp, xchg, mo);
93}106}
94107
108SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
109
95} // namespace __sanitizer110} // namespace __sanitizer
96111
97#undef ATOMIC_ORDER112#undef ATOMIC_ORDER
lib/libtsan/sanitizer_common/sanitizer_common.h+2-19
...@@ -166,7 +166,7 @@ uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,...@@ -166,7 +166,7 @@ uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,
166166
167// Used to check if we can map shadow memory to a fixed location.167// Used to check if we can map shadow memory to a fixed location.
168bool MemoryRangeIsAvailable(uptr range_start, uptr range_end);168bool MemoryRangeIsAvailable(uptr range_start, uptr range_end);
169// Releases memory pages entirely within the [beg, end] address range. Noop if169// Releases memory pages entirely within the [beg, end) address range. Noop if
170// the provided range does not contain at least one entire page.170// the provided range does not contain at least one entire page.
171void ReleaseMemoryPagesToOS(uptr beg, uptr end);171void ReleaseMemoryPagesToOS(uptr beg, uptr end);
172void IncreaseTotalMmap(uptr size);172void IncreaseTotalMmap(uptr size);
...@@ -925,12 +925,6 @@ class ListOfModules {...@@ -925,12 +925,6 @@ class ListOfModules {
925// Callback type for iterating over a set of memory ranges.925// Callback type for iterating over a set of memory ranges.
926typedef void (*RangeIteratorCallback)(uptr begin, uptr end, void *arg);926typedef void (*RangeIteratorCallback)(uptr begin, uptr end, void *arg);
927927
928enum AndroidApiLevel {
929 ANDROID_NOT_ANDROID = 0,
930 ANDROID_LOLLIPOP_MR1 = 22,
931 ANDROID_POST_LOLLIPOP = 23
932};
933
934void WriteToSyslog(const char *buffer);928void WriteToSyslog(const char *buffer);
935929
936#if defined(SANITIZER_WINDOWS) && defined(_MSC_VER) && !defined(__clang__)930#if defined(SANITIZER_WINDOWS) && defined(_MSC_VER) && !defined(__clang__)
...@@ -963,19 +957,8 @@ inline void AndroidLogInit() {}...@@ -963,19 +957,8 @@ inline void AndroidLogInit() {}
963inline void SetAbortMessage(const char *) {}957inline void SetAbortMessage(const char *) {}
964#endif958#endif
965959
966#if SANITIZER_ANDROID
967void SanitizerInitializeUnwinder();
968AndroidApiLevel AndroidGetApiLevel();
969#else
970inline void AndroidLogWrite(const char *buffer_unused) {}
971inline void SanitizerInitializeUnwinder() {}
972inline AndroidApiLevel AndroidGetApiLevel() { return ANDROID_NOT_ANDROID; }
973#endif
974
975inline uptr GetPthreadDestructorIterations() {960inline uptr GetPthreadDestructorIterations() {
976#if SANITIZER_ANDROID961#if SANITIZER_POSIX
977 return (AndroidGetApiLevel() == ANDROID_LOLLIPOP_MR1) ? 8 : 4;
978#elif SANITIZER_POSIX
979 return 4;962 return 4;
980#else963#else
981// Unused on Windows.964// Unused on Windows.
lib/libtsan/sanitizer_common/sanitizer_common_interceptors.inc+127-24
...@@ -481,7 +481,8 @@ INTERCEPTOR(char*, textdomain, const char *domainname) {...@@ -481,7 +481,8 @@ INTERCEPTOR(char*, textdomain, const char *domainname) {
481#endif481#endif
482482
483#if SANITIZER_INTERCEPT_STRCMP || SANITIZER_INTERCEPT_MEMCMP483#if SANITIZER_INTERCEPT_STRCMP || SANITIZER_INTERCEPT_MEMCMP
484static inline int CharCmpX(unsigned char c1, unsigned char c2) {484[[maybe_unused]] static inline int CharCmpX(unsigned char c1,
485 unsigned char c2) {
485 return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1;486 return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1;
486}487}
487#endif488#endif
...@@ -953,7 +954,7 @@ INTERCEPTOR(double, frexp, double x, int *exp) {...@@ -953,7 +954,7 @@ INTERCEPTOR(double, frexp, double x, int *exp) {
953#define INIT_FREXP954#define INIT_FREXP
954#endif // SANITIZER_INTERCEPT_FREXP955#endif // SANITIZER_INTERCEPT_FREXP
955956
956#if SANITIZER_INTERCEPT_FREXPF_FREXPL957#if SANITIZER_INTERCEPT_FREXPF
957INTERCEPTOR(float, frexpf, float x, int *exp) {958INTERCEPTOR(float, frexpf, float x, int *exp) {
958 void *ctx;959 void *ctx;
959 COMMON_INTERCEPTOR_ENTER(ctx, frexpf, x, exp);960 COMMON_INTERCEPTOR_ENTER(ctx, frexpf, x, exp);
...@@ -963,6 +964,12 @@ INTERCEPTOR(float, frexpf, float x, int *exp) {...@@ -963,6 +964,12 @@ INTERCEPTOR(float, frexpf, float x, int *exp) {
963 return res;964 return res;
964}965}
965966
967# define INIT_FREXPF COMMON_INTERCEPT_FUNCTION(frexpf);
968#else
969# define INIT_FREXPF
970#endif
971
972#if SANITIZER_INTERCEPT_FREXPL
966INTERCEPTOR(long double, frexpl, long double x, int *exp) {973INTERCEPTOR(long double, frexpl, long double x, int *exp) {
967 void *ctx;974 void *ctx;
968 COMMON_INTERCEPTOR_ENTER(ctx, frexpl, x, exp);975 COMMON_INTERCEPTOR_ENTER(ctx, frexpl, x, exp);
...@@ -972,12 +979,10 @@ INTERCEPTOR(long double, frexpl, long double x, int *exp) {...@@ -972,12 +979,10 @@ INTERCEPTOR(long double, frexpl, long double x, int *exp) {
972 return res;979 return res;
973}980}
974981
975#define INIT_FREXPF_FREXPL \982# define INIT_FREXPL COMMON_INTERCEPT_FUNCTION_LDBL(frexpl)
976 COMMON_INTERCEPT_FUNCTION(frexpf); \
977 COMMON_INTERCEPT_FUNCTION_LDBL(frexpl)
978#else983#else
979#define INIT_FREXPF_FREXPL984# define INIT_FREXPL
980#endif // SANITIZER_INTERCEPT_FREXPF_FREXPL985#endif
981986
982#if SI_POSIX987#if SI_POSIX
983static void write_iovec(void *ctx, struct __sanitizer_iovec *iovec,988static void write_iovec(void *ctx, struct __sanitizer_iovec *iovec,
...@@ -1346,7 +1351,8 @@ INTERCEPTOR(unsigned long, time, unsigned long *t) {...@@ -1346,7 +1351,8 @@ INTERCEPTOR(unsigned long, time, unsigned long *t) {
1346#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS1351#if SANITIZER_INTERCEPT_LOCALTIME_AND_FRIENDS
1347static void unpoison_tm(void *ctx, __sanitizer_tm *tm) {1352static void unpoison_tm(void *ctx, __sanitizer_tm *tm) {
1348 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm, sizeof(*tm));1353 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tm, sizeof(*tm));
1349#if !SANITIZER_SOLARIS1354// AIX tm struct does not have tm_zone field.
1355# if !SANITIZER_SOLARIS && !SANITIZER_AIX
1350 if (tm->tm_zone) {1356 if (tm->tm_zone) {
1351 // Can not use COMMON_INTERCEPTOR_WRITE_RANGE here, because tm->tm_zone1357 // Can not use COMMON_INTERCEPTOR_WRITE_RANGE here, because tm->tm_zone
1352 // can point to shared memory and tsan would report a data race.1358 // can point to shared memory and tsan would report a data race.
...@@ -1731,10 +1737,12 @@ INTERCEPTOR(int, __vsprintf_chk, char *str, int flag, SIZE_T size_to,...@@ -1731,10 +1737,12 @@ INTERCEPTOR(int, __vsprintf_chk, char *str, int flag, SIZE_T size_to,
1731VSPRINTF_INTERCEPTOR_IMPL(vsprintf, str, format, ap)1737VSPRINTF_INTERCEPTOR_IMPL(vsprintf, str, format, ap)
1732#endif1738#endif
17331739
1740# if SANITIZER_INTERCEPT_VASPRINTF
1734INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap)1741INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap)
1735VASPRINTF_INTERCEPTOR_IMPL(vasprintf, strp, format, ap)1742VASPRINTF_INTERCEPTOR_IMPL(vasprintf, strp, format, ap)
1743# endif
17361744
1737#if SANITIZER_INTERCEPT_ISOC99_PRINTF1745# if SANITIZER_INTERCEPT_ISOC99_PRINTF
1738INTERCEPTOR(int, __isoc99_vprintf, const char *format, va_list ap)1746INTERCEPTOR(int, __isoc99_vprintf, const char *format, va_list ap)
1739VPRINTF_INTERCEPTOR_IMPL(__isoc99_vprintf, format, ap)1747VPRINTF_INTERCEPTOR_IMPL(__isoc99_vprintf, format, ap)
17401748
...@@ -1783,10 +1791,12 @@ INTERCEPTOR(int, __snprintf_chk, char *str, SIZE_T size, int flag,...@@ -1783,10 +1791,12 @@ INTERCEPTOR(int, __snprintf_chk, char *str, SIZE_T size, int flag,
1783FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format)1791FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format)
1784#endif1792#endif
17851793
1794# if SANITIZER_INTERCEPT_ASPRINTF
1786INTERCEPTOR(int, asprintf, char **strp, const char *format, ...)1795INTERCEPTOR(int, asprintf, char **strp, const char *format, ...)
1787FORMAT_INTERCEPTOR_IMPL(asprintf, vasprintf, strp, format)1796FORMAT_INTERCEPTOR_IMPL(asprintf, vasprintf, strp, format)
1797# endif
17881798
1789#if SANITIZER_INTERCEPT_ISOC99_PRINTF1799# if SANITIZER_INTERCEPT_ISOC99_PRINTF
1790INTERCEPTOR(int, __isoc99_printf, const char *format, ...)1800INTERCEPTOR(int, __isoc99_printf, const char *format, ...)
1791FORMAT_INTERCEPTOR_IMPL(__isoc99_printf, __isoc99_vprintf, format)1801FORMAT_INTERCEPTOR_IMPL(__isoc99_printf, __isoc99_vprintf, format)
17921802
...@@ -1807,17 +1817,24 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,...@@ -1807,17 +1817,24 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,
1807#endif // SANITIZER_INTERCEPT_PRINTF1817#endif // SANITIZER_INTERCEPT_PRINTF
18081818
1809#if SANITIZER_INTERCEPT_PRINTF1819#if SANITIZER_INTERCEPT_PRINTF
1810#define INIT_PRINTF \1820# define INIT_PRINTF_COMMON \
1811 COMMON_INTERCEPT_FUNCTION_LDBL(printf); \1821 COMMON_INTERCEPT_FUNCTION_LDBL(printf); \
1812 COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \1822 COMMON_INTERCEPT_FUNCTION_LDBL(sprintf); \
1813 COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \1823 COMMON_INTERCEPT_FUNCTION_LDBL(snprintf); \
1814 COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \1824 COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \
1815 COMMON_INTERCEPT_FUNCTION_LDBL(fprintf); \1825 COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \
1816 COMMON_INTERCEPT_FUNCTION_LDBL(vprintf); \1826 COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \
1817 COMMON_INTERCEPT_FUNCTION_LDBL(vsprintf); \1827 COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \
1818 COMMON_INTERCEPT_FUNCTION_LDBL(vsnprintf); \1828 COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);
1819 COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf); \1829# if !SANITIZER_AIX
1820 COMMON_INTERCEPT_FUNCTION_LDBL(vfprintf);1830// AIX does not have [v]asprintf.
1831# define INIT_PRINTF_EXTRA \
1832 COMMON_INTERCEPT_FUNCTION_LDBL(asprintf); \
1833 COMMON_INTERCEPT_FUNCTION_LDBL(vasprintf);
1834# else
1835# define INIT_PRINTF_EXTRA
1836# endif
1837# define INIT_PRINTF INIT_PRINTF_COMMON INIT_PRINTF_EXTRA
1821#else1838#else
1822#define INIT_PRINTF1839#define INIT_PRINTF
1823#endif1840#endif
...@@ -1855,6 +1872,22 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,...@@ -1855,6 +1872,22 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,
1855#define INIT_ISOC99_PRINTF1872#define INIT_ISOC99_PRINTF
1856#endif1873#endif
18571874
1875#if SANITIZER_INTERCEPT_SETPROCTITLE
1876INTERCEPTOR(void, setproctitle, const char *fmt, ...) {
1877 void *ctx;
1878 va_list ap;
1879 va_start(ap, fmt);
1880 COMMON_INTERCEPTOR_ENTER(ctx, setproctitle, fmt, ap);
1881 if (common_flags()->check_printf)
1882 printf_common(ctx, fmt, ap);
1883 REAL(setproctitle)(fmt, ap);
1884 va_end(ap);
1885}
1886# define INIT_SETPROCTITLE COMMON_INTERCEPT_FUNCTION(setproctitle);
1887#else
1888# define INIT_SETPROCTITLE
1889#endif
1890
1858#if SANITIZER_INTERCEPT_IOCTL1891#if SANITIZER_INTERCEPT_IOCTL
1859#include "sanitizer_common_interceptors_ioctl.inc"1892#include "sanitizer_common_interceptors_ioctl.inc"
1860#include "sanitizer_interceptors_ioctl_netbsd.inc"1893#include "sanitizer_interceptors_ioctl_netbsd.inc"
...@@ -3901,7 +3934,7 @@ INTERCEPTOR(SIZE_T, wcrtomb, char *dest, wchar_t src, void *ps) {...@@ -3901,7 +3934,7 @@ INTERCEPTOR(SIZE_T, wcrtomb, char *dest, wchar_t src, void *ps) {
3901 if (res != ((SIZE_T)-1)) {3934 if (res != ((SIZE_T)-1)) {
3902 CHECK_LE(res, sizeof(local_dest));3935 CHECK_LE(res, sizeof(local_dest));
3903 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, res);3936 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, res);
3904 REAL(memcpy)(dest, local_dest, res);3937 internal_memcpy(dest, local_dest, res);
3905 }3938 }
3906 return res;3939 return res;
3907}3940}
...@@ -3923,7 +3956,7 @@ INTERCEPTOR(int, wctomb, char *dest, wchar_t src) {...@@ -3923,7 +3956,7 @@ INTERCEPTOR(int, wctomb, char *dest, wchar_t src) {
3923 if (res != -1) {3956 if (res != -1) {
3924 CHECK_LE(res, sizeof(local_dest));3957 CHECK_LE(res, sizeof(local_dest));
3925 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, res);3958 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, res);
3926 REAL(memcpy)(dest, local_dest, res);3959 internal_memcpy(dest, local_dest, res);
3927 }3960 }
3928 return res;3961 return res;
3929}3962}
...@@ -10263,6 +10296,71 @@ INTERCEPTOR(SSIZE_T, freadlink, int fd, char *buf, SIZE_T bufsiz) {...@@ -10263,6 +10296,71 @@ INTERCEPTOR(SSIZE_T, freadlink, int fd, char *buf, SIZE_T bufsiz) {
10263# define INIT_FREADLINK10296# define INIT_FREADLINK
10264#endif10297#endif
1026510298
10299#if SANITIZER_INTERCEPT_GETSERVENT_R || SANITIZER_INTERCEPT_GETSERVBYNAME_R || \
10300 SANITIZER_INTERCEPT_GETSERVBYPORT_R
10301
10302UNUSED static void HandleGetServentReentrantResult(
10303 void *ctx, int res, struct __sanitizer_servent *result_buf, char *buf,
10304 SIZE_T buflen, struct __sanitizer_servent **result) {
10305 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (char *)result, sizeof(void *));
10306 if (res)
10307 return;
10308 if (*result) {
10309 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, (char *)*result,
10310 sizeof(__sanitizer_servent));
10311 COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen);
10312 }
10313}
10314
10315#endif
10316
10317#if SANITIZER_INTERCEPT_GETSERVENT_R
10318INTERCEPTOR(int, getservent_r, struct __sanitizer_servent *result_buf,
10319 char *buf, SIZE_T buflen, struct __sanitizer_servent **result) {
10320 void *ctx;
10321 COMMON_INTERCEPTOR_ENTER(ctx, getservent_r, result_buf, buf, buflen, result);
10322 int res = REAL(getservent_r)(result_buf, buf, buflen, result);
10323 HandleGetServentReentrantResult(ctx, res, result_buf, buf, buflen, result);
10324 return res;
10325}
10326# define INIT_GETSERVENT_R COMMON_INTERCEPT_FUNCTION(getservent_r)
10327#else
10328# define INIT_GETSERVENT_R
10329#endif
10330
10331#if SANITIZER_INTERCEPT_GETSERVBYNAME_R
10332INTERCEPTOR(int, getservbyname_r, const char *name, const char *proto,
10333 struct __sanitizer_servent *result_buf, char *buf, SIZE_T buflen,
10334 struct __sanitizer_servent **result) {
10335 void *ctx;
10336 COMMON_INTERCEPTOR_ENTER(ctx, getservbyname_r, name, proto, result_buf, buf,
10337 buflen, result);
10338 COMMON_INTERCEPTOR_READ_STRING(ctx, name, internal_strlen(name));
10339 int res = REAL(getservbyname_r)(name, proto, result_buf, buf, buflen, result);
10340 HandleGetServentReentrantResult(ctx, res, result_buf, buf, buflen, result);
10341 return res;
10342}
10343# define INIT_GETSERVBYNAME_R COMMON_INTERCEPT_FUNCTION(getservbyname_r)
10344#else
10345# define INIT_GETSERVBYNAME_R
10346#endif
10347
10348#if SANITIZER_INTERCEPT_GETSERVBYPORT_R
10349INTERCEPTOR(int, getservbyport_r, int port, const char *proto,
10350 struct __sanitizer_servent *result_buf, char *buf, SIZE_T buflen,
10351 struct __sanitizer_servent **result) {
10352 void *ctx;
10353 COMMON_INTERCEPTOR_ENTER(ctx, getservbyport_r, port, proto, result_buf, buf,
10354 buflen, result);
10355 int res = REAL(getservbyport_r)(port, proto, result_buf, buf, buflen, result);
10356 HandleGetServentReentrantResult(ctx, res, result_buf, buf, buflen, result);
10357 return res;
10358}
10359# define INIT_GETSERVBYPORT_R COMMON_INTERCEPT_FUNCTION(getservbyport_r)
10360#else
10361# define INIT_GETSERVBYPORT_R
10362#endif
10363
10266#include "sanitizer_common_interceptors_netbsd_compat.inc"10364#include "sanitizer_common_interceptors_netbsd_compat.inc"
1026710365
10268namespace __sanitizer {10366namespace __sanitizer {
...@@ -10328,8 +10426,10 @@ static void InitializeCommonInterceptors() {...@@ -10328,8 +10426,10 @@ static void InitializeCommonInterceptors() {
10328 INIT_PRINTF;10426 INIT_PRINTF;
10329 INIT_PRINTF_L;10427 INIT_PRINTF_L;
10330 INIT_ISOC99_PRINTF;10428 INIT_ISOC99_PRINTF;
10429 INIT_SETPROCTITLE;
10331 INIT_FREXP;10430 INIT_FREXP;
10332 INIT_FREXPF_FREXPL;10431 INIT_FREXPF;
10432 INIT_FREXPL;
10333 INIT_GETPWNAM_AND_FRIENDS;10433 INIT_GETPWNAM_AND_FRIENDS;
10334 INIT_GETPWNAM_R_AND_FRIENDS;10434 INIT_GETPWNAM_R_AND_FRIENDS;
10335 INIT_GETPWENT;10435 INIT_GETPWENT;
...@@ -10587,4 +10687,7 @@ static void InitializeCommonInterceptors() {...@@ -10587,4 +10687,7 @@ static void InitializeCommonInterceptors() {
10587 INIT_FREADLINK;10687 INIT_FREADLINK;
1058810688
10589 INIT___PRINTF_CHK;10689 INIT___PRINTF_CHK;
10690 INIT_GETSERVENT_R;
10691 INIT_GETSERVBYNAME_R;
10692 INIT_GETSERVBYPORT_R;
10590}10693}
lib/libtsan/sanitizer_common/sanitizer_common_interceptors_format.inc+4
...@@ -67,6 +67,10 @@ static const char *maybe_parse_length_modifier(const char *p, char ll[2]) {...@@ -67,6 +67,10 @@ static const char *maybe_parse_length_modifier(const char *p, char ll[2]) {
6767
68// Returns true if the character is an integer conversion specifier.68// Returns true if the character is an integer conversion specifier.
69static bool format_is_integer_conv(char c) {69static bool format_is_integer_conv(char c) {
70#if SANITIZER_GLIBC
71 if (char_is_one_of(c, "bB"))
72 return true;
73#endif
70 return char_is_one_of(c, "diouxXn");74 return char_is_one_of(c, "diouxXn");
71}75}
7276
lib/libtsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc+13-7
...@@ -48,35 +48,41 @@ static void ioctl_table_fill() {...@@ -48,35 +48,41 @@ static void ioctl_table_fill() {
48 ++ioctl_table_size; \48 ++ioctl_table_size; \
49 }49 }
5050
51 _(FIONBIO, READ, sizeof(int));
52#if !SANITIZER_HAIKU
51 _(FIOASYNC, READ, sizeof(int));53 _(FIOASYNC, READ, sizeof(int));
52 _(FIOCLEX, NONE, 0);54 _(FIOCLEX, NONE, 0);
53 _(FIOGETOWN, WRITE, sizeof(int));55 _(FIOGETOWN, WRITE, sizeof(int));
54 _(FIONBIO, READ, sizeof(int));
55 _(FIONCLEX, NONE, 0);56 _(FIONCLEX, NONE, 0);
56 _(FIOSETOWN, READ, sizeof(int));57 _(FIOSETOWN, READ, sizeof(int));
58#endif
57 _(SIOCATMARK, WRITE, sizeof(int));59 _(SIOCATMARK, WRITE, sizeof(int));
58 _(SIOCGIFCONF, CUSTOM, 0);60 _(SIOCGIFCONF, CUSTOM, 0);
59 _(SIOCGPGRP, WRITE, sizeof(int));61 _(SIOCGPGRP, WRITE, sizeof(int));
60 _(SIOCSPGRP, READ, sizeof(int));62 _(SIOCSPGRP, READ, sizeof(int));
61#if !SANITIZER_SOLARIS63#if !SANITIZER_SOLARIS && !SANITIZER_HAIKU
62 _(TIOCCONS, NONE, 0);64 _(TIOCCONS, NONE, 0);
63#endif65#endif
64 _(TIOCEXCL, NONE, 0);66#if !SANITIZER_HAIKU
65 _(TIOCGETD, WRITE, sizeof(int));67 _(TIOCGETD, WRITE, sizeof(int));
68 _(TIOCNOTTY, NONE, 0);
69 _(TIOCPKT, READ, sizeof(int));
70 _(TIOCSETD, READ, sizeof(int));
71 _(TIOCSTI, READ, sizeof(char));
72#endif
73 _(TIOCEXCL, NONE, 0);
66 _(TIOCGPGRP, WRITE, pid_t_sz);74 _(TIOCGPGRP, WRITE, pid_t_sz);
67 _(TIOCGWINSZ, WRITE, struct_winsize_sz);75 _(TIOCGWINSZ, WRITE, struct_winsize_sz);
68 _(TIOCMBIC, READ, sizeof(int));76 _(TIOCMBIC, READ, sizeof(int));
69 _(TIOCMBIS, READ, sizeof(int));77 _(TIOCMBIS, READ, sizeof(int));
70 _(TIOCMGET, WRITE, sizeof(int));78 _(TIOCMGET, WRITE, sizeof(int));
71 _(TIOCMSET, READ, sizeof(int));79 _(TIOCMSET, READ, sizeof(int));
72 _(TIOCNOTTY, NONE, 0);
73 _(TIOCNXCL, NONE, 0);80 _(TIOCNXCL, NONE, 0);
74 _(TIOCOUTQ, WRITE, sizeof(int));81 _(TIOCOUTQ, WRITE, sizeof(int));
75 _(TIOCPKT, READ, sizeof(int));82# if !SANITIZER_AIX
76 _(TIOCSCTTY, NONE, 0);83 _(TIOCSCTTY, NONE, 0);
77 _(TIOCSETD, READ, sizeof(int));84# endif
78 _(TIOCSPGRP, READ, pid_t_sz);85 _(TIOCSPGRP, READ, pid_t_sz);
79 _(TIOCSTI, READ, sizeof(char));
80 _(TIOCSWINSZ, READ, struct_winsize_sz);86 _(TIOCSWINSZ, READ, struct_winsize_sz);
8187
82#if !SANITIZER_IOS88#if !SANITIZER_IOS
lib/libtsan/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc+5-3
...@@ -33,11 +33,13 @@...@@ -33,11 +33,13 @@
3333
34// Platform-specific options.34// Platform-specific options.
35#if SANITIZER_APPLE35#if SANITIZER_APPLE
36#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 036# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
37#elif SANITIZER_WINDOWS6437#elif SANITIZER_WINDOWS64
38#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 038# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
39#elif SANITIZER_AIX
40# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0
39#else41#else
40#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 142# define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 1
41#endif // SANITIZER_APPLE43#endif // SANITIZER_APPLE
4244
43#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL45#ifndef COMMON_INTERCEPTOR_MEMSET_IMPL
lib/libtsan/sanitizer_common/sanitizer_common_syscalls.inc+22
...@@ -3205,6 +3205,28 @@ POST_SYSCALL(futex)...@@ -3205,6 +3205,28 @@ POST_SYSCALL(futex)
3205 COMMON_SYSCALL_BLOCKING_END();3205 COMMON_SYSCALL_BLOCKING_END();
3206}3206}
32073207
3208PRE_SYSCALL(copy_file_range)
3209(int fdin, __sanitizer___kernel_off_t *offin, int fdout,
3210 __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
3211 if (offin != nullptr) {
3212 PRE_READ(offin, sizeof(*offin));
3213 }
3214 if (offout != nullptr) {
3215 PRE_READ(offout, sizeof(*offout));
3216 }
3217}
3218
3219POST_SYSCALL(copy_file_range)
3220(SSIZE_T, int fdin, __sanitizer___kernel_off_t *offin, int fdout,
3221 __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
3222 if (offin != nullptr) {
3223 POST_WRITE(offin, sizeof(*offin));
3224 }
3225 if (offout != nullptr) {
3226 POST_WRITE(offout, sizeof(*offout));
3227 }
3228}
3229
3208} // extern "C"3230} // extern "C"
32093231
3210# undef PRE_SYSCALL3232# undef PRE_SYSCALL
lib/libtsan/sanitizer_common/sanitizer_errno.h+2
...@@ -29,6 +29,8 @@...@@ -29,6 +29,8 @@
29# define __errno_location ___errno29# define __errno_location ___errno
30#elif SANITIZER_WINDOWS30#elif SANITIZER_WINDOWS
31# define __errno_location _errno31# define __errno_location _errno
32#elif SANITIZER_HAIKU
33# define __errno_location _errnop
32#endif34#endif
3335
34extern "C" int *__errno_location();36extern "C" int *__errno_location();
lib/libtsan/sanitizer_common/sanitizer_errno_codes.h+15-6
...@@ -21,12 +21,21 @@...@@ -21,12 +21,21 @@
2121
22namespace __sanitizer {22namespace __sanitizer {
2323
24#define errno_ENOMEM 1224#ifdef __HAIKU__
25#define errno_EBUSY 1625# define errno_ENOMEM (0x80000000)
26#define errno_EINVAL 2226# define errno_EBUSY (0x80000000 + 14)
27#define errno_ERANGE 3427# define errno_EINVAL (0x80000000 + 5)
28#define errno_ENAMETOOLONG 3628# define errno_ERANGE (0x80007000 + 17)
29#define errno_ENOSYS 3829# define errno_ENAMETOOLONG (0x80000000 + 0x6004)
30# define errno_ENOSYS (0x80007009)
31#else
32# define errno_ENOMEM 12
33# define errno_EBUSY 16
34# define errno_EINVAL 22
35# define errno_ERANGE 34
36# define errno_ENAMETOOLONG 36
37# define errno_ENOSYS 38
38#endif
3039
31// Those might not present or their value differ on different platforms.40// Those might not present or their value differ on different platforms.
32extern const int errno_EOWNERDEAD;41extern const int errno_EOWNERDEAD;
lib/libtsan/sanitizer_common/sanitizer_file.cpp+67-3
...@@ -96,12 +96,76 @@ static void RecursiveCreateParentDirs(char *path) {...@@ -96,12 +96,76 @@ static void RecursiveCreateParentDirs(char *path) {
96 }96 }
97}97}
9898
99/// Parse the report path \p pattern and copy the parsed path to \p dest.
100///
101/// * `%%` becomes `%`
102/// * `%H` expands to the environment variable `HOME`
103/// * `%t` expands to the environment variable `TMPDIR`
104/// * `%p` expands to the process ID (PID)
105static void ParseAndSetPath(const char *pattern, char *dest,
106 const uptr dest_size) {
107 CHECK(pattern);
108 CHECK(dest);
109 CHECK_GE(dest_size, 1);
110 dest[0] = '\0';
111 uptr next_substr_start_idx = 0;
112 for (uptr i = 0; i < internal_strlen(pattern) - 1; i++) {
113 if (pattern[i] != '%')
114 continue;
115 int bytes_to_copy = i - next_substr_start_idx;
116 // Copy over previous substring.
117 CHECK_LT(internal_strlcat(dest, pattern + next_substr_start_idx,
118 internal_strlen(dest) + bytes_to_copy + 1),
119 dest_size);
120 const char *str_to_concat;
121 switch (pattern[++i]) {
122 case '%':
123 str_to_concat = "%";
124 break;
125 case 'H':
126 str_to_concat = GetEnv("HOME");
127 break;
128 case 't':
129 str_to_concat = GetEnv("TMPDIR");
130 break;
131 case 'p': {
132 // Use printf directly to write the PID since it's not a static string.
133 int remaining_capacity = dest_size - internal_strlen(dest);
134 int bytes_copied =
135 internal_snprintf(dest + internal_strlen(dest), remaining_capacity,
136 "%ld", internal_getpid());
137 CHECK_GT(bytes_copied, 0);
138 CHECK_LT(bytes_copied, remaining_capacity);
139 str_to_concat = "";
140 break;
141 }
142 default: {
143 // Invalid pattern: fallback to original pattern.
144 const char *message = "ERROR: Unexpected pattern: ";
145 WriteToFile(kStderrFd, message, internal_strlen(message));
146 WriteToFile(kStderrFd, pattern, internal_strlen(pattern));
147 WriteToFile(kStderrFd, "\n", internal_strlen("\n"));
148 CHECK_LT(internal_strlcpy(dest, pattern, dest_size), dest_size);
149 return;
150 }
151 }
152 CHECK(str_to_concat);
153 CHECK_LT(internal_strlcat(dest, str_to_concat, dest_size), dest_size);
154 next_substr_start_idx = i + 1;
155 }
156 CHECK_LT(internal_strlcat(dest, pattern + next_substr_start_idx, dest_size),
157 dest_size);
158}
159
99void ReportFile::SetReportPath(const char *path) {160void ReportFile::SetReportPath(const char *path) {
100 if (path) {161 if (path) {
101 uptr len = internal_strlen(path);162 uptr len = internal_strlen(path);
102 if (len > sizeof(path_prefix) - 100) {163 if (len > sizeof(path_prefix) - 100) {
103 Report("ERROR: Path is too long: %c%c%c%c%c%c%c%c...\n", path[0], path[1],164 const char *message = "ERROR: Path is too long: ";
104 path[2], path[3], path[4], path[5], path[6], path[7]);165 WriteToFile(kStderrFd, message, internal_strlen(message));
166 WriteToFile(kStderrFd, path, 8);
167 message = "...\n";
168 WriteToFile(kStderrFd, message, internal_strlen(message));
105 Die();169 Die();
106 }170 }
107 }171 }
...@@ -115,7 +179,7 @@ void ReportFile::SetReportPath(const char *path) {...@@ -115,7 +179,7 @@ void ReportFile::SetReportPath(const char *path) {
115 } else if (internal_strcmp(path, "stdout") == 0) {179 } else if (internal_strcmp(path, "stdout") == 0) {
116 fd = kStdoutFd;180 fd = kStdoutFd;
117 } else {181 } else {
118 internal_snprintf(path_prefix, kMaxPathLength, "%s", path);182 ParseAndSetPath(path, path_prefix, kMaxPathLength);
119 RecursiveCreateParentDirs(path_prefix);183 RecursiveCreateParentDirs(path_prefix);
120 }184 }
121}185}
lib/libtsan/sanitizer_common/sanitizer_fuchsia.cpp+2
...@@ -547,6 +547,8 @@ void __sanitizer_startup_hook(int argc, char **argv, char **envp,...@@ -547,6 +547,8 @@ void __sanitizer_startup_hook(int argc, char **argv, char **envp,
547 __sanitizer::StoredEnviron = envp;547 __sanitizer::StoredEnviron = envp;
548 __sanitizer::MainThreadStackBase = reinterpret_cast<uintptr_t>(stack_base);548 __sanitizer::MainThreadStackBase = reinterpret_cast<uintptr_t>(stack_base);
549 __sanitizer::MainThreadStackSize = stack_size;549 __sanitizer::MainThreadStackSize = stack_size;
550
551 EarlySanitizerInit();
550}552}
551553
552void __sanitizer_set_report_path(const char *path) {554void __sanitizer_set_report_path(const char *path) {
lib/libtsan/sanitizer_common/sanitizer_fuchsia.h+7
...@@ -32,6 +32,13 @@ struct MemoryMappingLayoutData {...@@ -32,6 +32,13 @@ struct MemoryMappingLayoutData {
3232
33void InitShadowBounds();33void InitShadowBounds();
3434
35// Individual sanitizers can define this to explicitly run something at the end
36// of `__sanitizer_startup_hook`. This can be useful if a sanitizer needs to do
37// extra work after the common startup hook code is called and before module
38// ctors are invoked. For example, hwasan can explicitly call its initializing
39// function here so it can be set up before libc extensions are initialized.
40void EarlySanitizerInit();
41
35} // namespace __sanitizer42} // namespace __sanitizer
3643
37#endif // SANITIZER_FUCHSIA44#endif // SANITIZER_FUCHSIA
lib/libtsan/sanitizer_common/sanitizer_haiku.cpp created+361
...@@ -0,0 +1,361 @@
1//===-- sanitizer_haiku.cpp -----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is shared between Sanitizer run-time libraries and implements
10// Haiku-specific functions from sanitizer_libc.h.
11//===----------------------------------------------------------------------===//
12
13#include "sanitizer_platform.h"
14
15#if SANITIZER_HAIKU
16
17# include "sanitizer_common.h"
18# include "sanitizer_flags.h"
19# include "sanitizer_getauxval.h"
20# include "sanitizer_internal_defs.h"
21# include "sanitizer_libc.h"
22# include "sanitizer_linux.h"
23# include "sanitizer_mutex.h"
24# include "sanitizer_placement_new.h"
25# include "sanitizer_procmaps.h"
26
27# include <sys/param.h>
28# include <sys/types.h>
29
30# include <sys/mman.h>
31# include <sys/resource.h>
32# include <sys/stat.h>
33# include <sys/time.h>
34
35# include <dlfcn.h>
36# include <errno.h>
37# include <fcntl.h>
38# include <limits.h>
39# include <link.h>
40# include <pthread.h>
41# include <sched.h>
42# include <signal.h>
43# include <unistd.h>
44
45# include "system/vm_defs.h"
46# include "system/syscalls.h"
47# include "shared/syscall_utils.h"
48
49namespace __sanitizer {
50
51static void *GetRealLibcAddress(const char *symbol) {
52 void *real = dlsym(RTLD_NEXT, symbol);
53 if (!real)
54 real = dlsym(RTLD_DEFAULT, symbol);
55 if (!real) {
56 Printf("GetRealLibcAddress failed for symbol=%s", symbol);
57 Die();
58 }
59 return real;
60}
61
62# define _REAL(func, ...) real##_##func(__VA_ARGS__)
63# define DEFINE__REAL(ret_type, func, ...) \
64 static ret_type (*real_##func)(__VA_ARGS__) = NULL; \
65 if (!real_##func) { \
66 real_##func = (ret_type(*)(__VA_ARGS__))GetRealLibcAddress(#func); \
67 } \
68 CHECK(real_##func);
69
70// --------------- sanitizer_libc.h
71uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
72 u64 offset) {
73 if ((flags & MAP_ANONYMOUS) != 0)
74 fd = -1;
75
76 int mapping =
77 (flags & MAP_SHARED) != 0 ? REGION_NO_PRIVATE_MAP : REGION_PRIVATE_MAP;
78
79 uint32 addressSpec;
80 if ((flags & MAP_FIXED) != 0)
81 addressSpec = B_EXACT_ADDRESS;
82 else if (addr != NULL)
83 addressSpec = B_BASE_ADDRESS;
84 else
85 addressSpec = B_RANDOMIZED_ANY_ADDRESS;
86
87 uint32 areaProtection = 0;
88 if ((prot & PROT_READ) != 0)
89 areaProtection |= B_READ_AREA;
90 if ((prot & PROT_WRITE) != 0)
91 areaProtection |= B_WRITE_AREA;
92 if ((prot & PROT_EXEC) != 0)
93 areaProtection |= B_EXECUTE_AREA;
94
95 if ((flags & MAP_NORESERVE) != 0)
96 areaProtection |= B_OVERCOMMITTING_AREA;
97
98 area_id area = _kern_map_file("sanitizer mmap", &addr, addressSpec, length,
99 areaProtection, mapping, true, fd, offset);
100 if (area < 0)
101 RETURN_AND_SET_ERRNO(area);
102 return (uptr)addr;
103}
104
105uptr internal_munmap(void *addr, uptr length) {
106 DEFINE__REAL(int, munmap, void *a, uptr b);
107 return _REAL(munmap, addr, length);
108}
109
110uptr internal_mremap(void *old_address, uptr old_size, uptr new_size, int flags,
111 void *new_address) {
112 CHECK(false && "internal_mremap is unimplemented on Haiku");
113 return 0;
114}
115
116int internal_mprotect(void *addr, uptr length, int prot) {
117 DEFINE__REAL(int, mprotect, void *a, uptr b, int c);
118 return _REAL(mprotect, addr, length, prot);
119}
120
121int internal_madvise(uptr addr, uptr length, int advice) {
122 DEFINE__REAL(int, madvise, void *a, uptr b, int c);
123 return _REAL(madvise, (void *)addr, length, advice);
124}
125
126uptr internal_close(fd_t fd) {
127 CHECK(&_kern_close);
128 RETURN_AND_SET_ERRNO(_kern_close(fd));
129}
130
131uptr internal_open(const char *filename, int flags) {
132 CHECK(&_kern_open);
133 RETURN_AND_SET_ERRNO(_kern_open(-1, filename, flags, 0));
134}
135
136uptr internal_open(const char *filename, int flags, u32 mode) {
137 CHECK(&_kern_open);
138 RETURN_AND_SET_ERRNO(_kern_open(-1, filename, flags, mode));
139}
140
141uptr internal_read(fd_t fd, void *buf, uptr count) {
142 sptr res;
143 CHECK(&_kern_read);
144 HANDLE_EINTR(res, (sptr)_kern_read(fd, -1, buf, (size_t)count));
145 RETURN_AND_SET_ERRNO(res);
146 return res;
147}
148
149uptr internal_write(fd_t fd, const void *buf, uptr count) {
150 sptr res;
151 CHECK(&_kern_write);
152 HANDLE_EINTR(res, (sptr)_kern_write(fd, -1, buf, count));
153 RETURN_AND_SET_ERRNO(res);
154 return res;
155}
156
157uptr internal_ftruncate(fd_t fd, uptr size) {
158 sptr res;
159 DEFINE__REAL(int, ftruncate, int, off_t);
160 return _REAL(ftruncate, fd, size);
161 return res;
162}
163
164uptr internal_stat(const char *path, void *buf) {
165 DEFINE__REAL(int, _stat_current, const char *a, void *b);
166 return _REAL(_stat_current, path, buf);
167}
168
169uptr internal_lstat(const char *path, void *buf) {
170 DEFINE__REAL(int, _lstat_current, const char *a, void *b);
171 return _REAL(_lstat_current, path, buf);
172}
173
174uptr internal_fstat(fd_t fd, void *buf) {
175 DEFINE__REAL(int, _fstat_current, int a, void *b);
176 return _REAL(_fstat_current, fd, buf);
177}
178
179uptr internal_filesize(fd_t fd) {
180 struct stat st;
181 if (internal_fstat(fd, &st))
182 return -1;
183 return (uptr)st.st_size;
184}
185
186uptr internal_dup(int oldfd) {
187 DEFINE__REAL(int, dup, int a);
188 return _REAL(dup, oldfd);
189}
190
191uptr internal_dup2(int oldfd, int newfd) {
192 DEFINE__REAL(int, dup2, int a, int b);
193 return _REAL(dup2, oldfd, newfd);
194}
195
196uptr internal_readlink(const char *path, char *buf, uptr bufsize) {
197 CHECK(&_kern_read_link);
198 RETURN_AND_SET_ERRNO(_kern_read_link(-1, path, buf, &bufsize));
199}
200
201uptr internal_unlink(const char *path) {
202 DEFINE__REAL(int, unlink, const char *a);
203 return _REAL(unlink, path);
204}
205
206uptr internal_rename(const char *oldpath, const char *newpath) {
207 DEFINE__REAL(int, rename, const char *a, const char *b);
208 return _REAL(rename, oldpath, newpath);
209}
210
211uptr internal_sched_yield() {
212 CHECK(&_kern_thread_yield);
213 _kern_thread_yield();
214 return 0;
215}
216
217void internal__exit(int exitcode) {
218 DEFINE__REAL(void, _exit, int a);
219 _REAL(_exit, exitcode);
220 Die(); // Unreachable.
221}
222
223void internal_usleep(u64 useconds) {
224 _kern_snooze_etc(useconds, B_SYSTEM_TIMEBASE, B_RELATIVE_TIMEOUT, NULL);
225}
226
227uptr internal_execve(const char *filename, char *const argv[],
228 char *const envp[]) {
229 DEFINE__REAL(int, execve, const char *, char *const[], char *const[]);
230 return _REAL(execve, filename, argv, envp);
231}
232
233# if 0
234tid_t GetTid() {
235 DEFINE__REAL(int, _lwp_self);
236 return _REAL(_lwp_self);
237}
238
239int TgKill(pid_t pid, tid_t tid, int sig) {
240 DEFINE__REAL(int, _lwp_kill, int a, int b);
241 (void)pid;
242 return _REAL(_lwp_kill, tid, sig);
243}
244
245u64 NanoTime() {
246 timeval tv;
247 DEFINE__REAL(int, __gettimeofday50, void *a, void *b);
248 internal_memset(&tv, 0, sizeof(tv));
249 _REAL(__gettimeofday50, &tv, 0);
250 return (u64)tv.tv_sec * 1000 * 1000 * 1000 + tv.tv_usec * 1000;
251}
252# endif
253
254uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
255 DEFINE__REAL(int, __clock_gettime50, __sanitizer_clockid_t a, void *b);
256 return _REAL(__clock_gettime50, clk_id, tp);
257}
258
259uptr internal_ptrace(int request, int pid, void *addr, int data) {
260 DEFINE__REAL(int, ptrace, int a, int b, void *c, int d);
261 return _REAL(ptrace, request, pid, addr, data);
262}
263
264uptr internal_waitpid(int pid, int *status, int options) {
265 DEFINE__REAL(int, waitpid, pid_t, int *, int);
266 return _REAL(waitpid, pid, status, options);
267}
268
269uptr internal_getpid() {
270 DEFINE__REAL(int, getpid);
271 return _REAL(getpid);
272}
273
274uptr internal_getppid() {
275 DEFINE__REAL(int, getppid);
276 return _REAL(getppid);
277}
278
279int internal_dlinfo(void *handle, int request, void *p) {
280 DEFINE__REAL(int, dlinfo, void *a, int b, void *c);
281 return _REAL(dlinfo, handle, request, p);
282}
283
284uptr internal_getdents(fd_t fd, void *dirp, unsigned int count) {
285 DEFINE__REAL(int, __getdents30, int a, void *b, size_t c);
286 return _REAL(__getdents30, fd, dirp, count);
287}
288
289uptr internal_lseek(fd_t fd, OFF_T offset, int whence) {
290 CHECK(&_kern_seek);
291 off_t result = _kern_seek(fd, offset, whence);
292 if (result < 0) {
293 errno = result;
294 return -1;
295 }
296 return result;
297}
298
299uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5) {
300 Printf("internal_prctl not implemented for Haiku");
301 Die();
302 return 0;
303}
304
305uptr internal_sigaltstack(const void *ss, void *oss) {
306 DEFINE__REAL(int, __sigaltstack14, const void *a, void *b);
307 return _REAL(__sigaltstack14, ss, oss);
308}
309
310int internal_fork() {
311 DEFINE__REAL(int, fork);
312 return _REAL(fork);
313}
314
315# if 0
316int internal_sysctl(const int *name, unsigned int namelen, void *oldp,
317 uptr *oldlenp, const void *newp, uptr newlen) {
318 CHECK(&__sysctl);
319 return __sysctl(name, namelen, oldp, (size_t *)oldlenp, newp, (size_t)newlen);
320}
321# endif
322
323int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp,
324 const void *newp, uptr newlen) {
325 DEFINE__REAL(int, sysctlbyname, const char *a, void *b, size_t *c,
326 const void *d, size_t e);
327 return _REAL(sysctlbyname, sname, oldp, (size_t *)oldlenp, newp,
328 (size_t)newlen);
329}
330
331uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
332 __sanitizer_sigset_t *oldset) {
333 CHECK(&_kern_set_signal_mask);
334 return _kern_set_signal_mask(how, set, oldset);
335}
336
337void internal_sigfillset(__sanitizer_sigset_t *set) {
338 DEFINE__REAL(int, __sigfillset14, const void *a);
339 (void)_REAL(__sigfillset14, set);
340}
341
342void internal_sigemptyset(__sanitizer_sigset_t *set) {
343 DEFINE__REAL(int, __sigemptyset14, const void *a);
344 (void)_REAL(__sigemptyset14, set);
345}
346
347void internal_sigdelset(__sanitizer_sigset_t *set, int signo) {
348 DEFINE__REAL(int, __sigdelset14, const void *a, int b);
349 (void)_REAL(__sigdelset14, set, signo);
350}
351
352uptr internal_clone(int (*fn)(void *), void *child_stack, int flags,
353 void *arg) {
354 DEFINE__REAL(int, clone, int (*a)(void *b), void *c, int d, void *e);
355
356 return _REAL(clone, fn, child_stack, flags, arg);
357}
358
359} // namespace __sanitizer
360
361#endif
lib/libtsan/sanitizer_common/sanitizer_linux.cpp+75-68
...@@ -14,7 +14,7 @@...@@ -14,7 +14,7 @@
14#include "sanitizer_platform.h"14#include "sanitizer_platform.h"
1515
16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
17 SANITIZER_SOLARIS17 SANITIZER_SOLARIS || SANITIZER_HAIKU
1818
19# include "sanitizer_common.h"19# include "sanitizer_common.h"
20# include "sanitizer_flags.h"20# include "sanitizer_flags.h"
...@@ -63,15 +63,17 @@...@@ -63,15 +63,17 @@
63# include <sched.h>63# include <sched.h>
64# include <signal.h>64# include <signal.h>
65# include <sys/mman.h>65# include <sys/mman.h>
66# if !SANITIZER_SOLARIS66# if !SANITIZER_SOLARIS && !SANITIZER_HAIKU
67# include <sys/ptrace.h>67# include <sys/ptrace.h>
68# endif68# endif
69# include <sys/resource.h>69# include <sys/resource.h>
70# include <sys/stat.h>70# include <sys/stat.h>
71# include <sys/syscall.h>71# if !SANITIZER_HAIKU
72# include <sys/syscall.h>
73# include <ucontext.h>
74# endif
72# include <sys/time.h>75# include <sys/time.h>
73# include <sys/types.h>76# include <sys/types.h>
74# include <ucontext.h>
75# include <unistd.h>77# include <unistd.h>
7678
77# if SANITIZER_LINUX79# if SANITIZER_LINUX
...@@ -82,6 +84,12 @@...@@ -82,6 +84,12 @@
82# include <sys/personality.h>84# include <sys/personality.h>
83# endif85# endif
8486
87# if SANITIZER_ANDROID && __ANDROID_API__ < 35
88// The weak `strerrorname_np` (introduced in API level 35) definition,
89// allows for checking the API level at runtime.
90extern "C" SANITIZER_WEAK_ATTRIBUTE const char *strerrorname_np(int);
91# endif
92
85# if SANITIZER_LINUX && defined(__loongarch__)93# if SANITIZER_LINUX && defined(__loongarch__)
86# include <sys/sysmacros.h>94# include <sys/sysmacros.h>
87# endif95# endif
...@@ -118,6 +126,13 @@ extern struct ps_strings *__ps_strings;...@@ -118,6 +126,13 @@ extern struct ps_strings *__ps_strings;
118# define environ _environ126# define environ _environ
119# endif127# endif
120128
129# if SANITIZER_HAIKU
130# include <OS.h>
131# include <elf.h>
132# include <image.h>
133extern "C" char **__libc_argv;
134# endif
135
121extern char **environ;136extern char **environ;
122137
123# if SANITIZER_LINUX138# if SANITIZER_LINUX
...@@ -246,7 +261,7 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }...@@ -246,7 +261,7 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
246# endif261# endif
247262
248// --------------- sanitizer_libc.h263// --------------- sanitizer_libc.h
249# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD264# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_HAIKU
250# if !SANITIZER_S390265# if !SANITIZER_S390
251uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,266uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
252 u64 offset) {267 u64 offset) {
...@@ -591,9 +606,9 @@ uptr internal_execve(const char *filename, char *const argv[],...@@ -591,9 +606,9 @@ uptr internal_execve(const char *filename, char *const argv[],
591 return internal_syscall(SYSCALL(execve), (uptr)filename, (uptr)argv,606 return internal_syscall(SYSCALL(execve), (uptr)filename, (uptr)argv,
592 (uptr)envp);607 (uptr)envp);
593}608}
594# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD609# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_HAIKU
595610
596# if !SANITIZER_NETBSD611# if !SANITIZER_NETBSD && !SANITIZER_HAIKU
597void internal__exit(int exitcode) {612void internal__exit(int exitcode) {
598# if SANITIZER_FREEBSD || SANITIZER_SOLARIS613# if SANITIZER_FREEBSD || SANITIZER_SOLARIS
599 internal_syscall(SYSCALL(exit), exitcode);614 internal_syscall(SYSCALL(exit), exitcode);
...@@ -602,7 +617,7 @@ void internal__exit(int exitcode) {...@@ -602,7 +617,7 @@ void internal__exit(int exitcode) {
602# endif617# endif
603 Die(); // Unreachable.618 Die(); // Unreachable.
604}619}
605# endif // !SANITIZER_NETBSD620# endif // !SANITIZER_NETBSD && !SANITIZER_HAIKU
606621
607// ----------------- sanitizer_common.h622// ----------------- sanitizer_common.h
608bool FileExists(const char *filename) {623bool FileExists(const char *filename) {
...@@ -630,6 +645,8 @@ tid_t GetTid() {...@@ -630,6 +645,8 @@ tid_t GetTid() {
630 return Tid;645 return Tid;
631# elif SANITIZER_SOLARIS646# elif SANITIZER_SOLARIS
632 return thr_self();647 return thr_self();
648# elif SANITIZER_HAIKU
649 return find_thread(NULL);
633# else650# else
634 return internal_syscall(SYSCALL(gettid));651 return internal_syscall(SYSCALL(gettid));
635# endif652# endif
...@@ -645,6 +662,8 @@ int TgKill(pid_t pid, tid_t tid, int sig) {...@@ -645,6 +662,8 @@ int TgKill(pid_t pid, tid_t tid, int sig) {
645 errno = thr_kill(tid, sig);662 errno = thr_kill(tid, sig);
646 // TgKill is expected to return -1 on error, not an errno.663 // TgKill is expected to return -1 on error, not an errno.
647 return errno != 0 ? -1 : 0;664 return errno != 0 ? -1 : 0;
665# elif SANITIZER_HAIKU
666 return kill_thread(tid);
648# endif667# endif
649}668}
650# endif669# endif
...@@ -672,7 +691,8 @@ u64 NanoTime() {...@@ -672,7 +691,8 @@ u64 NanoTime() {
672// 'environ' array (on some others) and does not use libc. This function691// 'environ' array (on some others) and does not use libc. This function
673// should be called first inside __asan_init.692// should be called first inside __asan_init.
674const char *GetEnv(const char *name) {693const char *GetEnv(const char *name) {
675# if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_SOLARIS694# if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_SOLARIS || \
695 SANITIZER_HAIKU
676 if (::environ != 0) {696 if (::environ != 0) {
677 uptr NameLen = internal_strlen(name);697 uptr NameLen = internal_strlen(name);
678 for (char **Env = ::environ; *Env != 0; Env++) {698 for (char **Env = ::environ; *Env != 0; Env++) {
...@@ -710,13 +730,14 @@ const char *GetEnv(const char *name) {...@@ -710,13 +730,14 @@ const char *GetEnv(const char *name) {
710# endif730# endif
711}731}
712732
713# if !SANITIZER_FREEBSD && !SANITIZER_NETBSD && !SANITIZER_GO733# if !SANITIZER_HAIKU && !SANITIZER_FREEBSD && !SANITIZER_NETBSD && \
734 !SANITIZER_GO
714extern "C" {735extern "C" {
715SANITIZER_WEAK_ATTRIBUTE extern void *__libc_stack_end;736SANITIZER_WEAK_ATTRIBUTE extern void *__libc_stack_end;
716}737}
717# endif738# endif
718739
719# if !SANITIZER_FREEBSD && !SANITIZER_NETBSD740# if !SANITIZER_HAIKU && !SANITIZER_FREEBSD && !SANITIZER_NETBSD
720static void ReadNullSepFileToArray(const char *path, char ***arr,741static void ReadNullSepFileToArray(const char *path, char ***arr,
721 int arr_size) {742 int arr_size) {
722 char *buff;743 char *buff;
...@@ -743,7 +764,10 @@ static void ReadNullSepFileToArray(const char *path, char ***arr,...@@ -743,7 +764,10 @@ static void ReadNullSepFileToArray(const char *path, char ***arr,
743# endif764# endif
744765
745static void GetArgsAndEnv(char ***argv, char ***envp) {766static void GetArgsAndEnv(char ***argv, char ***envp) {
746# if SANITIZER_FREEBSD767# if SANITIZER_HAIKU
768 *argv = __libc_argv;
769 *envp = environ;
770# elif SANITIZER_FREEBSD
747 // On FreeBSD, retrieving the argument and environment arrays is done via the771 // On FreeBSD, retrieving the argument and environment arrays is done via the
748 // kern.ps_strings sysctl, which returns a pointer to a structure containing772 // kern.ps_strings sysctl, which returns a pointer to a structure containing
749 // this information. See also <sys/exec.h>.773 // this information. See also <sys/exec.h>.
...@@ -783,7 +807,7 @@ static void GetArgsAndEnv(char ***argv, char ***envp) {...@@ -783,7 +807,7 @@ static void GetArgsAndEnv(char ***argv, char ***envp) {
783# if !SANITIZER_GO807# if !SANITIZER_GO
784 }808 }
785# endif // !SANITIZER_GO809# endif // !SANITIZER_GO
786# endif // SANITIZER_FREEBSD810# endif // SANITIZER_HAIKU
787}811}
788812
789char **GetArgv() {813char **GetArgv() {
...@@ -802,7 +826,7 @@ char **GetEnviron() {...@@ -802,7 +826,7 @@ char **GetEnviron() {
802void FutexWait(atomic_uint32_t *p, u32 cmp) {826void FutexWait(atomic_uint32_t *p, u32 cmp) {
803# if SANITIZER_FREEBSD827# if SANITIZER_FREEBSD
804 _umtx_op(p, UMTX_OP_WAIT_UINT, cmp, 0, 0);828 _umtx_op(p, UMTX_OP_WAIT_UINT, cmp, 0, 0);
805# elif SANITIZER_NETBSD829# elif SANITIZER_NETBSD || SANITIZER_HAIKU
806 sched_yield(); /* No userspace futex-like synchronization */830 sched_yield(); /* No userspace futex-like synchronization */
807# else831# else
808 internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAIT_PRIVATE, cmp, 0, 0, 0);832 internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAIT_PRIVATE, cmp, 0, 0, 0);
...@@ -812,7 +836,7 @@ void FutexWait(atomic_uint32_t *p, u32 cmp) {...@@ -812,7 +836,7 @@ void FutexWait(atomic_uint32_t *p, u32 cmp) {
812void FutexWake(atomic_uint32_t *p, u32 count) {836void FutexWake(atomic_uint32_t *p, u32 count) {
813# if SANITIZER_FREEBSD837# if SANITIZER_FREEBSD
814 _umtx_op(p, UMTX_OP_WAKE, count, 0, 0);838 _umtx_op(p, UMTX_OP_WAKE, count, 0, 0);
815# elif SANITIZER_NETBSD839# elif SANITIZER_NETBSD || SANITIZER_HAIKU
816 /* No userspace futex-like synchronization */840 /* No userspace futex-like synchronization */
817# else841# else
818 internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAKE_PRIVATE, count, 0, 0, 0);842 internal_syscall(SYSCALL(futex), (uptr)p, FUTEX_WAKE_PRIVATE, count, 0, 0, 0);
...@@ -844,7 +868,7 @@ struct linux_dirent {...@@ -844,7 +868,7 @@ struct linux_dirent {
844};868};
845# endif869# endif
846870
847# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD871# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_HAIKU
848// Syscall wrappers.872// Syscall wrappers.
849uptr internal_ptrace(int request, int pid, void *addr, void *data) {873uptr internal_ptrace(int request, int pid, void *addr, void *data) {
850 return internal_syscall(SYSCALL(ptrace), request, pid, (uptr)addr,874 return internal_syscall(SYSCALL(ptrace), request, pid, (uptr)addr,
...@@ -1058,7 +1082,7 @@ bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {...@@ -1058,7 +1082,7 @@ bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {
1058# endif1082# endif
1059# endif // !SANITIZER_SOLARIS1083# endif // !SANITIZER_SOLARIS
10601084
1061# if !SANITIZER_NETBSD1085# if !SANITIZER_NETBSD && !SANITIZER_HAIKU
1062// ThreadLister implementation.1086// ThreadLister implementation.
1063ThreadLister::ThreadLister(pid_t pid) : buffer_(4096) {1087ThreadLister::ThreadLister(pid_t pid) : buffer_(4096) {
1064 task_path_.AppendF("/proc/%d/task", pid);1088 task_path_.AppendF("/proc/%d/task", pid);
...@@ -1244,6 +1268,16 @@ uptr GetPageSize() {...@@ -1244,6 +1268,16 @@ uptr GetPageSize() {
1244 CHECK_EQ(rv, 0);1268 CHECK_EQ(rv, 0);
1245 return (uptr)pz;1269 return (uptr)pz;
1246# elif SANITIZER_USE_GETAUXVAL1270# elif SANITIZER_USE_GETAUXVAL
1271# if SANITIZER_ANDROID && __ANDROID_API__ < 35
1272 // The 16 KB page size was introduced in Android 15 (API level 35), while
1273 // earlier versions of Android always used a 4 KB page size.
1274 // We are checking the weak definition of `strerrorname_np` (introduced in API
1275 // level 35) because some earlier API levels crashed when
1276 // `getauxval(AT_PAGESZ)` was called from the `.preinit_array`.
1277 if (!strerrorname_np)
1278 return 4096;
1279# endif
1280
1247 return getauxval(AT_PAGESZ);1281 return getauxval(AT_PAGESZ);
1248# else1282# else
1249 return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy.1283 return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy.
...@@ -1252,7 +1286,19 @@ uptr GetPageSize() {...@@ -1252,7 +1286,19 @@ uptr GetPageSize() {
1252# endif1286# endif
12531287
1254uptr ReadBinaryName(/*out*/ char *buf, uptr buf_len) {1288uptr ReadBinaryName(/*out*/ char *buf, uptr buf_len) {
1255# if SANITIZER_SOLARIS1289# if SANITIZER_HAIKU
1290 int cookie = 0;
1291 image_info info;
1292 const char *argv0 = "<UNKNOWN>";
1293 while (get_next_image_info(B_CURRENT_TEAM, &cookie, &info) == B_OK) {
1294 if (info.type != B_APP_IMAGE)
1295 continue;
1296 argv0 = info.name;
1297 break;
1298 }
1299 internal_strncpy(buf, argv0, buf_len);
1300 return internal_strlen(buf);
1301# elif SANITIZER_SOLARIS
1256 const char *default_module_name = getexecname();1302 const char *default_module_name = getexecname();
1257 CHECK_NE(default_module_name, NULL);1303 CHECK_NE(default_module_name, NULL);
1258 return internal_snprintf(buf, buf_len, "%s", default_module_name);1304 return internal_snprintf(buf, buf_len, "%s", default_module_name);
...@@ -1318,11 +1364,11 @@ bool LibraryNameIs(const char *full_name, const char *base_name) {...@@ -1318,11 +1364,11 @@ bool LibraryNameIs(const char *full_name, const char *base_name) {
1318 return (name[base_name_length] == '-' || name[base_name_length] == '.');1364 return (name[base_name_length] == '-' || name[base_name_length] == '.');
1319}1365}
13201366
1321# if !SANITIZER_ANDROID1367# if !SANITIZER_ANDROID && !SANITIZER_HAIKU
1322// Call cb for each region mapped by map.1368// Call cb for each region mapped by map.
1323void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {1369void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {
1324 CHECK_NE(map, nullptr);1370 CHECK_NE(map, nullptr);
1325# if !SANITIZER_FREEBSD1371# if !SANITIZER_FREEBSD && !SANITIZER_HAIKU
1326 typedef ElfW(Phdr) Elf_Phdr;1372 typedef ElfW(Phdr) Elf_Phdr;
1327 typedef ElfW(Ehdr) Elf_Ehdr;1373 typedef ElfW(Ehdr) Elf_Ehdr;
1328# endif // !SANITIZER_FREEBSD1374# endif // !SANITIZER_FREEBSD
...@@ -1855,54 +1901,6 @@ int internal_uname(struct utsname *buf) {...@@ -1855,54 +1901,6 @@ int internal_uname(struct utsname *buf) {
1855}1901}
1856# endif1902# endif
18571903
1858# if SANITIZER_ANDROID
1859static int dl_iterate_phdr_test_cb(struct dl_phdr_info *info, size_t size,
1860 void *data) {
1861 // Any name starting with "lib" indicates a bug in L where library base names
1862 // are returned instead of paths.
1863 if (info->dlpi_name && info->dlpi_name[0] == 'l' &&
1864 info->dlpi_name[1] == 'i' && info->dlpi_name[2] == 'b') {
1865 *(bool *)data = true;
1866 return 1;
1867 }
1868 return 0;
1869}
1870
1871static atomic_uint32_t android_api_level;
1872
1873static AndroidApiLevel AndroidDetectApiLevelStatic() {
1874# if __ANDROID_API__ <= 22
1875 return ANDROID_LOLLIPOP_MR1;
1876# else
1877 return ANDROID_POST_LOLLIPOP;
1878# endif
1879}
1880
1881static AndroidApiLevel AndroidDetectApiLevel() {
1882 bool base_name_seen = false;
1883 dl_iterate_phdr(dl_iterate_phdr_test_cb, &base_name_seen);
1884 if (base_name_seen)
1885 return ANDROID_LOLLIPOP_MR1; // L MR1
1886 return ANDROID_POST_LOLLIPOP; // post-L
1887 // Plain L (API level 21) is completely broken wrt ASan and not very
1888 // interesting to detect.
1889}
1890
1891extern "C" __attribute__((weak)) void *_DYNAMIC;
1892
1893AndroidApiLevel AndroidGetApiLevel() {
1894 AndroidApiLevel level =
1895 (AndroidApiLevel)atomic_load(&android_api_level, memory_order_relaxed);
1896 if (level)
1897 return level;
1898 level = &_DYNAMIC == nullptr ? AndroidDetectApiLevelStatic()
1899 : AndroidDetectApiLevel();
1900 atomic_store(&android_api_level, level, memory_order_relaxed);
1901 return level;
1902}
1903
1904# endif
1905
1906static HandleSignalMode GetHandleSignalModeImpl(int signum) {1904static HandleSignalMode GetHandleSignalModeImpl(int signum) {
1907 switch (signum) {1905 switch (signum) {
1908 case SIGABRT:1906 case SIGABRT:
...@@ -1981,11 +1979,15 @@ using Context = ucontext_t;...@@ -1981,11 +1979,15 @@ using Context = ucontext_t;
1981SignalContext::WriteFlag SignalContext::GetWriteFlag() const {1979SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
1982 Context *ucontext = (Context *)context;1980 Context *ucontext = (Context *)context;
1983# if defined(__x86_64__) || defined(__i386__)1981# if defined(__x86_64__) || defined(__i386__)
1982# if !SANITIZER_HAIKU
1984 static const uptr PF_WRITE = 1U << 1;1983 static const uptr PF_WRITE = 1U << 1;
1984# endif
1985# if SANITIZER_FREEBSD1985# if SANITIZER_FREEBSD
1986 uptr err = ucontext->uc_mcontext.mc_err;1986 uptr err = ucontext->uc_mcontext.mc_err;
1987# elif SANITIZER_NETBSD1987# elif SANITIZER_NETBSD
1988 uptr err = ucontext->uc_mcontext.__gregs[_REG_ERR];1988 uptr err = ucontext->uc_mcontext.__gregs[_REG_ERR];
1989# elif SANITIZER_HAIKU
1990 uptr err = ucontext->uc_mcontext.r13;
1989# elif SANITIZER_SOLARIS && defined(__i386__)1991# elif SANITIZER_SOLARIS && defined(__i386__)
1990 const int Err = 13;1992 const int Err = 13;
1991 uptr err = ucontext->uc_mcontext.gregs[Err];1993 uptr err = ucontext->uc_mcontext.gregs[Err];
...@@ -2598,6 +2600,11 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {...@@ -2598,6 +2600,11 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
2598 *pc = ucontext->uc_mcontext.mc_rip;2600 *pc = ucontext->uc_mcontext.mc_rip;
2599 *bp = ucontext->uc_mcontext.mc_rbp;2601 *bp = ucontext->uc_mcontext.mc_rbp;
2600 *sp = ucontext->uc_mcontext.mc_rsp;2602 *sp = ucontext->uc_mcontext.mc_rsp;
2603# elif SANITIZER_HAIKU
2604 ucontext_t *ucontext = (ucontext_t *)context;
2605 *pc = ucontext->uc_mcontext.rip;
2606 *bp = ucontext->uc_mcontext.rbp;
2607 *sp = ucontext->uc_mcontext.rsp;
2601# else2608# else
2602 ucontext_t *ucontext = (ucontext_t *)context;2609 ucontext_t *ucontext = (ucontext_t *)context;
2603 *pc = ucontext->uc_mcontext.gregs[REG_RIP];2610 *pc = ucontext->uc_mcontext.gregs[REG_RIP];
lib/libtsan/sanitizer_common/sanitizer_linux.h+8-2
...@@ -14,7 +14,7 @@...@@ -14,7 +14,7 @@
1414
15#include "sanitizer_platform.h"15#include "sanitizer_platform.h"
16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
17 SANITIZER_SOLARIS17 SANITIZER_SOLARIS || SANITIZER_HAIKU
18# include "sanitizer_common.h"18# include "sanitizer_common.h"
19# include "sanitizer_internal_defs.h"19# include "sanitizer_internal_defs.h"
20# include "sanitizer_platform_limits_freebsd.h"20# include "sanitizer_platform_limits_freebsd.h"
...@@ -31,6 +31,11 @@ namespace __sanitizer {...@@ -31,6 +31,11 @@ namespace __sanitizer {
31// the one in <dirent.h>, which is used by readdir().31// the one in <dirent.h>, which is used by readdir().
32struct linux_dirent;32struct linux_dirent;
3333
34# if SANITIZER_HAIKU
35struct MemoryMappingLayoutData {
36 long signed int cookie;
37};
38# else
34struct ProcSelfMapsBuff {39struct ProcSelfMapsBuff {
35 char *data;40 char *data;
36 uptr mmaped_size;41 uptr mmaped_size;
...@@ -43,6 +48,7 @@ struct MemoryMappingLayoutData {...@@ -43,6 +48,7 @@ struct MemoryMappingLayoutData {
43};48};
4449
45void ReadProcMaps(ProcSelfMapsBuff *proc_maps);50void ReadProcMaps(ProcSelfMapsBuff *proc_maps);
51# endif // SANITIZER_HAIKU
4652
47// Syscall wrappers.53// Syscall wrappers.
48uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);54uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count);
...@@ -124,7 +130,7 @@ bool LibraryNameIs(const char *full_name, const char *base_name);...@@ -124,7 +130,7 @@ bool LibraryNameIs(const char *full_name, const char *base_name);
124// Call cb for each region mapped by map.130// Call cb for each region mapped by map.
125void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));131void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
126132
127// Releases memory pages entirely within the [beg, end] address range.133// Releases memory pages entirely within the [beg, end) address range.
128// The pages no longer count toward RSS; reads are guaranteed to return 0.134// The pages no longer count toward RSS; reads are guaranteed to return 0.
129// Requires (but does not verify!) that pages are MAP_PRIVATE.135// Requires (but does not verify!) that pages are MAP_PRIVATE.
130inline void ReleaseMemoryPagesToOSAndZeroFill(uptr beg, uptr end) {136inline void ReleaseMemoryPagesToOSAndZeroFill(uptr beg, uptr end) {
lib/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp+33-82
...@@ -14,7 +14,7 @@...@@ -14,7 +14,7 @@
14#include "sanitizer_platform.h"14#include "sanitizer_platform.h"
1515
16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \16#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
17 SANITIZER_SOLARIS17 SANITIZER_SOLARIS || SANITIZER_HAIKU
1818
19# include "sanitizer_allocator_internal.h"19# include "sanitizer_allocator_internal.h"
20# include "sanitizer_atomic.h"20# include "sanitizer_atomic.h"
...@@ -28,8 +28,19 @@...@@ -28,8 +28,19 @@
28# include "sanitizer_procmaps.h"28# include "sanitizer_procmaps.h"
29# include "sanitizer_solaris.h"29# include "sanitizer_solaris.h"
3030
31# if SANITIZER_HAIKU
32# define _DEFAULT_SOURCE
33# endif
34
31# if SANITIZER_NETBSD35# if SANITIZER_NETBSD
32# define _RTLD_SOURCE // for __lwp_gettcb_fast() / __lwp_getprivate_fast()36# // for __lwp_gettcb_fast() / __lwp_getprivate_fast()
37# define _RTLD_SOURCE
38# include <machine/mcontext.h>
39# undef _RTLD_SOURCE
40# include <sys/param.h>
41# if __NetBSD_Version__ >= 1099001200
42# include <machine/lwp_private.h>
43# endif
33# endif44# endif
3445
35# include <dlfcn.h> // for dlsym()46# include <dlfcn.h> // for dlsym()
...@@ -74,18 +85,9 @@ extern "C" int __sys_sigaction(int signum, const struct sigaction *act,...@@ -74,18 +85,9 @@ extern "C" int __sys_sigaction(int signum, const struct sigaction *act,
74# include <thread.h>85# include <thread.h>
75# endif86# endif
7687
77# if SANITIZER_ANDROID88# if SANITIZER_HAIKU
78# include <android/api-level.h>89# include <kernel/OS.h>
79# if !defined(CPU_COUNT) && !defined(__aarch64__)90# include <sys/link_elf.h>
80# include <dirent.h>
81# include <fcntl.h>
82struct __sanitizer::linux_dirent {
83 long d_ino;
84 off_t d_off;
85 unsigned short d_reclen;
86 char d_name[];
87};
88# endif
89# endif91# endif
9092
91# if !SANITIZER_ANDROID93# if !SANITIZER_ANDROID
...@@ -651,6 +653,7 @@ static void GetTls(uptr *addr, uptr *size) {...@@ -651,6 +653,7 @@ static void GetTls(uptr *addr, uptr *size) {
651 *addr = (uptr)tcb->tcb_dtv[1];653 *addr = (uptr)tcb->tcb_dtv[1];
652 }654 }
653 }655 }
656# elif SANITIZER_HAIKU
654# else657# else
655# error "Unknown OS"658# error "Unknown OS"
656# endif659# endif
...@@ -721,8 +724,13 @@ static int AddModuleSegments(const char *module_name, dl_phdr_info *info,...@@ -721,8 +724,13 @@ static int AddModuleSegments(const char *module_name, dl_phdr_info *info,
721 if (phdr->p_type == PT_LOAD) {724 if (phdr->p_type == PT_LOAD) {
722 uptr cur_beg = info->dlpi_addr + phdr->p_vaddr;725 uptr cur_beg = info->dlpi_addr + phdr->p_vaddr;
723 uptr cur_end = cur_beg + phdr->p_memsz;726 uptr cur_end = cur_beg + phdr->p_memsz;
727# if SANITIZER_HAIKU
728 bool executable = phdr->p_flags & PF_EXECUTE;
729 bool writable = phdr->p_flags & PF_WRITE;
730# else
724 bool executable = phdr->p_flags & PF_X;731 bool executable = phdr->p_flags & PF_X;
725 bool writable = phdr->p_flags & PF_W;732 bool writable = phdr->p_flags & PF_W;
733# endif
726 cur_module.addAddressRange(cur_beg, cur_end, executable, writable);734 cur_module.addAddressRange(cur_beg, cur_end, executable, writable);
727 } else if (phdr->p_type == PT_NOTE) {735 } else if (phdr->p_type == PT_NOTE) {
728# ifdef NT_GNU_BUILD_ID736# ifdef NT_GNU_BUILD_ID
...@@ -774,42 +782,13 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {...@@ -774,42 +782,13 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
774 return 0;782 return 0;
775}783}
776784
777static bool requiresProcmaps() {
778# if SANITIZER_ANDROID && __ANDROID_API__ <= 22
779 // Fall back to /proc/maps if dl_iterate_phdr is unavailable or broken.
780 // The runtime check allows the same library to work with
781 // both K and L (and future) Android releases.
782 return AndroidGetApiLevel() <= ANDROID_LOLLIPOP_MR1;
783# else
784 return false;
785# endif
786}
787
788static void procmapsInit(InternalMmapVectorNoCtor<LoadedModule> *modules) {
789 MemoryMappingLayout memory_mapping(/*cache_enabled*/ true);
790 memory_mapping.DumpListOfModules(modules);
791}
792
793void ListOfModules::init() {785void ListOfModules::init() {
794 clearOrInit();786 clearOrInit();
795 if (requiresProcmaps()) {787 DlIteratePhdrData data = {&modules_, true};
796 procmapsInit(&modules_);788 dl_iterate_phdr(dl_iterate_phdr_cb, &data);
797 } else {
798 DlIteratePhdrData data = {&modules_, true};
799 dl_iterate_phdr(dl_iterate_phdr_cb, &data);
800 }
801}789}
802790
803// When a custom loader is used, dl_iterate_phdr may not contain the full791void ListOfModules::fallbackInit() { clear(); }
804// list of modules. Allow callers to fall back to using procmaps.
805void ListOfModules::fallbackInit() {
806 if (!requiresProcmaps()) {
807 clearOrInit();
808 procmapsInit(&modules_);
809 } else {
810 clear();
811 }
812}
813792
814// getrusage does not give us the current RSS, only the max RSS.793// getrusage does not give us the current RSS, only the max RSS.
815// Still, this is better than nothing if /proc/self/statm is not available794// Still, this is better than nothing if /proc/self/statm is not available
...@@ -855,45 +834,17 @@ u32 GetNumberOfCPUs() {...@@ -855,45 +834,17 @@ u32 GetNumberOfCPUs() {
855 int req[2];834 int req[2];
856 uptr len = sizeof(ncpu);835 uptr len = sizeof(ncpu);
857 req[0] = CTL_HW;836 req[0] = CTL_HW;
837# ifdef HW_NCPUONLINE
838 req[1] = HW_NCPUONLINE;
839# else
858 req[1] = HW_NCPU;840 req[1] = HW_NCPU;
841# endif
859 CHECK_EQ(internal_sysctl(req, 2, &ncpu, &len, NULL, 0), 0);842 CHECK_EQ(internal_sysctl(req, 2, &ncpu, &len, NULL, 0), 0);
860 return ncpu;843 return ncpu;
861# elif SANITIZER_ANDROID && !defined(CPU_COUNT) && !defined(__aarch64__)844# elif SANITIZER_HAIKU
862 // Fall back to /sys/devices/system/cpu on Android when cpu_set_t doesn't845 system_info info;
863 // exist in sched.h. That is the case for toolchains generated with older846 get_system_info(&info);
864 // NDKs.847 return info.cpu_count;
865 // This code doesn't work on AArch64 because internal_getdents makes use of
866 // the 64bit getdents syscall, but cpu_set_t seems to always exist on AArch64.
867 uptr fd = internal_open("/sys/devices/system/cpu", O_RDONLY | O_DIRECTORY);
868 if (internal_iserror(fd))
869 return 0;
870 InternalMmapVector<u8> buffer(4096);
871 uptr bytes_read = buffer.size();
872 uptr n_cpus = 0;
873 u8 *d_type;
874 struct linux_dirent *entry = (struct linux_dirent *)&buffer[bytes_read];
875 while (true) {
876 if ((u8 *)entry >= &buffer[bytes_read]) {
877 bytes_read = internal_getdents(fd, (struct linux_dirent *)buffer.data(),
878 buffer.size());
879 if (internal_iserror(bytes_read) || !bytes_read)
880 break;
881 entry = (struct linux_dirent *)buffer.data();
882 }
883 d_type = (u8 *)entry + entry->d_reclen - 1;
884 if (d_type >= &buffer[bytes_read] ||
885 (u8 *)&entry->d_name[3] >= &buffer[bytes_read])
886 break;
887 if (entry->d_ino != 0 && *d_type == DT_DIR) {
888 if (entry->d_name[0] == 'c' && entry->d_name[1] == 'p' &&
889 entry->d_name[2] == 'u' && entry->d_name[3] >= '0' &&
890 entry->d_name[3] <= '9')
891 n_cpus++;
892 }
893 entry = (struct linux_dirent *)(((u8 *)entry) + entry->d_reclen);
894 }
895 internal_close(fd);
896 return n_cpus;
897# elif SANITIZER_SOLARIS848# elif SANITIZER_SOLARIS
898 return sysconf(_SC_NPROCESSORS_ONLN);849 return sysconf(_SC_NPROCESSORS_ONLN);
899# else850# else
lib/libtsan/sanitizer_common/sanitizer_mac.cpp+29-38
...@@ -38,13 +38,6 @@...@@ -38,13 +38,6 @@
38extern char **environ;38extern char **environ;
39# endif39# endif
4040
41# if defined(__has_include) && __has_include(<os/trace.h>)
42# define SANITIZER_OS_TRACE 1
43# include <os/trace.h>
44# else
45# define SANITIZER_OS_TRACE 0
46# endif
47
48// Integrate with CrashReporter library if available41// Integrate with CrashReporter library if available
49# if defined(__has_include) && __has_include(<CrashReporterClient.h>)42# if defined(__has_include) && __has_include(<CrashReporterClient.h>)
50# define HAVE_CRASHREPORTERCLIENT_H 143# define HAVE_CRASHREPORTERCLIENT_H 1
...@@ -843,31 +836,23 @@ void LogMessageOnPrintf(const char *str) {...@@ -843,31 +836,23 @@ void LogMessageOnPrintf(const char *str) {
843}836}
844837
845void LogFullErrorReport(const char *buffer) {838void LogFullErrorReport(const char *buffer) {
846#if !SANITIZER_GO839# if !SANITIZER_GO
847 // Log with os_trace. This will make it into the crash log.840 // Log with os_log_error. This will make it into the crash log.
848#if SANITIZER_OS_TRACE841 if (internal_strncmp(SanitizerToolName, "AddressSanitizer",
849#pragma clang diagnostic push842 sizeof("AddressSanitizer") - 1) == 0)
850// os_trace is deprecated.843 os_log_error(OS_LOG_DEFAULT, "Address Sanitizer reported a failure.");
851#pragma clang diagnostic ignored "-Wdeprecated-declarations"844 else if (internal_strncmp(SanitizerToolName, "UndefinedBehaviorSanitizer",
852 if (GetMacosAlignedVersion() >= MacosVersion(10, 10)) {845 sizeof("UndefinedBehaviorSanitizer") - 1) == 0)
853 // os_trace requires the message (format parameter) to be a string literal.846 os_log_error(OS_LOG_DEFAULT,
854 if (internal_strncmp(SanitizerToolName, "AddressSanitizer",847 "Undefined Behavior Sanitizer reported a failure.");
855 sizeof("AddressSanitizer") - 1) == 0)848 else if (internal_strncmp(SanitizerToolName, "ThreadSanitizer",
856 os_trace("Address Sanitizer reported a failure.");849 sizeof("ThreadSanitizer") - 1) == 0)
857 else if (internal_strncmp(SanitizerToolName, "UndefinedBehaviorSanitizer",850 os_log_error(OS_LOG_DEFAULT, "Thread Sanitizer reported a failure.");
858 sizeof("UndefinedBehaviorSanitizer") - 1) == 0)851 else
859 os_trace("Undefined Behavior Sanitizer reported a failure.");852 os_log_error(OS_LOG_DEFAULT, "Sanitizer tool reported a failure.");
860 else if (internal_strncmp(SanitizerToolName, "ThreadSanitizer",853
861 sizeof("ThreadSanitizer") - 1) == 0)854 if (common_flags()->log_to_syslog)
862 os_trace("Thread Sanitizer reported a failure.");855 os_log_error(OS_LOG_DEFAULT, "Consult syslog for more information.");
863 else
864 os_trace("Sanitizer tool reported a failure.");
865
866 if (common_flags()->log_to_syslog)
867 os_trace("Consult syslog for more information.");
868 }
869#pragma clang diagnostic pop
870#endif
871856
872 // Log to syslog.857 // Log to syslog.
873 // The logging on OS X may call pthread_create so we need the threading858 // The logging on OS X may call pthread_create so we need the threading
...@@ -881,7 +866,7 @@ void LogFullErrorReport(const char *buffer) {...@@ -881,7 +866,7 @@ void LogFullErrorReport(const char *buffer) {
881 WriteToSyslog(buffer);866 WriteToSyslog(buffer);
882867
883 // The report is added to CrashLog as part of logging all of Printf output.868 // The report is added to CrashLog as part of logging all of Printf output.
884#endif869# endif // !SANITIZER_GO
885}870}
886871
887SignalContext::WriteFlag SignalContext::GetWriteFlag() const {872SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
...@@ -1203,13 +1188,14 @@ uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale,...@@ -1203,13 +1188,14 @@ uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale,
1203 const uptr left_padding =1188 const uptr left_padding =
1204 Max<uptr>(granularity, 1ULL << min_shadow_base_alignment);1189 Max<uptr>(granularity, 1ULL << min_shadow_base_alignment);
12051190
1206 uptr space_size = shadow_size_bytes + left_padding;1191 uptr space_size = shadow_size_bytes;
12071192
1208 uptr largest_gap_found = 0;1193 uptr largest_gap_found = 0;
1209 uptr max_occupied_addr = 0;1194 uptr max_occupied_addr = 0;
1195
1210 VReport(2, "FindDynamicShadowStart, space_size = %p\n", (void *)space_size);1196 VReport(2, "FindDynamicShadowStart, space_size = %p\n", (void *)space_size);
1211 uptr shadow_start =1197 uptr shadow_start =
1212 FindAvailableMemoryRange(space_size, alignment, granularity,1198 FindAvailableMemoryRange(space_size, alignment, left_padding,
1213 &largest_gap_found, &max_occupied_addr);1199 &largest_gap_found, &max_occupied_addr);
1214 // If the shadow doesn't fit, restrict the address space to make it fit.1200 // If the shadow doesn't fit, restrict the address space to make it fit.
1215 if (shadow_start == 0) {1201 if (shadow_start == 0) {
...@@ -1229,9 +1215,9 @@ uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale,...@@ -1229,9 +1215,9 @@ uptr MapDynamicShadow(uptr shadow_size_bytes, uptr shadow_scale,
1229 }1215 }
1230 RestrictMemoryToMaxAddress(new_max_vm);1216 RestrictMemoryToMaxAddress(new_max_vm);
1231 high_mem_end = new_max_vm - 1;1217 high_mem_end = new_max_vm - 1;
1232 space_size = (high_mem_end >> shadow_scale) + left_padding;1218 space_size = (high_mem_end >> shadow_scale);
1233 VReport(2, "FindDynamicShadowStart, space_size = %p\n", (void *)space_size);1219 VReport(2, "FindDynamicShadowStart, space_size = %p\n", (void *)space_size);
1234 shadow_start = FindAvailableMemoryRange(space_size, alignment, granularity,1220 shadow_start = FindAvailableMemoryRange(space_size, alignment, left_padding,
1235 nullptr, nullptr);1221 nullptr, nullptr);
1236 if (shadow_start == 0) {1222 if (shadow_start == 0) {
1237 Report("Unable to find a memory range after restricting VM.\n");1223 Report("Unable to find a memory range after restricting VM.\n");
...@@ -1272,10 +1258,15 @@ uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,...@@ -1272,10 +1258,15 @@ uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,
1272 mach_msg_type_number_t count = kRegionInfoSize;1258 mach_msg_type_number_t count = kRegionInfoSize;
1273 kr = mach_vm_region_recurse(mach_task_self(), &address, &vmsize, &depth,1259 kr = mach_vm_region_recurse(mach_task_self(), &address, &vmsize, &depth,
1274 (vm_region_info_t)&vminfo, &count);1260 (vm_region_info_t)&vminfo, &count);
1275 if (kr == KERN_INVALID_ADDRESS) {1261
1262 // There are cases where going beyond the processes' max vm does
1263 // not return KERN_INVALID_ADDRESS so we check for going beyond that
1264 // max address as well.
1265 if (kr == KERN_INVALID_ADDRESS || address > max_vm_address) {
1276 // No more regions beyond "address", consider the gap at the end of VM.1266 // No more regions beyond "address", consider the gap at the end of VM.
1277 address = max_vm_address;1267 address = max_vm_address;
1278 vmsize = 0;1268 vmsize = 0;
1269 kr = -1; // break after this iteration.
1279 } else {1270 } else {
1280 if (max_occupied_addr) *max_occupied_addr = address + vmsize;1271 if (max_occupied_addr) *max_occupied_addr = address + vmsize;
1281 }1272 }
lib/libtsan/sanitizer_common/sanitizer_mac.h+6-3
...@@ -37,9 +37,6 @@ struct VersionBase {...@@ -37,9 +37,6 @@ struct VersionBase {
3737
38 VersionBase(u16 major, u16 minor) : major(major), minor(minor) {}38 VersionBase(u16 major, u16 minor) : major(major), minor(minor) {}
3939
40 bool operator==(const VersionType &other) const {
41 return major == other.major && minor == other.minor;
42 }
43 bool operator>=(const VersionType &other) const {40 bool operator>=(const VersionType &other) const {
44 return major > other.major ||41 return major > other.major ||
45 (major == other.major && minor >= other.minor);42 (major == other.major && minor >= other.minor);
...@@ -47,6 +44,12 @@ struct VersionBase {...@@ -47,6 +44,12 @@ struct VersionBase {
47 bool operator<(const VersionType &other) const { return !(*this >= other); }44 bool operator<(const VersionType &other) const { return !(*this >= other); }
48};45};
4946
47template <typename VersionType>
48bool operator==(const VersionBase<VersionType> &self,
49 const VersionBase<VersionType> &other) {
50 return self.major == other.major && self.minor == other.minor;
51}
52
50struct MacosVersion : VersionBase<MacosVersion> {53struct MacosVersion : VersionBase<MacosVersion> {
51 MacosVersion(u16 major, u16 minor) : VersionBase(major, minor) {}54 MacosVersion(u16 major, u16 minor) : VersionBase(major, minor) {}
52};55};
lib/libtsan/sanitizer_common/sanitizer_malloc_mac.inc+16
...@@ -144,6 +144,22 @@ INTERCEPTOR(void, free, void *ptr) {...@@ -144,6 +144,22 @@ INTERCEPTOR(void, free, void *ptr) {
144 COMMON_MALLOC_FREE(ptr);144 COMMON_MALLOC_FREE(ptr);
145}145}
146146
147#if SANITIZER_INTERCEPT_FREE_SIZED && defined(COMMON_MALLOC_FREE_SIZED)
148INTERCEPTOR(void, free_sized, void *ptr, size_t size) {
149 COMMON_MALLOC_ENTER();
150 COMMON_MALLOC_FREE_SIZED(ptr, size);
151}
152#endif
153
154#if SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED && \
155 defined(COMMON_MALLOC_FREE_ALIGNED_SIZED)
156INTERCEPTOR(void, free_aligned_sized, void *ptr, size_t alignment,
157 size_t size) {
158 COMMON_MALLOC_ENTER();
159 COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size);
160}
161#endif
162
147INTERCEPTOR(void *, realloc, void *ptr, size_t size) {163INTERCEPTOR(void *, realloc, void *ptr, size_t size) {
148 COMMON_MALLOC_ENTER();164 COMMON_MALLOC_ENTER();
149 COMMON_MALLOC_REALLOC(ptr, size);165 COMMON_MALLOC_REALLOC(ptr, size);
lib/libtsan/sanitizer_common/sanitizer_platform.h+21-4
...@@ -14,7 +14,8 @@...@@ -14,7 +14,8 @@
1414
15#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \15#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
16 !defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) && \16 !defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) && \
17 !(defined(__sun__) && defined(__svr4__))17 !(defined(__sun__) && defined(__svr4__)) && !defined(__HAIKU__) && \
18 !defined(__wasi__)
18# error "This operating system is not supported"19# error "This operating system is not supported"
19#endif20#endif
2021
...@@ -55,6 +56,18 @@...@@ -55,6 +56,18 @@
55# define SANITIZER_SOLARIS 056# define SANITIZER_SOLARIS 0
56#endif57#endif
5758
59#if defined(__HAIKU__)
60# define SANITIZER_HAIKU 1
61#else
62# define SANITIZER_HAIKU 0
63#endif
64
65#if defined(__wasi__)
66# define SANITIZER_WASI 1
67#else
68# define SANITIZER_WASI 0
69#endif
70
58// - SANITIZER_APPLE: all Apple code71// - SANITIZER_APPLE: all Apple code
59// - TARGET_OS_OSX: macOS72// - TARGET_OS_OSX: macOS
60// - SANITIZER_IOS: devices (iOS and iOS-like)73// - SANITIZER_IOS: devices (iOS and iOS-like)
...@@ -136,9 +149,9 @@...@@ -136,9 +149,9 @@
136# define SANITIZER_MUSL 0149# define SANITIZER_MUSL 0
137#endif150#endif
138151
139#define SANITIZER_POSIX \152#define SANITIZER_POSIX \
140 (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \153 (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
141 SANITIZER_NETBSD || SANITIZER_SOLARIS)154 SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU)
142155
143#if __LP64__ || defined(_WIN64)156#if __LP64__ || defined(_WIN64)
144# define SANITIZER_WORDSIZE 64157# define SANITIZER_WORDSIZE 64
...@@ -305,6 +318,9 @@...@@ -305,6 +318,9 @@
305# endif318# endif
306#endif319#endif
307320
321// The first address that can be returned by mmap.
322#define SANITIZER_MMAP_BEGIN 0
323
308// The range of addresses which can be returned my mmap.324// The range of addresses which can be returned my mmap.
309// FIXME: this value should be different on different platforms. Larger values325// FIXME: this value should be different on different platforms. Larger values
310// will still work but will consume more memory for TwoLevelByteMap.326// will still work but will consume more memory for TwoLevelByteMap.
...@@ -410,7 +426,8 @@...@@ -410,7 +426,8 @@
410# define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0426# define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0
411#endif427#endif
412428
413#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_NETBSD || SANITIZER_SOLARIS429#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_NETBSD || \
430 SANITIZER_SOLARIS || SANITIZER_HAIKU
414# define SANITIZER_MADVISE_DONTNEED MADV_FREE431# define SANITIZER_MADVISE_DONTNEED MADV_FREE
415#else432#else
416# define SANITIZER_MADVISE_DONTNEED MADV_DONTNEED433# define SANITIZER_MADVISE_DONTNEED MADV_DONTNEED
lib/libtsan/sanitizer_common/sanitizer_platform_interceptors.h+59-25
...@@ -129,8 +129,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -129,8 +129,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
129129
130#if SANITIZER_FUCHSIA130#if SANITIZER_FUCHSIA
131#define SI_NOT_FUCHSIA 0131#define SI_NOT_FUCHSIA 0
132#define SI_FUCHSIA 1
132#else133#else
133#define SI_NOT_FUCHSIA 1134#define SI_NOT_FUCHSIA 1
135#define SI_FUCHSIA 0
134#endif136#endif
135137
136#if SANITIZER_SOLARIS138#if SANITIZER_SOLARIS
...@@ -139,6 +141,12 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -139,6 +141,12 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
139#define SI_SOLARIS 0141#define SI_SOLARIS 0
140#endif142#endif
141143
144#if SANITIZER_AIX
145# define SI_NOT_AIX 0
146#else
147# define SI_NOT_AIX 1
148#endif
149
142#if SANITIZER_SOLARIS32150#if SANITIZER_SOLARIS32
143#define SI_SOLARIS32 1151#define SI_SOLARIS32 1
144#else152#else
...@@ -159,20 +167,20 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -159,20 +167,20 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
159167
160#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA168#define SANITIZER_INTERCEPT_STRLEN SI_NOT_FUCHSIA
161#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)169#define SANITIZER_INTERCEPT_STRNLEN (SI_NOT_MAC && SI_NOT_FUCHSIA)
162#define SANITIZER_INTERCEPT_STRCMP SI_NOT_FUCHSIA170#define SANITIZER_INTERCEPT_STRCMP (SI_NOT_FUCHSIA && SI_NOT_AIX)
163#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA171#define SANITIZER_INTERCEPT_STRSTR SI_NOT_FUCHSIA
164#define SANITIZER_INTERCEPT_STRCASESTR SI_POSIX172#define SANITIZER_INTERCEPT_STRCASESTR (SI_POSIX && SI_NOT_AIX)
165#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA173#define SANITIZER_INTERCEPT_STRTOK SI_NOT_FUCHSIA
166#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA174#define SANITIZER_INTERCEPT_STRCHR SI_NOT_FUCHSIA
167#define SANITIZER_INTERCEPT_STRCHRNUL SI_POSIX_NOT_MAC175#define SANITIZER_INTERCEPT_STRCHRNUL (SI_POSIX_NOT_MAC && SI_NOT_AIX)
168#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA176#define SANITIZER_INTERCEPT_STRRCHR SI_NOT_FUCHSIA
169#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA177#define SANITIZER_INTERCEPT_STRSPN SI_NOT_FUCHSIA
170#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA178#define SANITIZER_INTERCEPT_STRPBRK SI_NOT_FUCHSIA
171#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS179#define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID || SI_SOLARIS
172#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX180#define SANITIZER_INTERCEPT_STRCASECMP SI_POSIX
173#define SANITIZER_INTERCEPT_MEMSET 1181#define SANITIZER_INTERCEPT_MEMSET 1
174#define SANITIZER_INTERCEPT_MEMMOVE 1182#define SANITIZER_INTERCEPT_MEMMOVE SI_NOT_AIX
175#define SANITIZER_INTERCEPT_MEMCPY 1183#define SANITIZER_INTERCEPT_MEMCPY SI_NOT_AIX
176#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA184#define SANITIZER_INTERCEPT_MEMCMP SI_NOT_FUCHSIA
177#define SANITIZER_INTERCEPT_BCMP \185#define SANITIZER_INTERCEPT_BCMP \
178 SANITIZER_INTERCEPT_MEMCMP && \186 SANITIZER_INTERCEPT_MEMCMP && \
...@@ -231,16 +239,22 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -231,16 +239,22 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
231#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_GLIBC239#define SANITIZER_INTERCEPT_ISOC99_SCANF SI_GLIBC
232240
233#ifndef SANITIZER_INTERCEPT_PRINTF241#ifndef SANITIZER_INTERCEPT_PRINTF
234#define SANITIZER_INTERCEPT_PRINTF SI_POSIX242# define SANITIZER_INTERCEPT_ASPRINTF SI_NOT_AIX
235#define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)243# define SANITIZER_INTERCEPT_VASPRINTF SI_NOT_AIX
236#define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC244# define SANITIZER_INTERCEPT_PRINTF SI_POSIX
245# define SANITIZER_INTERCEPT_PRINTF_L (SI_FREEBSD || SI_NETBSD)
246# define SANITIZER_INTERCEPT_ISOC99_PRINTF SI_GLIBC
237#endif247#endif
238248
249#define SANITIZER_INTERCEPT_SETPROCTITLE (SI_FREEBSD || SI_NETBSD)
250
239#define SANITIZER_INTERCEPT___PRINTF_CHK \251#define SANITIZER_INTERCEPT___PRINTF_CHK \
240 (SANITIZER_INTERCEPT_PRINTF && SI_GLIBC)252 (SANITIZER_INTERCEPT_PRINTF && SI_GLIBC)
241253
242#define SANITIZER_INTERCEPT_FREXP SI_NOT_FUCHSIA254// AIX libc does not export FREXP and FREXPF.
243#define SANITIZER_INTERCEPT_FREXPF_FREXPL SI_POSIX255#define SANITIZER_INTERCEPT_FREXP (SI_NOT_FUCHSIA && SI_NOT_AIX)
256#define SANITIZER_INTERCEPT_FREXPF (SI_POSIX && SI_NOT_AIX)
257#define SANITIZER_INTERCEPT_FREXPL SI_POSIX
244258
245#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX259#define SANITIZER_INTERCEPT_GETPWNAM_AND_FRIENDS SI_POSIX
246#define SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS \260#define SANITIZER_INTERCEPT_GETPWNAM_R_AND_FRIENDS \
...@@ -289,7 +303,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -289,7 +303,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
289#define SANITIZER_INTERCEPT_ACCEPT4 \303#define SANITIZER_INTERCEPT_ACCEPT4 \
290 (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_FREEBSD)304 (SI_LINUX_NOT_ANDROID || SI_NETBSD || SI_FREEBSD)
291#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD305#define SANITIZER_INTERCEPT_PACCEPT SI_NETBSD
292#define SANITIZER_INTERCEPT_MODF SI_POSIX306#define SANITIZER_INTERCEPT_MODF (SI_POSIX && SI_NOT_AIX)
293#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX307#define SANITIZER_INTERCEPT_RECVMSG SI_POSIX
294#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX308#define SANITIZER_INTERCEPT_SENDMSG SI_POSIX
295#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX309#define SANITIZER_INTERCEPT_RECVMMSG SI_LINUX
...@@ -324,8 +338,9 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -324,8 +338,9 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
324#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX338#define SANITIZER_INTERCEPT___WCSXFRM_L SI_LINUX
325#define SANITIZER_INTERCEPT_WCSNRTOMBS \339#define SANITIZER_INTERCEPT_WCSNRTOMBS \
326 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)340 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
327#define SANITIZER_INTERCEPT_WCRTOMB \341#define SANITIZER_INTERCEPT_WCRTOMB \
328 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)342 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS || \
343 !SI_NOT_AIX)
329#define SANITIZER_INTERCEPT_WCTOMB \344#define SANITIZER_INTERCEPT_WCTOMB \
330 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)345 (SI_FREEBSD || SI_NETBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
331#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS346#define SANITIZER_INTERCEPT_TCGETATTR SI_LINUX_NOT_ANDROID || SI_SOLARIS
...@@ -365,7 +380,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -365,7 +380,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
365#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID380#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
366#define SANITIZER_INTERCEPT_STATFS \381#define SANITIZER_INTERCEPT_STATFS \
367 (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)382 (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
368#define SANITIZER_INTERCEPT_STATFS64 SI_GLIBC && SANITIZER_HAS_STATFS64383#define SANITIZER_INTERCEPT_STATFS64 \
384 ((SI_GLIBC || !SI_NOT_AIX) && SANITIZER_HAS_STATFS64)
369#define SANITIZER_INTERCEPT_STATVFS \385#define SANITIZER_INTERCEPT_STATVFS \
370 (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)386 (SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)
371#define SANITIZER_INTERCEPT_STATVFS64 SI_GLIBC387#define SANITIZER_INTERCEPT_STATVFS64 SI_GLIBC
...@@ -414,10 +430,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -414,10 +430,10 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
414#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX430#define SANITIZER_INTERCEPT_TTYNAME_R SI_POSIX
415#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX431#define SANITIZER_INTERCEPT_TEMPNAM SI_POSIX
416#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS432#define SANITIZER_INTERCEPT_SINCOS SI_LINUX || SI_SOLARIS
417#define SANITIZER_INTERCEPT_REMQUO SI_POSIX433#define SANITIZER_INTERCEPT_REMQUO (SI_POSIX && SI_NOT_AIX)
418#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD)434#define SANITIZER_INTERCEPT_REMQUOL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
419#define SANITIZER_INTERCEPT_LGAMMA SI_POSIX435#define SANITIZER_INTERCEPT_LGAMMA (SI_POSIX && SI_NOT_AIX)
420#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD)436#define SANITIZER_INTERCEPT_LGAMMAL (SI_POSIX && !SI_NETBSD && SI_NOT_AIX)
421#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)437#define SANITIZER_INTERCEPT_LGAMMA_R (SI_FREEBSD || SI_LINUX || SI_SOLARIS)
422#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS438#define SANITIZER_INTERCEPT_LGAMMAL_R SI_LINUX_NOT_ANDROID || SI_SOLARIS
423#define SANITIZER_INTERCEPT_DRAND48_R SI_GLIBC439#define SANITIZER_INTERCEPT_DRAND48_R SI_GLIBC
...@@ -500,11 +516,13 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -500,11 +516,13 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
500#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE (SI_LINUX || SI_FREEBSD)516#define SANITIZER_INTERCEPT_EVENTFD_READ_WRITE (SI_LINUX || SI_FREEBSD)
501517
502#define SI_STAT_LINUX (SI_LINUX && __GLIBC_PREREQ(2, 33))518#define SI_STAT_LINUX (SI_LINUX && __GLIBC_PREREQ(2, 33))
503#define SANITIZER_INTERCEPT_STAT \519#define SANITIZER_INTERCEPT_STAT \
504 (SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \520 (SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
505 SI_STAT_LINUX)521 SI_STAT_LINUX || !SI_NOT_AIX)
506#define SANITIZER_INTERCEPT_STAT64 SI_STAT_LINUX && SANITIZER_HAS_STAT64522#define SANITIZER_INTERCEPT_STAT64 \
507#define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX)523 ((SI_STAT_LINUX || !SI_NOT_AIX) && SANITIZER_HAS_STAT64)
524#define SANITIZER_INTERCEPT_LSTAT \
525 (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX || !SI_NOT_AIX)
508#define SANITIZER_INTERCEPT___XSTAT \526#define SANITIZER_INTERCEPT___XSTAT \
509 ((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)527 ((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)
510#define SANITIZER_INTERCEPT___XSTAT64 SI_GLIBC528#define SANITIZER_INTERCEPT___XSTAT64 SI_GLIBC
...@@ -521,7 +539,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -521,7 +539,8 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
521539
522#define SANITIZER_INTERCEPT_MMAP SI_POSIX540#define SANITIZER_INTERCEPT_MMAP SI_POSIX
523#define SANITIZER_INTERCEPT_MMAP64 SI_GLIBC || SI_SOLARIS541#define SANITIZER_INTERCEPT_MMAP64 SI_GLIBC || SI_SOLARIS
524#define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO (SI_GLIBC || SI_ANDROID)542#define SANITIZER_INTERCEPT_MALLOPT_AND_MALLINFO \
543 (SI_GLIBC || SI_ANDROID || SI_FUCHSIA)
525#define SANITIZER_INTERCEPT_MEMALIGN (!SI_FREEBSD && !SI_MAC && !SI_NETBSD)544#define SANITIZER_INTERCEPT_MEMALIGN (!SI_FREEBSD && !SI_MAC && !SI_NETBSD)
526#define SANITIZER_INTERCEPT___LIBC_MEMALIGN SI_GLIBC545#define SANITIZER_INTERCEPT___LIBC_MEMALIGN SI_GLIBC
527#define SANITIZER_INTERCEPT_PVALLOC (SI_GLIBC || SI_ANDROID)546#define SANITIZER_INTERCEPT_PVALLOC (SI_GLIBC || SI_ANDROID)
...@@ -572,7 +591,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -572,7 +591,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
572#define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC591#define SANITIZER_INTERCEPT_PROTOENT_R SI_GLIBC
573#define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)592#define SANITIZER_INTERCEPT_NETENT (SI_LINUX || SI_NETBSD || SI_FREEBSD)
574#define SANITIZER_INTERCEPT_SETVBUF \593#define SANITIZER_INTERCEPT_SETVBUF \
575 (SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC)594 (SI_NETBSD || SI_FREEBSD || SI_LINUX || SI_MAC || !SI_NOT_AIX)
576#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)595#define SANITIZER_INTERCEPT_GETMNTINFO (SI_NETBSD || SI_FREEBSD || SI_MAC)
577#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD596#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
578#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD597#define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD
...@@ -640,6 +659,21 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,...@@ -640,6 +659,21 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
640# define SI_MAC_OS_DEPLOYMENT_MIN_13_00 0659# define SI_MAC_OS_DEPLOYMENT_MIN_13_00 0
641#endif660#endif
642#define SANITIZER_INTERCEPT_FREADLINK (SI_MAC && SI_MAC_OS_DEPLOYMENT_MIN_13_00)661#define SANITIZER_INTERCEPT_FREADLINK (SI_MAC && SI_MAC_OS_DEPLOYMENT_MIN_13_00)
662#define SANITIZER_INTERCEPT_GETSERVENT_R SI_GLIBC
663#define SANITIZER_INTERCEPT_GETSERVBYNAME_R SI_GLIBC
664#define SANITIZER_INTERCEPT_GETSERVBYPORT_R SI_GLIBC
665
666// Until free_sized and free_aligned_sized are more generally available,
667// we can only unconditionally intercept on ELF-based platforms where it
668// is okay to have undefined weak symbols.
669#ifdef __ELF__
670# define SANITIZER_INTERCEPT_FREE_SIZED 1
671# define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 1
672#else
673# define SANITIZER_INTERCEPT_FREE_SIZED 0
674# define SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED 0
675#endif
676
643// This macro gives a way for downstream users to override the above677// This macro gives a way for downstream users to override the above
644// interceptor macros irrespective of the platform they are on. They have678// interceptor macros irrespective of the platform they are on. They have
645// to do two things:679// to do two things:
lib/libtsan/sanitizer_common/sanitizer_platform_limits_freebsd.cpp+1-9
...@@ -29,6 +29,7 @@...@@ -29,6 +29,7 @@
29#include <sys/mtio.h>29#include <sys/mtio.h>
30#include <sys/ptrace.h>30#include <sys/ptrace.h>
31#include <sys/resource.h>31#include <sys/resource.h>
32#include <sys/shm.h>
32#include <sys/signal.h>33#include <sys/signal.h>
33#include <sys/socket.h>34#include <sys/socket.h>
34#include <sys/sockio.h>35#include <sys/sockio.h>
...@@ -81,10 +82,6 @@...@@ -81,10 +82,6 @@
81#include <wchar.h>82#include <wchar.h>
82#include <wordexp.h>83#include <wordexp.h>
8384
84#define _KERNEL // to declare 'shminfo' structure
85#include <sys/shm.h>
86#undef _KERNEL
87
88#undef IOC_DIRMASK85#undef IOC_DIRMASK
8986
90// Include these after system headers to avoid name clashes and ambiguities.87// Include these after system headers to avoid name clashes and ambiguities.
...@@ -135,8 +132,6 @@ unsigned struct_timeb_sz = sizeof(struct timeb);...@@ -135,8 +132,6 @@ unsigned struct_timeb_sz = sizeof(struct timeb);
135unsigned struct_msqid_ds_sz = sizeof(struct msqid_ds);132unsigned struct_msqid_ds_sz = sizeof(struct msqid_ds);
136unsigned struct_mq_attr_sz = sizeof(struct mq_attr);133unsigned struct_mq_attr_sz = sizeof(struct mq_attr);
137unsigned struct_statvfs_sz = sizeof(struct statvfs);134unsigned struct_statvfs_sz = sizeof(struct statvfs);
138unsigned struct_shminfo_sz = sizeof(struct shminfo);
139unsigned struct_shm_info_sz = sizeof(struct shm_info);
140unsigned struct_regmatch_sz = sizeof(regmatch_t);135unsigned struct_regmatch_sz = sizeof(regmatch_t);
141unsigned struct_regex_sz = sizeof(regex_t);136unsigned struct_regex_sz = sizeof(regex_t);
142unsigned struct_fstab_sz = sizeof(struct fstab);137unsigned struct_fstab_sz = sizeof(struct fstab);
...@@ -150,9 +145,6 @@ const uptr sig_err = (uptr)SIG_ERR;...@@ -150,9 +145,6 @@ const uptr sig_err = (uptr)SIG_ERR;
150const uptr sa_siginfo = (uptr)SA_SIGINFO;145const uptr sa_siginfo = (uptr)SA_SIGINFO;
151146
152int shmctl_ipc_stat = (int)IPC_STAT;147int shmctl_ipc_stat = (int)IPC_STAT;
153int shmctl_ipc_info = (int)IPC_INFO;
154int shmctl_shm_info = (int)SHM_INFO;
155int shmctl_shm_stat = (int)SHM_STAT;
156unsigned struct_utmpx_sz = sizeof(struct utmpx);148unsigned struct_utmpx_sz = sizeof(struct utmpx);
157149
158int map_fixed = MAP_FIXED;150int map_fixed = MAP_FIXED;
lib/libtsan/sanitizer_common/sanitizer_platform_limits_freebsd.h+7-5
...@@ -419,12 +419,14 @@ struct __sanitizer_wordexp_t {...@@ -419,12 +419,14 @@ struct __sanitizer_wordexp_t {
419419
420typedef void __sanitizer_FILE;420typedef void __sanitizer_FILE;
421421
422extern unsigned struct_shminfo_sz;
423extern unsigned struct_shm_info_sz;
424extern int shmctl_ipc_stat;422extern int shmctl_ipc_stat;
425extern int shmctl_ipc_info;423
426extern int shmctl_shm_info;424// This simplifies generic code
427extern int shmctl_shm_stat;425#define struct_shminfo_sz -1
426#define struct_shm_info_sz -1
427#define shmctl_shm_stat -1
428#define shmctl_ipc_info -1
429#define shmctl_shm_info -1
428430
429extern unsigned struct_utmpx_sz;431extern unsigned struct_utmpx_sz;
430432
lib/libtsan/sanitizer_common/sanitizer_platform_limits_posix.cpp+36-17
...@@ -24,7 +24,7 @@...@@ -24,7 +24,7 @@
24// Must go after undef _FILE_OFFSET_BITS.24// Must go after undef _FILE_OFFSET_BITS.
25#include "sanitizer_platform.h"25#include "sanitizer_platform.h"
2626
27#if SANITIZER_LINUX || SANITIZER_APPLE27#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
28// Must go after undef _FILE_OFFSET_BITS.28// Must go after undef _FILE_OFFSET_BITS.
29#include "sanitizer_glibc_version.h"29#include "sanitizer_glibc_version.h"
3030
...@@ -52,7 +52,7 @@...@@ -52,7 +52,7 @@
52#include <time.h>52#include <time.h>
53#include <wchar.h>53#include <wchar.h>
54#include <regex.h>54#include <regex.h>
55#if !SANITIZER_APPLE55#if !SANITIZER_APPLE && !SANITIZER_HAIKU
56#include <utmp.h>56#include <utmp.h>
57#endif57#endif
5858
...@@ -61,7 +61,9 @@...@@ -61,7 +61,9 @@
61#endif61#endif
6262
63#if !SANITIZER_ANDROID63#if !SANITIZER_ANDROID
64#if !SANITIZER_HAIKU
64#include <sys/mount.h>65#include <sys/mount.h>
66#endif
65#include <sys/timeb.h>67#include <sys/timeb.h>
66#include <utmpx.h>68#include <utmpx.h>
67#endif69#endif
...@@ -111,9 +113,11 @@ typedef struct user_fpregs elf_fpregset_t;...@@ -111,9 +113,11 @@ typedef struct user_fpregs elf_fpregset_t;
111113
112#if !SANITIZER_ANDROID114#if !SANITIZER_ANDROID
113#include <ifaddrs.h>115#include <ifaddrs.h>
116#if !SANITIZER_HAIKU
114#include <sys/ucontext.h>117#include <sys/ucontext.h>
115#include <wordexp.h>118#include <wordexp.h>
116#endif119#endif
120#endif
117121
118#if SANITIZER_LINUX122#if SANITIZER_LINUX
119#if SANITIZER_GLIBC123#if SANITIZER_GLIBC
...@@ -163,7 +167,7 @@ typedef struct user_fpregs elf_fpregset_t;...@@ -163,7 +167,7 @@ typedef struct user_fpregs elf_fpregset_t;
163#include <sys/vfs.h>167#include <sys/vfs.h>
164#include <sys/epoll.h>168#include <sys/epoll.h>
165#include <linux/capability.h>169#include <linux/capability.h>
166#else170#elif !SANITIZER_HAIKU
167#include <fstab.h>171#include <fstab.h>
168#endif // SANITIZER_LINUX172#endif // SANITIZER_LINUX
169173
...@@ -173,6 +177,11 @@ typedef struct user_fpregs elf_fpregset_t;...@@ -173,6 +177,11 @@ typedef struct user_fpregs elf_fpregset_t;
173#include <sys/sockio.h>177#include <sys/sockio.h>
174#endif178#endif
175179
180#if SANITIZER_HAIKU
181#include <sys/sockio.h>
182#include <sys/ioctl.h>
183#endif
184
176// Include these after system headers to avoid name clashes and ambiguities.185// Include these after system headers to avoid name clashes and ambiguities.
177# include "sanitizer_common.h"186# include "sanitizer_common.h"
178# include "sanitizer_internal_defs.h"187# include "sanitizer_internal_defs.h"
...@@ -217,7 +226,7 @@ namespace __sanitizer {...@@ -217,7 +226,7 @@ namespace __sanitizer {
217 unsigned struct_fstab_sz = sizeof(struct fstab);226 unsigned struct_fstab_sz = sizeof(struct fstab);
218#endif // SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD ||227#endif // SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD ||
219 // SANITIZER_APPLE228 // SANITIZER_APPLE
220#if !SANITIZER_ANDROID229#if !SANITIZER_ANDROID && !SANITIZER_HAIKU
221 unsigned struct_statfs_sz = sizeof(struct statfs);230 unsigned struct_statfs_sz = sizeof(struct statfs);
222 unsigned struct_sockaddr_sz = sizeof(struct sockaddr);231 unsigned struct_sockaddr_sz = sizeof(struct sockaddr);
223232
...@@ -324,7 +333,7 @@ namespace __sanitizer {...@@ -324,7 +333,7 @@ namespace __sanitizer {
324 int shmctl_shm_stat = (int)SHM_STAT;333 int shmctl_shm_stat = (int)SHM_STAT;
325#endif334#endif
326335
327#if !SANITIZER_APPLE && !SANITIZER_FREEBSD336#if !SANITIZER_APPLE && !SANITIZER_FREEBSD && !SANITIZER_HAIKU
328 unsigned struct_utmp_sz = sizeof(struct utmp);337 unsigned struct_utmp_sz = sizeof(struct utmp);
329#endif338#endif
330#if !SANITIZER_ANDROID339#if !SANITIZER_ANDROID
...@@ -356,9 +365,9 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);...@@ -356,9 +365,9 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
356 int glob_altdirfunc = GLOB_ALTDIRFUNC;365 int glob_altdirfunc = GLOB_ALTDIRFUNC;
357#endif366#endif
358367
359# if !SANITIZER_ANDROID368# if !SANITIZER_ANDROID && !SANITIZER_HAIKU
360 const int wordexp_wrde_dooffs = WRDE_DOOFFS;369 const int wordexp_wrde_dooffs = WRDE_DOOFFS;
361# endif // !SANITIZER_ANDROID370# endif // !SANITIZER_ANDROID && !SANITIZER_HAIKU
362371
363# if SANITIZER_LINUX && !SANITIZER_ANDROID && \372# if SANITIZER_LINUX && !SANITIZER_ANDROID && \
364 (defined(__i386) || defined(__x86_64) || defined(__mips64) || \373 (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
...@@ -537,7 +546,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);...@@ -537,7 +546,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
537 unsigned struct_sock_fprog_sz = sizeof(struct sock_fprog);546 unsigned struct_sock_fprog_sz = sizeof(struct sock_fprog);
538# endif // SANITIZER_GLIBC547# endif // SANITIZER_GLIBC
539548
540# if !SANITIZER_ANDROID && !SANITIZER_APPLE549# if !SANITIZER_ANDROID && !SANITIZER_APPLE && !SANITIZER_HAIKU
541 unsigned struct_sioc_sg_req_sz = sizeof(struct sioc_sg_req);550 unsigned struct_sioc_sg_req_sz = sizeof(struct sioc_sg_req);
542 unsigned struct_sioc_vif_req_sz = sizeof(struct sioc_vif_req);551 unsigned struct_sioc_vif_req_sz = sizeof(struct sioc_vif_req);
543#endif552#endif
...@@ -548,12 +557,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);...@@ -548,12 +557,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
548557
549 const unsigned IOCTL_NOT_PRESENT = 0;558 const unsigned IOCTL_NOT_PRESENT = 0;
550559
560 unsigned IOCTL_FIONBIO = FIONBIO;
561#if !SANITIZER_HAIKU
551 unsigned IOCTL_FIOASYNC = FIOASYNC;562 unsigned IOCTL_FIOASYNC = FIOASYNC;
552 unsigned IOCTL_FIOCLEX = FIOCLEX;563 unsigned IOCTL_FIOCLEX = FIOCLEX;
553 unsigned IOCTL_FIOGETOWN = FIOGETOWN;564 unsigned IOCTL_FIOGETOWN = FIOGETOWN;
554 unsigned IOCTL_FIONBIO = FIONBIO;
555 unsigned IOCTL_FIONCLEX = FIONCLEX;565 unsigned IOCTL_FIONCLEX = FIONCLEX;
556 unsigned IOCTL_FIOSETOWN = FIOSETOWN;566 unsigned IOCTL_FIOSETOWN = FIOSETOWN;
567#endif
557 unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;568 unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
558 unsigned IOCTL_SIOCATMARK = SIOCATMARK;569 unsigned IOCTL_SIOCATMARK = SIOCATMARK;
559 unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;570 unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;
...@@ -574,23 +585,27 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);...@@ -574,23 +585,27 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
574 unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;585 unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
575 unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;586 unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
576 unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;587 unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
588
589#if !SANITIZER_HAIKU
577 unsigned IOCTL_TIOCCONS = TIOCCONS;590 unsigned IOCTL_TIOCCONS = TIOCCONS;
578 unsigned IOCTL_TIOCEXCL = TIOCEXCL;
579 unsigned IOCTL_TIOCGETD = TIOCGETD;591 unsigned IOCTL_TIOCGETD = TIOCGETD;
592 unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
593 unsigned IOCTL_TIOCPKT = TIOCPKT;
594 unsigned IOCTL_TIOCSETD = TIOCSETD;
595 unsigned IOCTL_TIOCSTI = TIOCSTI;
596#endif
597
598 unsigned IOCTL_TIOCEXCL = TIOCEXCL;
580 unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;599 unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
581 unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;600 unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
582 unsigned IOCTL_TIOCMBIC = TIOCMBIC;601 unsigned IOCTL_TIOCMBIC = TIOCMBIC;
583 unsigned IOCTL_TIOCMBIS = TIOCMBIS;602 unsigned IOCTL_TIOCMBIS = TIOCMBIS;
584 unsigned IOCTL_TIOCMGET = TIOCMGET;603 unsigned IOCTL_TIOCMGET = TIOCMGET;
585 unsigned IOCTL_TIOCMSET = TIOCMSET;604 unsigned IOCTL_TIOCMSET = TIOCMSET;
586 unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
587 unsigned IOCTL_TIOCNXCL = TIOCNXCL;605 unsigned IOCTL_TIOCNXCL = TIOCNXCL;
588 unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;606 unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
589 unsigned IOCTL_TIOCPKT = TIOCPKT;
590 unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;607 unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
591 unsigned IOCTL_TIOCSETD = TIOCSETD;
592 unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;608 unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
593 unsigned IOCTL_TIOCSTI = TIOCSTI;
594 unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;609 unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
595#if SANITIZER_LINUX && !SANITIZER_ANDROID610#if SANITIZER_LINUX && !SANITIZER_ANDROID
596 unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;611 unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
...@@ -1100,7 +1115,7 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));...@@ -1100,7 +1115,7 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
1100CHECK_SIZE_AND_OFFSET(dirent, d_ino);1115CHECK_SIZE_AND_OFFSET(dirent, d_ino);
1101#if SANITIZER_APPLE1116#if SANITIZER_APPLE
1102CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);1117CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
1103#elif SANITIZER_FREEBSD1118#elif SANITIZER_FREEBSD || SANITIZER_HAIKU
1104// There is no 'd_off' field on FreeBSD.1119// There is no 'd_off' field on FreeBSD.
1105#else1120#else
1106CHECK_SIZE_AND_OFFSET(dirent, d_off);1121CHECK_SIZE_AND_OFFSET(dirent, d_off);
...@@ -1116,7 +1131,9 @@ CHECK_SIZE_AND_OFFSET(dirent64, d_reclen);...@@ -1116,7 +1131,9 @@ CHECK_SIZE_AND_OFFSET(dirent64, d_reclen);
11161131
1117CHECK_TYPE_SIZE(ifconf);1132CHECK_TYPE_SIZE(ifconf);
1118CHECK_SIZE_AND_OFFSET(ifconf, ifc_len);1133CHECK_SIZE_AND_OFFSET(ifconf, ifc_len);
1134#if !SANITIZER_HAIKU
1119CHECK_SIZE_AND_OFFSET(ifconf, ifc_ifcu);1135CHECK_SIZE_AND_OFFSET(ifconf, ifc_ifcu);
1136#endif
11201137
1121CHECK_TYPE_SIZE(pollfd);1138CHECK_TYPE_SIZE(pollfd);
1122CHECK_SIZE_AND_OFFSET(pollfd, fd);1139CHECK_SIZE_AND_OFFSET(pollfd, fd);
...@@ -1171,7 +1188,7 @@ CHECK_TYPE_SIZE(__kernel_loff_t);...@@ -1171,7 +1188,7 @@ CHECK_TYPE_SIZE(__kernel_loff_t);
1171CHECK_TYPE_SIZE(__kernel_fd_set);1188CHECK_TYPE_SIZE(__kernel_fd_set);
1172#endif1189#endif
11731190
1174#if !SANITIZER_ANDROID1191#if !SANITIZER_ANDROID && !SANITIZER_HAIKU
1175CHECK_TYPE_SIZE(wordexp_t);1192CHECK_TYPE_SIZE(wordexp_t);
1176CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);1193CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);
1177CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);1194CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);
...@@ -1201,7 +1218,9 @@ CHECK_SIZE_AND_OFFSET(mntent, mnt_freq);...@@ -1201,7 +1218,9 @@ CHECK_SIZE_AND_OFFSET(mntent, mnt_freq);
1201CHECK_SIZE_AND_OFFSET(mntent, mnt_passno);1218CHECK_SIZE_AND_OFFSET(mntent, mnt_passno);
1202#endif1219#endif
12031220
1221#if !SANITIZER_HAIKU
1204CHECK_TYPE_SIZE(ether_addr);1222CHECK_TYPE_SIZE(ether_addr);
1223#endif
12051224
1206#if SANITIZER_GLIBC || SANITIZER_FREEBSD1225#if SANITIZER_GLIBC || SANITIZER_FREEBSD
1207CHECK_TYPE_SIZE(ipc_perm);1226CHECK_TYPE_SIZE(ipc_perm);
...@@ -1239,7 +1258,7 @@ CHECK_TYPE_SIZE(clock_t);...@@ -1239,7 +1258,7 @@ CHECK_TYPE_SIZE(clock_t);
1239CHECK_TYPE_SIZE(clockid_t);1258CHECK_TYPE_SIZE(clockid_t);
1240#endif1259#endif
12411260
1242#if !SANITIZER_ANDROID1261#if !SANITIZER_ANDROID && !SANITIZER_HAIKU
1243CHECK_TYPE_SIZE(ifaddrs);1262CHECK_TYPE_SIZE(ifaddrs);
1244CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);1263CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);
1245CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);1264CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);
lib/libtsan/sanitizer_common/sanitizer_platform_limits_posix.h+320-288
...@@ -14,39 +14,39 @@...@@ -14,39 +14,39 @@
14#ifndef SANITIZER_PLATFORM_LIMITS_POSIX_H14#ifndef SANITIZER_PLATFORM_LIMITS_POSIX_H
15#define SANITIZER_PLATFORM_LIMITS_POSIX_H15#define SANITIZER_PLATFORM_LIMITS_POSIX_H
1616
17#if SANITIZER_LINUX || SANITIZER_APPLE17#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
1818
19#include "sanitizer_internal_defs.h"19# include "sanitizer_internal_defs.h"
20#include "sanitizer_platform.h"20# include "sanitizer_mallinfo.h"
21#include "sanitizer_mallinfo.h"21# include "sanitizer_platform.h"
2222
23#if SANITIZER_APPLE23# if SANITIZER_APPLE
24#include <sys/cdefs.h>24# include <sys/cdefs.h>
25#if !__DARWIN_ONLY_64_BIT_INO_T25# if !__DARWIN_ONLY_64_BIT_INO_T
26#define SANITIZER_HAS_STAT64 126# define SANITIZER_HAS_STAT64 1
27#define SANITIZER_HAS_STATFS64 127# define SANITIZER_HAS_STATFS64 1
28#else28# else
29#define SANITIZER_HAS_STAT64 029# define SANITIZER_HAS_STAT64 0
30#define SANITIZER_HAS_STATFS64 030# define SANITIZER_HAS_STATFS64 0
31#endif31# endif
32#elif SANITIZER_GLIBC || SANITIZER_ANDROID32# elif SANITIZER_GLIBC || SANITIZER_ANDROID
33#define SANITIZER_HAS_STAT64 133# define SANITIZER_HAS_STAT64 1
34#define SANITIZER_HAS_STATFS64 134# define SANITIZER_HAS_STATFS64 1
35#endif35# endif
3636
37#if defined(__sparc__)37# if defined(__sparc__)
38// FIXME: This can't be included from tsan which does not support sparc yet.38// FIXME: This can't be included from tsan which does not support sparc yet.
39#include "sanitizer_glibc_version.h"39# include "sanitizer_glibc_version.h"
40#endif40# endif
4141
42# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle))42# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map *)(handle))
4343
44namespace __sanitizer {44namespace __sanitizer {
45extern unsigned struct_utsname_sz;45extern unsigned struct_utsname_sz;
46extern unsigned struct_stat_sz;46extern unsigned struct_stat_sz;
47#if SANITIZER_HAS_STAT6447# if SANITIZER_HAS_STAT64
48extern unsigned struct_stat64_sz;48extern unsigned struct_stat64_sz;
49#endif49# endif
50extern unsigned struct_rusage_sz;50extern unsigned struct_rusage_sz;
51extern unsigned siginfo_t_sz;51extern unsigned siginfo_t_sz;
52extern unsigned struct_itimerval_sz;52extern unsigned struct_itimerval_sz;
...@@ -64,13 +64,13 @@ extern unsigned struct_itimerspec_sz;...@@ -64,13 +64,13 @@ extern unsigned struct_itimerspec_sz;
64extern unsigned struct_sigevent_sz;64extern unsigned struct_sigevent_sz;
65extern unsigned struct_stack_t_sz;65extern unsigned struct_stack_t_sz;
66extern unsigned struct_sched_param_sz;66extern unsigned struct_sched_param_sz;
67#if SANITIZER_HAS_STATFS6467# if SANITIZER_HAS_STATFS64
68extern unsigned struct_statfs64_sz;68extern unsigned struct_statfs64_sz;
69#endif69# endif
70extern unsigned struct_regex_sz;70extern unsigned struct_regex_sz;
71extern unsigned struct_regmatch_sz;71extern unsigned struct_regmatch_sz;
7272
73#if !SANITIZER_ANDROID73# if !SANITIZER_ANDROID
74extern unsigned struct_fstab_sz;74extern unsigned struct_fstab_sz;
75extern unsigned struct_statfs_sz;75extern unsigned struct_statfs_sz;
76extern unsigned struct_sockaddr_sz;76extern unsigned struct_sockaddr_sz;
...@@ -82,22 +82,22 @@ unsigned ucontext_t_sz(void *uctx);...@@ -82,22 +82,22 @@ unsigned ucontext_t_sz(void *uctx);
82# if defined(__x86_64__)82# if defined(__x86_64__)
83const unsigned struct_kernel_stat_sz = 144;83const unsigned struct_kernel_stat_sz = 144;
84const unsigned struct_kernel_stat64_sz = 0;84const unsigned struct_kernel_stat64_sz = 0;
85#elif defined(__i386__)85# elif defined(__i386__)
86const unsigned struct_kernel_stat_sz = 64;86const unsigned struct_kernel_stat_sz = 64;
87const unsigned struct_kernel_stat64_sz = 96;87const unsigned struct_kernel_stat64_sz = 96;
88#elif defined(__arm__)88# elif defined(__arm__)
89const unsigned struct_kernel_stat_sz = 64;89const unsigned struct_kernel_stat_sz = 64;
90const unsigned struct_kernel_stat64_sz = 104;90const unsigned struct_kernel_stat64_sz = 104;
91#elif defined(__aarch64__)91# elif defined(__aarch64__)
92const unsigned struct_kernel_stat_sz = 128;92const unsigned struct_kernel_stat_sz = 128;
93const unsigned struct_kernel_stat64_sz = 104;93const unsigned struct_kernel_stat64_sz = 104;
94#elif defined(__powerpc__) && !defined(__powerpc64__)94# elif defined(__powerpc__) && !defined(__powerpc64__)
95const unsigned struct_kernel_stat_sz = 72;95const unsigned struct_kernel_stat_sz = 72;
96const unsigned struct_kernel_stat64_sz = 104;96const unsigned struct_kernel_stat64_sz = 104;
97#elif defined(__powerpc64__)97# elif defined(__powerpc64__)
98const unsigned struct_kernel_stat_sz = 144;98const unsigned struct_kernel_stat_sz = 144;
99const unsigned struct_kernel_stat64_sz = 104;99const unsigned struct_kernel_stat64_sz = 104;
100#elif defined(__mips__)100# elif defined(__mips__)
101const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID101const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID
102 ? FIRST_32_SECOND_64(104, 128)102 ? FIRST_32_SECOND_64(104, 128)
103# if defined(_ABIN32) && _MIPS_SIM == _ABIN32103# if defined(_ABIN32) && _MIPS_SIM == _ABIN32
...@@ -106,21 +106,21 @@ const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID...@@ -106,21 +106,21 @@ const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID
106 : FIRST_32_SECOND_64(160, 216);106 : FIRST_32_SECOND_64(160, 216);
107# endif107# endif
108const unsigned struct_kernel_stat64_sz = 104;108const unsigned struct_kernel_stat64_sz = 104;
109#elif defined(__s390__) && !defined(__s390x__)109# elif defined(__s390__) && !defined(__s390x__)
110const unsigned struct_kernel_stat_sz = 64;110const unsigned struct_kernel_stat_sz = 64;
111const unsigned struct_kernel_stat64_sz = 104;111const unsigned struct_kernel_stat64_sz = 104;
112#elif defined(__s390x__)112# elif defined(__s390x__)
113const unsigned struct_kernel_stat_sz = 144;113const unsigned struct_kernel_stat_sz = 144;
114const unsigned struct_kernel_stat64_sz = 0;114const unsigned struct_kernel_stat64_sz = 0;
115#elif defined(__sparc__) && defined(__arch64__)115# elif defined(__sparc__) && defined(__arch64__)
116const unsigned struct___old_kernel_stat_sz = 0;116const unsigned struct___old_kernel_stat_sz = 0;
117const unsigned struct_kernel_stat_sz = 104;117const unsigned struct_kernel_stat_sz = 104;
118const unsigned struct_kernel_stat64_sz = 144;118const unsigned struct_kernel_stat64_sz = 144;
119#elif defined(__sparc__) && !defined(__arch64__)119# elif defined(__sparc__) && !defined(__arch64__)
120const unsigned struct___old_kernel_stat_sz = 0;120const unsigned struct___old_kernel_stat_sz = 0;
121const unsigned struct_kernel_stat_sz = 64;121const unsigned struct_kernel_stat_sz = 64;
122const unsigned struct_kernel_stat64_sz = 104;122const unsigned struct_kernel_stat64_sz = 104;
123#elif SANITIZER_RISCV64123# elif SANITIZER_RISCV64
124const unsigned struct_kernel_stat_sz = 128;124const unsigned struct_kernel_stat_sz = 128;
125const unsigned struct_kernel_stat64_sz = 0; // RISCV64 does not use stat64125const unsigned struct_kernel_stat64_sz = 0; // RISCV64 does not use stat64
126# elif defined(__hexagon__)126# elif defined(__hexagon__)
...@@ -145,15 +145,15 @@ extern unsigned struct_old_utsname_sz;...@@ -145,15 +145,15 @@ extern unsigned struct_old_utsname_sz;
145extern unsigned struct_oldold_utsname_sz;145extern unsigned struct_oldold_utsname_sz;
146146
147const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long);147const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long);
148#endif // SANITIZER_LINUX148# endif // SANITIZER_LINUX
149149
150#if SANITIZER_LINUX150# if SANITIZER_LINUX
151151
152#if defined(__powerpc64__) || defined(__s390__) || defined(__loongarch__)152# if defined(__powerpc64__) || defined(__s390__) || defined(__loongarch__)
153const unsigned struct___old_kernel_stat_sz = 0;153const unsigned struct___old_kernel_stat_sz = 0;
154#elif !defined(__sparc__)154# elif !defined(__sparc__)
155const unsigned struct___old_kernel_stat_sz = 32;155const unsigned struct___old_kernel_stat_sz = 32;
156#endif156# endif
157157
158extern unsigned struct_rlimit_sz;158extern unsigned struct_rlimit_sz;
159extern unsigned struct_utimbuf_sz;159extern unsigned struct_utimbuf_sz;
...@@ -198,17 +198,17 @@ struct __sanitizer___sysctl_args {...@@ -198,17 +198,17 @@ struct __sanitizer___sysctl_args {
198const unsigned old_sigset_t_sz = sizeof(unsigned long);198const unsigned old_sigset_t_sz = sizeof(unsigned long);
199199
200struct __sanitizer_sem_t {200struct __sanitizer_sem_t {
201#if SANITIZER_ANDROID && defined(_LP64)201# if SANITIZER_ANDROID && defined(_LP64)
202 int data[4];202 int data[4];
203#elif SANITIZER_ANDROID && !defined(_LP64)203# elif SANITIZER_ANDROID && !defined(_LP64)
204 int data;204 int data;
205#elif SANITIZER_LINUX205# elif SANITIZER_LINUX
206 uptr data[4];206 uptr data[4];
207#endif207# endif
208};208};
209#endif // SANITIZER_LINUX209# endif // SANITIZER_LINUX
210210
211#if SANITIZER_LINUX && !SANITIZER_ANDROID211# if SANITIZER_LINUX && !SANITIZER_ANDROID
212extern unsigned struct_ustat_sz;212extern unsigned struct_ustat_sz;
213extern unsigned struct_rlimit64_sz;213extern unsigned struct_rlimit64_sz;
214extern unsigned struct_statvfs64_sz;214extern unsigned struct_statvfs64_sz;
...@@ -219,45 +219,45 @@ struct __sanitizer_ipc_perm {...@@ -219,45 +219,45 @@ struct __sanitizer_ipc_perm {
219 int gid;219 int gid;
220 int cuid;220 int cuid;
221 int cgid;221 int cgid;
222#ifdef __powerpc__222# ifdef __powerpc__
223 unsigned mode;223 unsigned mode;
224 unsigned __seq;224 unsigned __seq;
225 u64 __unused1;225 u64 __unused1;
226 u64 __unused2;226 u64 __unused2;
227#elif defined(__sparc__)227# elif defined(__sparc__)
228 unsigned mode;228 unsigned mode;
229 unsigned short __pad2;229 unsigned short __pad2;
230 unsigned short __seq;230 unsigned short __seq;
231 unsigned long long __unused1;231 unsigned long long __unused1;
232 unsigned long long __unused2;232 unsigned long long __unused2;
233#else233# else
234 unsigned int mode;234 unsigned int mode;
235 unsigned short __seq;235 unsigned short __seq;
236 unsigned short __pad2;236 unsigned short __pad2;
237#if defined(__x86_64__) && !defined(_LP64)237# if defined(__x86_64__) && !defined(_LP64)
238 u64 __unused1;238 u64 __unused1;
239 u64 __unused2;239 u64 __unused2;
240#else240# else
241 unsigned long __unused1;241 unsigned long __unused1;
242 unsigned long __unused2;242 unsigned long __unused2;
243#endif243# endif
244#endif244# endif
245};245};
246246
247struct __sanitizer_shmid_ds {247struct __sanitizer_shmid_ds {
248 __sanitizer_ipc_perm shm_perm;248 __sanitizer_ipc_perm shm_perm;
249#if defined(__sparc__)249# if defined(__sparc__)
250#if !defined(__arch64__)250# if !defined(__arch64__)
251 u32 __pad1;251 u32 __pad1;
252#endif252# endif
253 long shm_atime;253 long shm_atime;
254#if !defined(__arch64__)254# if !defined(__arch64__)
255 u32 __pad2;255 u32 __pad2;
256#endif256# endif
257 long shm_dtime;257 long shm_dtime;
258#if !defined(__arch64__)258# if !defined(__arch64__)
259 u32 __pad3;259 u32 __pad3;
260#endif260# endif
261 long shm_ctime;261 long shm_ctime;
262 uptr shm_segsz;262 uptr shm_segsz;
263 int shm_cpid;263 int shm_cpid;
...@@ -265,61 +265,61 @@ struct __sanitizer_shmid_ds {...@@ -265,61 +265,61 @@ struct __sanitizer_shmid_ds {
265 unsigned long shm_nattch;265 unsigned long shm_nattch;
266 unsigned long __glibc_reserved1;266 unsigned long __glibc_reserved1;
267 unsigned long __glibc_reserved2;267 unsigned long __glibc_reserved2;
268#else268# else
269#ifndef __powerpc__269# ifndef __powerpc__
270 uptr shm_segsz;270 uptr shm_segsz;
271#elif !defined(__powerpc64__)271# elif !defined(__powerpc64__)
272 uptr __unused0;272 uptr __unused0;
273#endif273# endif
274#if defined(__x86_64__) && !defined(_LP64)274# if defined(__x86_64__) && !defined(_LP64)
275 u64 shm_atime;275 u64 shm_atime;
276 u64 shm_dtime;276 u64 shm_dtime;
277 u64 shm_ctime;277 u64 shm_ctime;
278#else278# else
279 uptr shm_atime;279 uptr shm_atime;
280#if !defined(_LP64) && !defined(__mips__)280# if !defined(_LP64) && !defined(__mips__)
281 uptr __unused1;281 uptr __unused1;
282#endif282# endif
283 uptr shm_dtime;283 uptr shm_dtime;
284#if !defined(_LP64) && !defined(__mips__)284# if !defined(_LP64) && !defined(__mips__)
285 uptr __unused2;285 uptr __unused2;
286#endif286# endif
287 uptr shm_ctime;287 uptr shm_ctime;
288#if !defined(_LP64) && !defined(__mips__)288# if !defined(_LP64) && !defined(__mips__)
289 uptr __unused3;289 uptr __unused3;
290#endif290# endif
291#endif291# endif
292#ifdef __powerpc__292# ifdef __powerpc__
293 uptr shm_segsz;293 uptr shm_segsz;
294#endif294# endif
295 int shm_cpid;295 int shm_cpid;
296 int shm_lpid;296 int shm_lpid;
297#if defined(__x86_64__) && !defined(_LP64)297# if defined(__x86_64__) && !defined(_LP64)
298 u64 shm_nattch;298 u64 shm_nattch;
299 u64 __unused4;299 u64 __unused4;
300 u64 __unused5;300 u64 __unused5;
301#else301# else
302 uptr shm_nattch;302 uptr shm_nattch;
303 uptr __unused4;303 uptr __unused4;
304 uptr __unused5;304 uptr __unused5;
305#endif305# endif
306#endif306# endif
307};307};
308#endif308# endif
309309
310#if SANITIZER_LINUX && !SANITIZER_ANDROID310# if SANITIZER_LINUX && !SANITIZER_ANDROID
311extern unsigned struct_msqid_ds_sz;311extern unsigned struct_msqid_ds_sz;
312extern unsigned struct_mq_attr_sz;312extern unsigned struct_mq_attr_sz;
313extern unsigned struct_timex_sz;313extern unsigned struct_timex_sz;
314extern unsigned struct_statvfs_sz;314extern unsigned struct_statvfs_sz;
315#endif // SANITIZER_LINUX && !SANITIZER_ANDROID315# endif // SANITIZER_LINUX && !SANITIZER_ANDROID
316316
317struct __sanitizer_iovec {317struct __sanitizer_iovec {
318 void *iov_base;318 void *iov_base;
319 usize iov_len;319 usize iov_len;
320};320};
321321
322#if !SANITIZER_ANDROID322# if !SANITIZER_ANDROID
323struct __sanitizer_ifaddrs {323struct __sanitizer_ifaddrs {
324 struct __sanitizer_ifaddrs *ifa_next;324 struct __sanitizer_ifaddrs *ifa_next;
325 char *ifa_name;325 char *ifa_name;
...@@ -327,21 +327,21 @@ struct __sanitizer_ifaddrs {...@@ -327,21 +327,21 @@ struct __sanitizer_ifaddrs {
327 void *ifa_addr; // (struct sockaddr *)327 void *ifa_addr; // (struct sockaddr *)
328 void *ifa_netmask; // (struct sockaddr *)328 void *ifa_netmask; // (struct sockaddr *)
329 // This is a union on Linux.329 // This is a union on Linux.
330# ifdef ifa_dstaddr330# ifdef ifa_dstaddr
331# undef ifa_dstaddr331# undef ifa_dstaddr
332# endif332# endif
333 void *ifa_dstaddr; // (struct sockaddr *)333 void *ifa_dstaddr; // (struct sockaddr *)
334 void *ifa_data;334 void *ifa_data;
335};335};
336#endif // !SANITIZER_ANDROID336# endif // !SANITIZER_ANDROID
337337
338#if SANITIZER_APPLE338# if SANITIZER_APPLE
339typedef unsigned long __sanitizer_pthread_key_t;339typedef unsigned long __sanitizer_pthread_key_t;
340#else340# else
341typedef unsigned __sanitizer_pthread_key_t;341typedef unsigned __sanitizer_pthread_key_t;
342#endif342# endif
343343
344#if SANITIZER_LINUX && !SANITIZER_ANDROID344# if SANITIZER_LINUX && !SANITIZER_ANDROID
345345
346struct __sanitizer_XDR {346struct __sanitizer_XDR {
347 int x_op;347 int x_op;
...@@ -355,25 +355,28 @@ struct __sanitizer_XDR {...@@ -355,25 +355,28 @@ struct __sanitizer_XDR {
355const int __sanitizer_XDR_ENCODE = 0;355const int __sanitizer_XDR_ENCODE = 0;
356const int __sanitizer_XDR_DECODE = 1;356const int __sanitizer_XDR_DECODE = 1;
357const int __sanitizer_XDR_FREE = 2;357const int __sanitizer_XDR_FREE = 2;
358#endif358# endif
359359
360struct __sanitizer_passwd {360struct __sanitizer_passwd {
361 char *pw_name;361 char *pw_name;
362 char *pw_passwd;362 char *pw_passwd;
363 int pw_uid;363 int pw_uid;
364 int pw_gid;364 int pw_gid;
365#if SANITIZER_APPLE365# if SANITIZER_APPLE
366 long pw_change;366 long pw_change;
367 char *pw_class;367 char *pw_class;
368#endif368# endif
369#if !(SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32))369# if !(SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)) && !SANITIZER_HAIKU
370 char *pw_gecos;370 char *pw_gecos;
371#endif371# endif
372 char *pw_dir;372 char *pw_dir;
373 char *pw_shell;373 char *pw_shell;
374#if SANITIZER_APPLE374# if SANITIZER_APPLE
375 long pw_expire;375 long pw_expire;
376#endif376# endif
377# if SANITIZER_HAIKU
378 char *pw_gecos;
379# endif
377};380};
378381
379struct __sanitizer_group {382struct __sanitizer_group {
...@@ -386,9 +389,9 @@ struct __sanitizer_group {...@@ -386,9 +389,9 @@ struct __sanitizer_group {
386# if (SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) || \389# if (SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) || \
387 (defined(__x86_64__) && !defined(_LP64)) || defined(__hexagon__)390 (defined(__x86_64__) && !defined(_LP64)) || defined(__hexagon__)
388typedef long long __sanitizer_time_t;391typedef long long __sanitizer_time_t;
389#else392# else
390typedef long __sanitizer_time_t;393typedef long __sanitizer_time_t;
391#endif394# endif
392395
393typedef long __sanitizer_suseconds_t;396typedef long __sanitizer_suseconds_t;
394397
...@@ -433,11 +436,15 @@ struct __sanitizer_tm {...@@ -433,11 +436,15 @@ struct __sanitizer_tm {
433 int tm_wday;436 int tm_wday;
434 int tm_yday;437 int tm_yday;
435 int tm_isdst;438 int tm_isdst;
439# if SANITIZER_HAIKU
440 int tm_gmtoff;
441# else
436 long int tm_gmtoff;442 long int tm_gmtoff;
443# endif
437 const char *tm_zone;444 const char *tm_zone;
438};445};
439446
440#if SANITIZER_LINUX447# if SANITIZER_LINUX
441struct __sanitizer_mntent {448struct __sanitizer_mntent {
442 char *mnt_fsname;449 char *mnt_fsname;
443 char *mnt_dir;450 char *mnt_dir;
...@@ -452,9 +459,9 @@ struct __sanitizer_file_handle {...@@ -452,9 +459,9 @@ struct __sanitizer_file_handle {
452 int handle_type;459 int handle_type;
453 unsigned char f_handle[1]; // variable sized460 unsigned char f_handle[1]; // variable sized
454};461};
455#endif462# endif
456463
457#if SANITIZER_APPLE464# if SANITIZER_APPLE || SANITIZER_HAIKU
458struct __sanitizer_msghdr {465struct __sanitizer_msghdr {
459 void *msg_name;466 void *msg_name;
460 unsigned msg_namelen;467 unsigned msg_namelen;
...@@ -469,7 +476,7 @@ struct __sanitizer_cmsghdr {...@@ -469,7 +476,7 @@ struct __sanitizer_cmsghdr {
469 int cmsg_level;476 int cmsg_level;
470 int cmsg_type;477 int cmsg_type;
471};478};
472#else479# else
473// In POSIX, int msg_iovlen; socklen_t msg_controllen; socklen_t cmsg_len; but480// In POSIX, int msg_iovlen; socklen_t msg_controllen; socklen_t cmsg_len; but
474// many implementations don't conform to the standard.481// many implementations don't conform to the standard.
475struct __sanitizer_msghdr {482struct __sanitizer_msghdr {
...@@ -486,22 +493,31 @@ struct __sanitizer_cmsghdr {...@@ -486,22 +493,31 @@ struct __sanitizer_cmsghdr {
486 int cmsg_level;493 int cmsg_level;
487 int cmsg_type;494 int cmsg_type;
488};495};
489#endif496# endif
490497
491#if SANITIZER_LINUX498# if SANITIZER_LINUX
492struct __sanitizer_mmsghdr {499struct __sanitizer_mmsghdr {
493 __sanitizer_msghdr msg_hdr;500 __sanitizer_msghdr msg_hdr;
494 unsigned int msg_len;501 unsigned int msg_len;
495};502};
496#endif503# endif
497504
498#if SANITIZER_APPLE505# if SANITIZER_APPLE
499struct __sanitizer_dirent {506struct __sanitizer_dirent {
500 unsigned long long d_ino;507 unsigned long long d_ino;
501 unsigned long long d_seekoff;508 unsigned long long d_seekoff;
502 unsigned short d_reclen;509 unsigned short d_reclen;
503 // more fields that we don't care about510 // more fields that we don't care about
504};511};
512# elif SANITIZER_HAIKU
513struct __sanitizer_dirent {
514 int d_dev;
515 int d_pdev;
516 unsigned long long d_ino;
517 unsigned long long d_pino;
518 unsigned short d_reclen;
519 // more fields that we don't care about
520};
505# elif (SANITIZER_LINUX && !SANITIZER_GLIBC) || defined(__x86_64__) || \521# elif (SANITIZER_LINUX && !SANITIZER_GLIBC) || defined(__x86_64__) || \
506 defined(__hexagon__)522 defined(__hexagon__)
507struct __sanitizer_dirent {523struct __sanitizer_dirent {
...@@ -527,47 +543,49 @@ struct __sanitizer_dirent64 {...@@ -527,47 +543,49 @@ struct __sanitizer_dirent64 {
527 // more fields that we don't care about543 // more fields that we don't care about
528};544};
529extern unsigned struct_sock_fprog_sz;545extern unsigned struct_sock_fprog_sz;
530#endif546# endif
531547
532#if defined(__x86_64__) && !defined(_LP64)548# if SANITIZER_HAIKU
549typedef int __sanitizer_clock_t;
550# elif defined(__x86_64__) && !defined(_LP64)
533typedef long long __sanitizer_clock_t;551typedef long long __sanitizer_clock_t;
534#else552# else
535typedef long __sanitizer_clock_t;553typedef long __sanitizer_clock_t;
536#endif554# endif
537555
538#if SANITIZER_LINUX556# if SANITIZER_LINUX || SANITIZER_HAIKU
539typedef int __sanitizer_clockid_t;557typedef int __sanitizer_clockid_t;
540typedef unsigned long long __sanitizer_eventfd_t;558typedef unsigned long long __sanitizer_eventfd_t;
541#endif559# endif
542560
543#if SANITIZER_LINUX561# if SANITIZER_LINUX
544# if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \562# if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \
545 defined(__mips__) || defined(__hexagon__)563 defined(__mips__) || defined(__hexagon__)
546typedef unsigned __sanitizer___kernel_uid_t;564typedef unsigned __sanitizer___kernel_uid_t;
547typedef unsigned __sanitizer___kernel_gid_t;565typedef unsigned __sanitizer___kernel_gid_t;
548#else566# else
549typedef unsigned short __sanitizer___kernel_uid_t;567typedef unsigned short __sanitizer___kernel_uid_t;
550typedef unsigned short __sanitizer___kernel_gid_t;568typedef unsigned short __sanitizer___kernel_gid_t;
551#endif569# endif
552#if defined(__x86_64__) && !defined(_LP64)570# if defined(__x86_64__) && !defined(_LP64)
553typedef long long __sanitizer___kernel_off_t;571typedef long long __sanitizer___kernel_off_t;
554#else572# else
555typedef long __sanitizer___kernel_off_t;573typedef long __sanitizer___kernel_off_t;
556#endif574# endif
557575
558#if defined(__powerpc__) || defined(__mips__)576# if defined(__powerpc__) || defined(__mips__)
559typedef unsigned int __sanitizer___kernel_old_uid_t;577typedef unsigned int __sanitizer___kernel_old_uid_t;
560typedef unsigned int __sanitizer___kernel_old_gid_t;578typedef unsigned int __sanitizer___kernel_old_gid_t;
561#else579# else
562typedef unsigned short __sanitizer___kernel_old_uid_t;580typedef unsigned short __sanitizer___kernel_old_uid_t;
563typedef unsigned short __sanitizer___kernel_old_gid_t;581typedef unsigned short __sanitizer___kernel_old_gid_t;
564#endif582# endif
565583
566typedef long long __sanitizer___kernel_loff_t;584typedef long long __sanitizer___kernel_loff_t;
567typedef struct {585typedef struct {
568 unsigned long fds_bits[1024 / (8 * sizeof(long))];586 unsigned long fds_bits[1024 / (8 * sizeof(long))];
569} __sanitizer___kernel_fd_set;587} __sanitizer___kernel_fd_set;
570#endif588# endif
571589
572// This thing depends on the platform. We are only interested in the upper590// This thing depends on the platform. We are only interested in the upper
573// limit. Verified with a compiler assert in .cpp.591// limit. Verified with a compiler assert in .cpp.
...@@ -576,50 +594,52 @@ union __sanitizer_pthread_attr_t {...@@ -576,50 +594,52 @@ union __sanitizer_pthread_attr_t {
576 void *align;594 void *align;
577};595};
578596
579#if SANITIZER_ANDROID597# if SANITIZER_ANDROID
580# if SANITIZER_MIPS598# if SANITIZER_MIPS
581typedef unsigned long __sanitizer_sigset_t[16 / sizeof(unsigned long)];599typedef unsigned long __sanitizer_sigset_t[16 / sizeof(unsigned long)];
582# else600# else
583typedef unsigned long __sanitizer_sigset_t;601typedef unsigned long __sanitizer_sigset_t;
584# endif602# endif
585#elif SANITIZER_APPLE603# elif SANITIZER_APPLE
586typedef unsigned __sanitizer_sigset_t;604typedef unsigned __sanitizer_sigset_t;
587#elif SANITIZER_LINUX605# elif SANITIZER_HAIKU
606typedef unsigned long __sanitizer_sigset_t;
607# elif SANITIZER_LINUX
588struct __sanitizer_sigset_t {608struct __sanitizer_sigset_t {
589 // The size is determined by looking at sizeof of real sigset_t on linux.609 // The size is determined by looking at sizeof of real sigset_t on linux.
590 uptr val[128 / sizeof(uptr)];610 uptr val[128 / sizeof(uptr)];
591};611};
592#endif612# endif
593613
594struct __sanitizer_siginfo_pad {614struct __sanitizer_siginfo_pad {
595#if SANITIZER_X32615# if SANITIZER_X32
596 // x32 siginfo_t is aligned to 8 bytes.616 // x32 siginfo_t is aligned to 8 bytes.
597 u64 pad[128 / sizeof(u64)];617 u64 pad[128 / sizeof(u64)];
598#else618# else
599 // Require uptr, because siginfo_t is always pointer-size aligned on Linux.619 // Require uptr, because siginfo_t is always pointer-size aligned on Linux.
600 uptr pad[128 / sizeof(uptr)];620 uptr pad[128 / sizeof(uptr)];
601#endif621# endif
602};622};
603623
604#if SANITIZER_LINUX624# if SANITIZER_LINUX
605# define SANITIZER_HAS_SIGINFO 1625# define SANITIZER_HAS_SIGINFO 1
606union __sanitizer_siginfo {626union __sanitizer_siginfo {
607 __extension__ struct {627 __extension__ struct {
608 int si_signo;628 int si_signo;
609# if SANITIZER_MIPS629# if SANITIZER_MIPS
610 int si_code;630 int si_code;
611 int si_errno;631 int si_errno;
612# else632# else
613 int si_errno;633 int si_errno;
614 int si_code;634 int si_code;
615# endif635# endif
616 };636 };
617 __sanitizer_siginfo_pad pad;637 __sanitizer_siginfo_pad pad;
618};638};
619#else639# else
620# define SANITIZER_HAS_SIGINFO 0640# define SANITIZER_HAS_SIGINFO 0
621typedef __sanitizer_siginfo_pad __sanitizer_siginfo;641typedef __sanitizer_siginfo_pad __sanitizer_siginfo;
622#endif642# endif
623643
624using __sanitizer_sighandler_ptr = void (*)(int sig);644using __sanitizer_sighandler_ptr = void (*)(int sig);
625using __sanitizer_sigactionhandler_ptr = void (*)(int sig,645using __sanitizer_sigactionhandler_ptr = void (*)(int sig,
...@@ -627,7 +647,7 @@ using __sanitizer_sigactionhandler_ptr = void (*)(int sig,...@@ -627,7 +647,7 @@ using __sanitizer_sigactionhandler_ptr = void (*)(int sig,
627 void *uctx);647 void *uctx);
628648
629// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.649// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
630#if SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 64)650# if SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 64)
631struct __sanitizer_sigaction {651struct __sanitizer_sigaction {
632 unsigned sa_flags;652 unsigned sa_flags;
633 union {653 union {
...@@ -637,7 +657,8 @@ struct __sanitizer_sigaction {...@@ -637,7 +657,8 @@ struct __sanitizer_sigaction {
637 __sanitizer_sigset_t sa_mask;657 __sanitizer_sigset_t sa_mask;
638 void (*sa_restorer)();658 void (*sa_restorer)();
639};659};
640#elif SANITIZER_ANDROID && SANITIZER_MIPS32 // check this before WORDSIZE == 32660# elif SANITIZER_ANDROID && \
661 SANITIZER_MIPS32 // check this before WORDSIZE == 32
641struct __sanitizer_sigaction {662struct __sanitizer_sigaction {
642 unsigned sa_flags;663 unsigned sa_flags;
643 union {664 union {
...@@ -646,7 +667,7 @@ struct __sanitizer_sigaction {...@@ -646,7 +667,7 @@ struct __sanitizer_sigaction {
646 };667 };
647 __sanitizer_sigset_t sa_mask;668 __sanitizer_sigset_t sa_mask;
648};669};
649#elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)670# elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)
650struct __sanitizer_sigaction {671struct __sanitizer_sigaction {
651 union {672 union {
652 __sanitizer_sigactionhandler_ptr sigaction;673 __sanitizer_sigactionhandler_ptr sigaction;
...@@ -656,66 +677,66 @@ struct __sanitizer_sigaction {...@@ -656,66 +677,66 @@ struct __sanitizer_sigaction {
656 uptr sa_flags;677 uptr sa_flags;
657 void (*sa_restorer)();678 void (*sa_restorer)();
658};679};
659#else // !SANITIZER_ANDROID680# else // !SANITIZER_ANDROID
660struct __sanitizer_sigaction {681struct __sanitizer_sigaction {
661#if defined(__mips__) && !SANITIZER_FREEBSD682# if defined(__mips__) && !SANITIZER_FREEBSD && !SANITIZER_MUSL
662 unsigned int sa_flags;683 unsigned int sa_flags;
663#endif684# endif
664 union {685 union {
665 __sanitizer_sigactionhandler_ptr sigaction;686 __sanitizer_sigactionhandler_ptr sigaction;
666 __sanitizer_sighandler_ptr handler;687 __sanitizer_sighandler_ptr handler;
667 };688 };
668#if SANITIZER_FREEBSD689# if SANITIZER_FREEBSD
669 int sa_flags;690 int sa_flags;
670 __sanitizer_sigset_t sa_mask;691 __sanitizer_sigset_t sa_mask;
671#else692# else
672#if defined(__s390x__)693# if defined(__s390x__)
673 int sa_resv;694 int sa_resv;
674#else695# else
675 __sanitizer_sigset_t sa_mask;696 __sanitizer_sigset_t sa_mask;
676#endif697# endif
677#ifndef __mips__698# if !defined(__mips__) || SANITIZER_MUSL
678#if defined(__sparc__)699# if defined(__sparc__)
679#if __GLIBC_PREREQ (2, 20)700# if __GLIBC_PREREQ(2, 20)
680 // On sparc glibc 2.19 and earlier sa_flags was unsigned long.701 // On sparc glibc 2.19 and earlier sa_flags was unsigned long.
681#if defined(__arch64__)702# if defined(__arch64__)
682 // To maintain ABI compatibility on sparc64 when switching to an int,703 // To maintain ABI compatibility on sparc64 when switching to an int,
683 // __glibc_reserved0 was added.704 // __glibc_reserved0 was added.
684 int __glibc_reserved0;705 int __glibc_reserved0;
685#endif706# endif
686 int sa_flags;707 int sa_flags;
687#else708# else
688 unsigned long sa_flags;709 unsigned long sa_flags;
689#endif710# endif
690#else711# else
691 int sa_flags;712 int sa_flags;
692#endif713# endif
693#endif714# endif
694#endif715# endif
695#if SANITIZER_LINUX716# if SANITIZER_LINUX || SANITIZER_HAIKU
696 void (*sa_restorer)();717 void (*sa_restorer)();
697#endif718# endif
698#if defined(__mips__) && (SANITIZER_WORDSIZE == 32)719# if defined(__mips__) && (SANITIZER_WORDSIZE == 32) && !SANITIZER_MUSL
699 int sa_resv[1];720 int sa_resv[1];
700#endif721# endif
701#if defined(__s390x__)722# if defined(__s390x__)
702 __sanitizer_sigset_t sa_mask;723 __sanitizer_sigset_t sa_mask;
703#endif724# endif
704};725};
705#endif // !SANITIZER_ANDROID726# endif // !SANITIZER_ANDROID
706727
707#if defined(__mips__)728# if defined(__mips__)
708#define __SANITIZER_KERNEL_NSIG 128729# define __SANITIZER_KERNEL_NSIG 128
709#else730# else
710#define __SANITIZER_KERNEL_NSIG 64731# define __SANITIZER_KERNEL_NSIG 64
711#endif732# endif
712733
713struct __sanitizer_kernel_sigset_t {734struct __sanitizer_kernel_sigset_t {
714 uptr sig[__SANITIZER_KERNEL_NSIG / (sizeof(uptr) * 8)];735 uptr sig[__SANITIZER_KERNEL_NSIG / (sizeof(uptr) * 8)];
715};736};
716737
717// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.738// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
718#if SANITIZER_MIPS739# if SANITIZER_MIPS
719struct __sanitizer_kernel_sigaction_t {740struct __sanitizer_kernel_sigaction_t {
720 unsigned int sa_flags;741 unsigned int sa_flags;
721 union {742 union {
...@@ -725,7 +746,7 @@ struct __sanitizer_kernel_sigaction_t {...@@ -725,7 +746,7 @@ struct __sanitizer_kernel_sigaction_t {
725 __sanitizer_kernel_sigset_t sa_mask;746 __sanitizer_kernel_sigset_t sa_mask;
726 void (*sa_restorer)(void);747 void (*sa_restorer)(void);
727};748};
728#else749# else
729struct __sanitizer_kernel_sigaction_t {750struct __sanitizer_kernel_sigaction_t {
730 union {751 union {
731 void (*handler)(int signo);752 void (*handler)(int signo);
...@@ -735,22 +756,22 @@ struct __sanitizer_kernel_sigaction_t {...@@ -735,22 +756,22 @@ struct __sanitizer_kernel_sigaction_t {
735 void (*sa_restorer)(void);756 void (*sa_restorer)(void);
736 __sanitizer_kernel_sigset_t sa_mask;757 __sanitizer_kernel_sigset_t sa_mask;
737};758};
738#endif759# endif
739760
740extern const uptr sig_ign;761extern const uptr sig_ign;
741extern const uptr sig_dfl;762extern const uptr sig_dfl;
742extern const uptr sig_err;763extern const uptr sig_err;
743extern const uptr sa_siginfo;764extern const uptr sa_siginfo;
744765
745#if SANITIZER_LINUX766# if SANITIZER_LINUX
746extern int e_tabsz;767extern int e_tabsz;
747#endif768# endif
748769
749extern int af_inet;770extern int af_inet;
750extern int af_inet6;771extern int af_inet6;
751uptr __sanitizer_in_addr_sz(int af);772uptr __sanitizer_in_addr_sz(int af);
752773
753#if SANITIZER_LINUX774# if SANITIZER_LINUX
754struct __sanitizer_dl_phdr_info {775struct __sanitizer_dl_phdr_info {
755 uptr dlpi_addr;776 uptr dlpi_addr;
756 const char *dlpi_name;777 const char *dlpi_name;
...@@ -759,7 +780,7 @@ struct __sanitizer_dl_phdr_info {...@@ -759,7 +780,7 @@ struct __sanitizer_dl_phdr_info {
759};780};
760781
761extern unsigned struct_ElfW_Phdr_sz;782extern unsigned struct_ElfW_Phdr_sz;
762#endif783# endif
763784
764struct __sanitizer_protoent {785struct __sanitizer_protoent {
765 char *p_name;786 char *p_name;
...@@ -779,15 +800,15 @@ struct __sanitizer_addrinfo {...@@ -779,15 +800,15 @@ struct __sanitizer_addrinfo {
779 int ai_family;800 int ai_family;
780 int ai_socktype;801 int ai_socktype;
781 int ai_protocol;802 int ai_protocol;
782#if SANITIZER_ANDROID || SANITIZER_APPLE803# if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_HAIKU
783 unsigned ai_addrlen;804 unsigned ai_addrlen;
784 char *ai_canonname;805 char *ai_canonname;
785 void *ai_addr;806 void *ai_addr;
786#else // LINUX807# else // LINUX
787 unsigned ai_addrlen;808 unsigned ai_addrlen;
788 void *ai_addr;809 void *ai_addr;
789 char *ai_canonname;810 char *ai_canonname;
790#endif811# endif
791 struct __sanitizer_addrinfo *ai_next;812 struct __sanitizer_addrinfo *ai_next;
792};813};
793814
...@@ -805,14 +826,14 @@ struct __sanitizer_pollfd {...@@ -805,14 +826,14 @@ struct __sanitizer_pollfd {
805 short revents;826 short revents;
806};827};
807828
808#if SANITIZER_ANDROID || SANITIZER_APPLE829# if SANITIZER_ANDROID || SANITIZER_APPLE
809typedef unsigned __sanitizer_nfds_t;830typedef unsigned __sanitizer_nfds_t;
810#else831# else
811typedef unsigned long __sanitizer_nfds_t;832typedef unsigned long __sanitizer_nfds_t;
812#endif833# endif
813834
814#if !SANITIZER_ANDROID835# if !SANITIZER_ANDROID
815# if SANITIZER_LINUX836# if SANITIZER_LINUX
816struct __sanitizer_glob_t {837struct __sanitizer_glob_t {
817 uptr gl_pathc;838 uptr gl_pathc;
818 char **gl_pathv;839 char **gl_pathv;
...@@ -825,13 +846,13 @@ struct __sanitizer_glob_t {...@@ -825,13 +846,13 @@ struct __sanitizer_glob_t {
825 int (*gl_lstat)(const char *, void *);846 int (*gl_lstat)(const char *, void *);
826 int (*gl_stat)(const char *, void *);847 int (*gl_stat)(const char *, void *);
827};848};
828# endif // SANITIZER_LINUX849# endif // SANITIZER_LINUX
829850
830# if SANITIZER_LINUX851# if SANITIZER_LINUX
831extern int glob_nomatch;852extern int glob_nomatch;
832extern int glob_altdirfunc;853extern int glob_altdirfunc;
833# endif854# endif
834#endif // !SANITIZER_ANDROID855# endif // !SANITIZER_ANDROID
835856
836extern unsigned path_max;857extern unsigned path_max;
837858
...@@ -845,7 +866,7 @@ struct __sanitizer_wordexp_t {...@@ -845,7 +866,7 @@ struct __sanitizer_wordexp_t {
845 uptr we_offs;866 uptr we_offs;
846};867};
847868
848#if SANITIZER_LINUX && !SANITIZER_ANDROID869# if SANITIZER_LINUX && !SANITIZER_ANDROID
849struct __sanitizer_FILE {870struct __sanitizer_FILE {
850 int _flags;871 int _flags;
851 char *_IO_read_ptr;872 char *_IO_read_ptr;
...@@ -863,11 +884,11 @@ struct __sanitizer_FILE {...@@ -863,11 +884,11 @@ struct __sanitizer_FILE {
863 __sanitizer_FILE *_chain;884 __sanitizer_FILE *_chain;
864 int _fileno;885 int _fileno;
865};886};
866# define SANITIZER_HAS_STRUCT_FILE 1887# define SANITIZER_HAS_STRUCT_FILE 1
867#else888# else
868typedef void __sanitizer_FILE;889typedef void __sanitizer_FILE;
869# define SANITIZER_HAS_STRUCT_FILE 0890# define SANITIZER_HAS_STRUCT_FILE 0
870#endif891# endif
871892
872# if SANITIZER_LINUX && !SANITIZER_ANDROID && \893# if SANITIZER_LINUX && !SANITIZER_ANDROID && \
873 (defined(__i386) || defined(__x86_64) || defined(__mips64) || \894 (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
...@@ -919,14 +940,14 @@ extern int shmctl_ipc_stat;...@@ -919,14 +940,14 @@ extern int shmctl_ipc_stat;
919extern int shmctl_ipc_info;940extern int shmctl_ipc_info;
920extern int shmctl_shm_info;941extern int shmctl_shm_info;
921extern int shmctl_shm_stat;942extern int shmctl_shm_stat;
922#endif943# endif
923944
924#if !SANITIZER_APPLE && !SANITIZER_FREEBSD945# if !SANITIZER_APPLE && !SANITIZER_FREEBSD
925extern unsigned struct_utmp_sz;946extern unsigned struct_utmp_sz;
926#endif947# endif
927#if !SANITIZER_ANDROID948# if !SANITIZER_ANDROID
928extern unsigned struct_utmpx_sz;949extern unsigned struct_utmpx_sz;
929#endif950# endif
930951
931extern int map_fixed;952extern int map_fixed;
932953
...@@ -936,13 +957,13 @@ struct __sanitizer_ifconf {...@@ -936,13 +957,13 @@ struct __sanitizer_ifconf {
936 union {957 union {
937 void *ifcu_req;958 void *ifcu_req;
938 } ifc_ifcu;959 } ifc_ifcu;
939#if SANITIZER_APPLE960# if SANITIZER_APPLE
940} __attribute__((packed));961} __attribute__((packed));
941#else962# else
942};963};
943#endif964# endif
944965
945#if SANITIZER_LINUX && !SANITIZER_ANDROID966# if SANITIZER_LINUX && !SANITIZER_ANDROID
946struct __sanitizer__obstack_chunk {967struct __sanitizer__obstack_chunk {
947 char *limit;968 char *limit;
948 struct __sanitizer__obstack_chunk *prev;969 struct __sanitizer__obstack_chunk *prev;
...@@ -969,57 +990,57 @@ struct __sanitizer_cookie_io_functions_t {...@@ -969,57 +990,57 @@ struct __sanitizer_cookie_io_functions_t {
969 __sanitizer_cookie_io_seek seek;990 __sanitizer_cookie_io_seek seek;
970 __sanitizer_cookie_io_close close;991 __sanitizer_cookie_io_close close;
971};992};
972#endif993# endif
973994
974#define IOC_NRBITS 8995# define IOC_NRBITS 8
975#define IOC_TYPEBITS 8996# define IOC_TYPEBITS 8
976#if defined(__powerpc__) || defined(__powerpc64__) || defined(__mips__) || \997# if defined(__powerpc__) || defined(__powerpc64__) || defined(__mips__) || \
977 defined(__sparc__)998 defined(__sparc__)
978#define IOC_SIZEBITS 13999# define IOC_SIZEBITS 13
979#define IOC_DIRBITS 31000# define IOC_DIRBITS 3
980#define IOC_NONE 1U1001# define IOC_NONE 1U
981#define IOC_WRITE 4U1002# define IOC_WRITE 4U
982#define IOC_READ 2U1003# define IOC_READ 2U
983#else1004# else
984#define IOC_SIZEBITS 141005# define IOC_SIZEBITS 14
985#define IOC_DIRBITS 21006# define IOC_DIRBITS 2
986#define IOC_NONE 0U1007# define IOC_NONE 0U
987#define IOC_WRITE 1U1008# define IOC_WRITE 1U
988#define IOC_READ 2U1009# define IOC_READ 2U
989#endif1010# endif
990#define IOC_NRMASK ((1 << IOC_NRBITS) - 1)1011# define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
991#define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)1012# define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
992#define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)1013# define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
993#if defined(IOC_DIRMASK)1014# if defined(IOC_DIRMASK)
994#undef IOC_DIRMASK1015# undef IOC_DIRMASK
995#endif1016# endif
996#define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)1017# define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
997#define IOC_NRSHIFT 01018# define IOC_NRSHIFT 0
998#define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)1019# define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
999#define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)1020# define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
1000#define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)1021# define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
1001#define EVIOC_EV_MAX 0x1f1022# define EVIOC_EV_MAX 0x1f
1002#define EVIOC_ABS_MAX 0x3f1023# define EVIOC_ABS_MAX 0x3f
10031024
1004#define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)1025# define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
1005#define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)1026# define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
1006#define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)1027# define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
10071028
1008#if defined(__sparc__)1029# if defined(__sparc__)
1009// In sparc the 14 bits SIZE field overlaps with the1030// In sparc the 14 bits SIZE field overlaps with the
1010// least significant bit of DIR, so either IOC_READ or1031// least significant bit of DIR, so either IOC_READ or
1011// IOC_WRITE shall be 1 in order to get a non-zero SIZE.1032// IOC_WRITE shall be 1 in order to get a non-zero SIZE.
1012#define IOC_SIZE(nr) \1033# define IOC_SIZE(nr) \
1013 ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))1034 ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
1014#else1035# else
1015#define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)1036# define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
1016#endif1037# endif
10171038
1018extern unsigned struct_ifreq_sz;1039extern unsigned struct_ifreq_sz;
1019extern unsigned struct_termios_sz;1040extern unsigned struct_termios_sz;
1020extern unsigned struct_winsize_sz;1041extern unsigned struct_winsize_sz;
10211042
1022#if SANITIZER_LINUX1043# if SANITIZER_LINUX
1023extern unsigned struct_arpreq_sz;1044extern unsigned struct_arpreq_sz;
1024extern unsigned struct_cdrom_msf_sz;1045extern unsigned struct_cdrom_msf_sz;
1025extern unsigned struct_cdrom_multisession_sz;1046extern unsigned struct_cdrom_multisession_sz;
...@@ -1046,9 +1067,9 @@ extern unsigned struct_mtpos_sz;...@@ -1046,9 +1067,9 @@ extern unsigned struct_mtpos_sz;
1046extern unsigned struct_vt_consize_sz;1067extern unsigned struct_vt_consize_sz;
1047extern unsigned struct_vt_sizes_sz;1068extern unsigned struct_vt_sizes_sz;
1048extern unsigned struct_vt_stat_sz;1069extern unsigned struct_vt_stat_sz;
1049#endif // SANITIZER_LINUX1070# endif // SANITIZER_LINUX
10501071
1051#if SANITIZER_LINUX1072# if SANITIZER_LINUX
1052extern unsigned struct_copr_buffer_sz;1073extern unsigned struct_copr_buffer_sz;
1053extern unsigned struct_copr_debug_buf_sz;1074extern unsigned struct_copr_debug_buf_sz;
1054extern unsigned struct_copr_msg_sz;1075extern unsigned struct_copr_msg_sz;
...@@ -1060,9 +1081,9 @@ extern unsigned struct_sbi_instrument_sz;...@@ -1060,9 +1081,9 @@ extern unsigned struct_sbi_instrument_sz;
1060extern unsigned struct_seq_event_rec_sz;1081extern unsigned struct_seq_event_rec_sz;
1061extern unsigned struct_synth_info_sz;1082extern unsigned struct_synth_info_sz;
1062extern unsigned struct_vt_mode_sz;1083extern unsigned struct_vt_mode_sz;
1063#endif // SANITIZER_LINUX1084# endif // SANITIZER_LINUX
10641085
1065#if SANITIZER_LINUX && !SANITIZER_ANDROID1086# if SANITIZER_LINUX && !SANITIZER_ANDROID
1066extern unsigned struct_ax25_parms_struct_sz;1087extern unsigned struct_ax25_parms_struct_sz;
1067extern unsigned struct_input_keymap_entry_sz;1088extern unsigned struct_input_keymap_entry_sz;
1068extern unsigned struct_ipx_config_data_sz;1089extern unsigned struct_ipx_config_data_sz;
...@@ -1083,15 +1104,15 @@ extern unsigned struct_unimapinit_sz;...@@ -1083,15 +1104,15 @@ extern unsigned struct_unimapinit_sz;
10831104
1084extern const unsigned long __sanitizer_bufsiz;1105extern const unsigned long __sanitizer_bufsiz;
10851106
1086#if SANITIZER_LINUX && !SANITIZER_ANDROID1107# if SANITIZER_LINUX && !SANITIZER_ANDROID
1087extern unsigned struct_audio_buf_info_sz;1108extern unsigned struct_audio_buf_info_sz;
1088extern unsigned struct_ppp_stats_sz;1109extern unsigned struct_ppp_stats_sz;
1089#endif // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID1110# endif // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
10901111
1091#if !SANITIZER_ANDROID && !SANITIZER_APPLE1112# if !SANITIZER_ANDROID && !SANITIZER_APPLE
1092extern unsigned struct_sioc_sg_req_sz;1113extern unsigned struct_sioc_sg_req_sz;
1093extern unsigned struct_sioc_vif_req_sz;1114extern unsigned struct_sioc_vif_req_sz;
1094#endif1115# endif
10951116
1096extern unsigned fpos_t_sz;1117extern unsigned fpos_t_sz;
10971118
...@@ -1127,29 +1148,31 @@ extern unsigned IOCTL_SIOCSIFMETRIC;...@@ -1127,29 +1148,31 @@ extern unsigned IOCTL_SIOCSIFMETRIC;
1127extern unsigned IOCTL_SIOCSIFMTU;1148extern unsigned IOCTL_SIOCSIFMTU;
1128extern unsigned IOCTL_SIOCSIFNETMASK;1149extern unsigned IOCTL_SIOCSIFNETMASK;
1129extern unsigned IOCTL_SIOCSPGRP;1150extern unsigned IOCTL_SIOCSPGRP;
1151# if !SANITIZER_HAIKU
1130extern unsigned IOCTL_TIOCCONS;1152extern unsigned IOCTL_TIOCCONS;
1131extern unsigned IOCTL_TIOCEXCL;
1132extern unsigned IOCTL_TIOCGETD;1153extern unsigned IOCTL_TIOCGETD;
1154extern unsigned IOCTL_TIOCNOTTY;
1155extern unsigned IOCTL_TIOCPKT;
1156extern unsigned IOCTL_TIOCSETD;
1157extern unsigned IOCTL_TIOCSTI;
1158# endif
1159extern unsigned IOCTL_TIOCEXCL;
1133extern unsigned IOCTL_TIOCGPGRP;1160extern unsigned IOCTL_TIOCGPGRP;
1134extern unsigned IOCTL_TIOCGWINSZ;1161extern unsigned IOCTL_TIOCGWINSZ;
1135extern unsigned IOCTL_TIOCMBIC;1162extern unsigned IOCTL_TIOCMBIC;
1136extern unsigned IOCTL_TIOCMBIS;1163extern unsigned IOCTL_TIOCMBIS;
1137extern unsigned IOCTL_TIOCMGET;1164extern unsigned IOCTL_TIOCMGET;
1138extern unsigned IOCTL_TIOCMSET;1165extern unsigned IOCTL_TIOCMSET;
1139extern unsigned IOCTL_TIOCNOTTY;
1140extern unsigned IOCTL_TIOCNXCL;1166extern unsigned IOCTL_TIOCNXCL;
1141extern unsigned IOCTL_TIOCOUTQ;1167extern unsigned IOCTL_TIOCOUTQ;
1142extern unsigned IOCTL_TIOCPKT;
1143extern unsigned IOCTL_TIOCSCTTY;1168extern unsigned IOCTL_TIOCSCTTY;
1144extern unsigned IOCTL_TIOCSETD;
1145extern unsigned IOCTL_TIOCSPGRP;1169extern unsigned IOCTL_TIOCSPGRP;
1146extern unsigned IOCTL_TIOCSTI;
1147extern unsigned IOCTL_TIOCSWINSZ;1170extern unsigned IOCTL_TIOCSWINSZ;
1148#if SANITIZER_LINUX && !SANITIZER_ANDROID1171# if SANITIZER_LINUX && !SANITIZER_ANDROID
1149extern unsigned IOCTL_SIOCGETSGCNT;1172extern unsigned IOCTL_SIOCGETSGCNT;
1150extern unsigned IOCTL_SIOCGETVIFCNT;1173extern unsigned IOCTL_SIOCGETVIFCNT;
1151#endif1174# endif
1152#if SANITIZER_LINUX1175# if SANITIZER_LINUX
1153extern unsigned IOCTL_EVIOCGABS;1176extern unsigned IOCTL_EVIOCGABS;
1154extern unsigned IOCTL_EVIOCGBIT;1177extern unsigned IOCTL_EVIOCGBIT;
1155extern unsigned IOCTL_EVIOCGEFFECTS;1178extern unsigned IOCTL_EVIOCGEFFECTS;
...@@ -1415,9 +1438,9 @@ extern unsigned IOCTL_VT_OPENQRY;...@@ -1415,9 +1438,9 @@ extern unsigned IOCTL_VT_OPENQRY;
1415extern unsigned IOCTL_VT_RELDISP;1438extern unsigned IOCTL_VT_RELDISP;
1416extern unsigned IOCTL_VT_SETMODE;1439extern unsigned IOCTL_VT_SETMODE;
1417extern unsigned IOCTL_VT_WAITACTIVE;1440extern unsigned IOCTL_VT_WAITACTIVE;
1418#endif // SANITIZER_LINUX1441# endif // SANITIZER_LINUX
14191442
1420#if SANITIZER_LINUX && !SANITIZER_ANDROID1443# if SANITIZER_LINUX && !SANITIZER_ANDROID
1421extern unsigned IOCTL_EQL_EMANCIPATE;1444extern unsigned IOCTL_EQL_EMANCIPATE;
1422extern unsigned IOCTL_EQL_ENSLAVE;1445extern unsigned IOCTL_EQL_ENSLAVE;
1423extern unsigned IOCTL_EQL_GETMASTRCFG;1446extern unsigned IOCTL_EQL_GETMASTRCFG;
...@@ -1506,35 +1529,44 @@ extern unsigned IOCTL_KDSETMODE;...@@ -1506,35 +1529,44 @@ extern unsigned IOCTL_KDSETMODE;
1506extern unsigned IOCTL_KDSKBMODE;1529extern unsigned IOCTL_KDSKBMODE;
1507extern unsigned IOCTL_KIOCSOUND;1530extern unsigned IOCTL_KIOCSOUND;
1508extern unsigned IOCTL_PIO_SCRNMAP;1531extern unsigned IOCTL_PIO_SCRNMAP;
1509#endif1532# endif
1533
1534# if SANITIZER_GLIBC
1535struct __sanitizer_servent {
1536 char *s_name;
1537 char **s_aliases;
1538 int s_port;
1539 char *s_proto;
1540};
1541# endif
15101542
1511extern const int si_SEGV_MAPERR;1543extern const int si_SEGV_MAPERR;
1512extern const int si_SEGV_ACCERR;1544extern const int si_SEGV_ACCERR;
1513} // namespace __sanitizer1545} // namespace __sanitizer
15141546
1515#define CHECK_TYPE_SIZE(TYPE) \1547# define CHECK_TYPE_SIZE(TYPE) \
1516 COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))1548 COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
15171549
1518#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \1550# define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \
1519 COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *)NULL)->MEMBER) == \1551 COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *)NULL)->MEMBER) == \
1520 sizeof(((CLASS *)NULL)->MEMBER)); \1552 sizeof(((CLASS *)NULL)->MEMBER)); \
1521 COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \1553 COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \
1522 offsetof(CLASS, MEMBER))1554 offsetof(CLASS, MEMBER))
15231555
1524// For sigaction, which is a function and struct at the same time,1556// For sigaction, which is a function and struct at the same time,
1525// and thus requires explicit "struct" in sizeof() expression.1557// and thus requires explicit "struct" in sizeof() expression.
1526#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \1558# define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \
1527 COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *)NULL)->MEMBER) == \1559 COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *)NULL)->MEMBER) == \
1528 sizeof(((struct CLASS *)NULL)->MEMBER)); \1560 sizeof(((struct CLASS *)NULL)->MEMBER)); \
1529 COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \1561 COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \
1530 offsetof(struct CLASS, MEMBER))1562 offsetof(struct CLASS, MEMBER))
15311563
1532#define SIGACTION_SYMNAME sigaction1564# define SIGACTION_SYMNAME sigaction
15331565
1534# if SANITIZER_LINUX1566# if SANITIZER_LINUX
1535typedef void *__sanitizer_timer_t;1567typedef void *__sanitizer_timer_t;
1536# endif1568# endif
15371569
1538#endif // SANITIZER_LINUX || SANITIZER_APPLE1570#endif // SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
15391571
1540#endif1572#endif
lib/libtsan/sanitizer_common/sanitizer_procmaps.h+1-1
...@@ -16,7 +16,7 @@...@@ -16,7 +16,7 @@
16#include "sanitizer_platform.h"16#include "sanitizer_platform.h"
1717
18#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \18#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \
19 SANITIZER_APPLE || SANITIZER_SOLARIS || \19 SANITIZER_APPLE || SANITIZER_SOLARIS || SANITIZER_HAIKU || \
20 SANITIZER_FUCHSIA20 SANITIZER_FUCHSIA
2121
22#include "sanitizer_common.h"22#include "sanitizer_common.h"
lib/libtsan/sanitizer_common/sanitizer_procmaps_haiku.cpp created+94
...@@ -0,0 +1,94 @@
1//===-- sanitizer_procmaps_haiku.cpp --------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Information about the process mappings
10// (Haiku-specific parts).
11//===----------------------------------------------------------------------===//
12
13#include "sanitizer_platform.h"
14#if SANITIZER_HAIKU
15# include "sanitizer_common.h"
16# include "sanitizer_procmaps.h"
17
18# include <kernel/OS.h>
19
20namespace __sanitizer {
21
22void MemoryMappedSegment::AddAddressRanges(LoadedModule *module) {
23 // data_ should be unused on this platform
24 CHECK(!data_);
25 module->addAddressRange(start, end, IsExecutable(), IsWritable());
26}
27
28MemoryMappingLayout::MemoryMappingLayout(bool) { Reset(); }
29
30void MemoryMappingLayout::Reset() { data_.cookie = 0; }
31
32MemoryMappingLayout::~MemoryMappingLayout() {}
33
34// static
35void MemoryMappingLayout::CacheMemoryMappings() {}
36
37bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
38 area_info info;
39 if (get_next_area_info(B_CURRENT_TEAM, &data_.cookie, &info) != B_OK)
40 return false;
41
42 segment->start = (uptr)info.address;
43 segment->end = (uptr)info.address + info.size;
44 segment->offset = 0;
45 segment->protection = 0;
46 if (info.protection & B_READ_AREA)
47 segment->protection |= kProtectionRead;
48 if (info.protection & B_WRITE_AREA)
49 segment->protection |= kProtectionWrite;
50 if (info.protection & B_EXECUTE_AREA)
51 segment->protection |= kProtectionExecute;
52 if (segment->filename) {
53 uptr len = Min((uptr)B_OS_NAME_LENGTH, segment->filename_size - 1);
54 internal_strncpy(segment->filename, info.name, len);
55 segment->filename[len] = 0;
56 }
57 return true;
58}
59
60bool MemoryMappingLayout::Error() const { return false; }
61
62void MemoryMappingLayout::DumpListOfModules(
63 InternalMmapVectorNoCtor<LoadedModule> *modules) {
64 Reset();
65 InternalMmapVector<char> module_name(kMaxPathLength);
66 MemoryMappedSegment segment(module_name.data(), module_name.size());
67 for (uptr i = 0; Next(&segment); i++) {
68 const char *cur_name = segment.filename;
69 if (cur_name[0] == '\0')
70 continue;
71 // Don't subtract 'cur_beg' from the first entry:
72 // * If a binary is compiled w/o -pie, then the first entry in
73 // process maps is likely the binary itself (all dynamic libs
74 // are mapped higher in address space). For such a binary,
75 // instruction offset in binary coincides with the actual
76 // instruction address in virtual memory (as code section
77 // is mapped to a fixed memory range).
78 // * If a binary is compiled with -pie, all the modules are
79 // mapped high at address space (in particular, higher than
80 // shadow memory of the tool), so the module can't be the
81 // first entry.
82 uptr base_address = (i ? segment.start : 0) - segment.offset;
83 LoadedModule cur_module;
84 cur_module.set(cur_name, base_address);
85 segment.AddAddressRanges(&cur_module);
86 modules->push_back(cur_module);
87 }
88}
89
90void GetMemoryProfile(fill_profile_f cb, uptr *stats) {}
91
92} // namespace __sanitizer
93
94#endif
lib/libtsan/sanitizer_common/sanitizer_procmaps_mac.cpp+28-8
...@@ -334,9 +334,22 @@ static const load_command *NextCommand(const load_command *lc) {...@@ -334,9 +334,22 @@ static const load_command *NextCommand(const load_command *lc) {
334 return (const load_command *)((const char *)lc + lc->cmdsize);334 return (const load_command *)((const char *)lc + lc->cmdsize);
335}335}
336336
337static void FindUUID(const load_command *first_lc, u8 *uuid_output) {337# ifdef MH_MAGIC_64
338 for (const load_command *lc = first_lc; lc->cmd != 0; lc = NextCommand(lc)) {338static constexpr size_t header_size = sizeof(mach_header_64);
339 if (lc->cmd != LC_UUID) continue;339# else
340static constexpr size_t header_size = sizeof(mach_header);
341# endif
342
343static void FindUUID(const load_command *first_lc, const mach_header *hdr,
344 u8 *uuid_output) {
345 uint32_t curcmd = 0;
346 for (const load_command *lc = first_lc; curcmd < hdr->ncmds;
347 curcmd++, lc = NextCommand(lc)) {
348 CHECK_LT((const char *)lc,
349 (const char *)hdr + header_size + hdr->sizeofcmds);
350
351 if (lc->cmd != LC_UUID)
352 continue;
340353
341 const uuid_command *uuid_lc = (const uuid_command *)lc;354 const uuid_command *uuid_lc = (const uuid_command *)lc;
342 const uint8_t *uuid = &uuid_lc->uuid[0];355 const uint8_t *uuid = &uuid_lc->uuid[0];
...@@ -345,9 +358,16 @@ static void FindUUID(const load_command *first_lc, u8 *uuid_output) {...@@ -345,9 +358,16 @@ static void FindUUID(const load_command *first_lc, u8 *uuid_output) {
345 }358 }
346}359}
347360
348static bool IsModuleInstrumented(const load_command *first_lc) {361static bool IsModuleInstrumented(const load_command *first_lc,
349 for (const load_command *lc = first_lc; lc->cmd != 0; lc = NextCommand(lc)) {362 const mach_header *hdr) {
350 if (lc->cmd != LC_LOAD_DYLIB) continue;363 uint32_t curcmd = 0;
364 for (const load_command *lc = first_lc; curcmd < hdr->ncmds;
365 curcmd++, lc = NextCommand(lc)) {
366 CHECK_LT((const char *)lc,
367 (const char *)hdr + header_size + hdr->sizeofcmds);
368
369 if (lc->cmd != LC_LOAD_DYLIB)
370 continue;
351371
352 const dylib_command *dylib_lc = (const dylib_command *)lc;372 const dylib_command *dylib_lc = (const dylib_command *)lc;
353 uint32_t dylib_name_offset = dylib_lc->dylib.name.offset;373 uint32_t dylib_name_offset = dylib_lc->dylib.name.offset;
...@@ -393,10 +413,10 @@ bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {...@@ -393,10 +413,10 @@ bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
393 continue;413 continue;
394 }414 }
395 }415 }
396 FindUUID((const load_command *)data_.current_load_cmd_addr,416 FindUUID((const load_command *)data_.current_load_cmd_addr, hdr,
397 data_.current_uuid);417 data_.current_uuid);
398 data_.current_instrumented = IsModuleInstrumented(418 data_.current_instrumented = IsModuleInstrumented(
399 (const load_command *)data_.current_load_cmd_addr);419 (const load_command *)data_.current_load_cmd_addr, hdr);
400 }420 }
401421
402 while (data_.current_load_cmd_count > 0) {422 while (data_.current_load_cmd_count > 0) {
lib/libtsan/sanitizer_common/sanitizer_procmaps_solaris.cpp-3
...@@ -9,9 +9,6 @@...@@ -9,9 +9,6 @@
9// Information about the process mappings (Solaris-specific parts).9// Information about the process mappings (Solaris-specific parts).
10//===----------------------------------------------------------------------===//10//===----------------------------------------------------------------------===//
1111
12// Before Solaris 11.4, <procfs.h> doesn't work in a largefile environment.
13#undef _FILE_OFFSET_BITS
14
15// Avoid conflict between `_TIME_BITS` defined vs. `_FILE_OFFSET_BITS`12// Avoid conflict between `_TIME_BITS` defined vs. `_FILE_OFFSET_BITS`
16// undefined in some Linux configurations.13// undefined in some Linux configurations.
17#undef _TIME_BITS14#undef _TIME_BITS
lib/libtsan/sanitizer_common/sanitizer_redefine_builtins.h+1-1
...@@ -15,7 +15,7 @@...@@ -15,7 +15,7 @@
15# define SANITIZER_REDEFINE_BUILTINS_H15# define SANITIZER_REDEFINE_BUILTINS_H
1616
17// The asm hack only works with GCC and Clang.17// The asm hack only works with GCC and Clang.
18# if !defined(_WIN32)18# if !defined(_WIN32) && !defined(_AIX)
1919
20asm(R"(20asm(R"(
21 .set memcpy, __sanitizer_internal_memcpy21 .set memcpy, __sanitizer_internal_memcpy
lib/libtsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp+23-24
...@@ -38,25 +38,28 @@...@@ -38,25 +38,28 @@
38# include <asm/ptrace.h>38# include <asm/ptrace.h>
39#endif39#endif
40#include <sys/user.h> // for user_regs_struct40#include <sys/user.h> // for user_regs_struct
41#if SANITIZER_ANDROID && SANITIZER_MIPS41# if SANITIZER_MIPS
42# include <asm/reg.h> // for mips SP register in sys/user.h42// clang-format off
43#endif43# include <asm/sgidefs.h> // <asm/sgidefs.h> must be included before <asm/reg.h>
44#include <sys/wait.h> // for signal-related stuff44# include <asm/reg.h> // for mips SP register
4545// clang-format on
46#ifdef sa_handler46# endif
47# undef sa_handler47# include <sys/wait.h> // for signal-related stuff
48#endif48
4949# ifdef sa_handler
50#ifdef sa_sigaction50# undef sa_handler
51# undef sa_sigaction51# endif
52#endif52
5353# ifdef sa_sigaction
54#include "sanitizer_common.h"54# undef sa_sigaction
55#include "sanitizer_flags.h"55# endif
56#include "sanitizer_libc.h"56
57#include "sanitizer_linux.h"57# include "sanitizer_common.h"
58#include "sanitizer_mutex.h"58# include "sanitizer_flags.h"
59#include "sanitizer_placement_new.h"59# include "sanitizer_libc.h"
60# include "sanitizer_linux.h"
61# include "sanitizer_mutex.h"
62# include "sanitizer_placement_new.h"
6063
61// Sufficiently old kernel headers don't provide this value, but we can still64// Sufficiently old kernel headers don't provide this value, but we can still
62// call prctl with it. If the runtime kernel is new enough, the prctl call will65// call prctl with it. If the runtime kernel is new enough, the prctl call will
...@@ -511,11 +514,7 @@ typedef pt_regs regs_struct;...@@ -511,11 +514,7 @@ typedef pt_regs regs_struct;
511514
512#elif defined(__mips__)515#elif defined(__mips__)
513typedef struct user regs_struct;516typedef struct user regs_struct;
514# if SANITIZER_ANDROID517# define REG_SP regs[EF_R29]
515# define REG_SP regs[EF_R29]
516# else
517# define REG_SP regs[EF_REG29]
518# endif
519518
520#elif defined(__aarch64__)519#elif defined(__aarch64__)
521typedef struct user_pt_regs regs_struct;520typedef struct user_pt_regs regs_struct;
lib/libtsan/sanitizer_common/sanitizer_stoptheworld_win.cpp+2
...@@ -49,6 +49,8 @@ struct SuspendedThreadsListWindows final : public SuspendedThreadsList {...@@ -49,6 +49,8 @@ struct SuspendedThreadsListWindows final : public SuspendedThreadsList {
49# define SP_REG Esp49# define SP_REG Esp
50# elif SANITIZER_ARM | SANITIZER_ARM6450# elif SANITIZER_ARM | SANITIZER_ARM64
51# define SP_REG Sp51# define SP_REG Sp
52# elif SANITIZER_MIPS32
53# define SP_REG IntSp
52# else54# else
53# error Architecture not supported!55# error Architecture not supported!
54# endif56# endif
lib/libtsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp+45-41
...@@ -31,11 +31,12 @@ Symbolizer *Symbolizer::GetOrInit() {...@@ -31,11 +31,12 @@ Symbolizer *Symbolizer::GetOrInit() {
3131
32const char *ExtractToken(const char *str, const char *delims, char **result) {32const char *ExtractToken(const char *str, const char *delims, char **result) {
33 uptr prefix_len = internal_strcspn(str, delims);33 uptr prefix_len = internal_strcspn(str, delims);
34 *result = (char*)InternalAlloc(prefix_len + 1);34 *result = (char *)InternalAlloc(prefix_len + 1);
35 internal_memcpy(*result, str, prefix_len);35 internal_memcpy(*result, str, prefix_len);
36 (*result)[prefix_len] = '\0';36 (*result)[prefix_len] = '\0';
37 const char *prefix_end = str + prefix_len;37 const char *prefix_end = str + prefix_len;
38 if (*prefix_end != '\0') prefix_end++;38 if (*prefix_end != '\0')
39 prefix_end++;
39 return prefix_end;40 return prefix_end;
40}41}
4142
...@@ -78,7 +79,8 @@ const char *ExtractTokenUpToDelimiter(const char *str, const char *delimiter,...@@ -78,7 +79,8 @@ const char *ExtractTokenUpToDelimiter(const char *str, const char *delimiter,
78 internal_memcpy(*result, str, prefix_len);79 internal_memcpy(*result, str, prefix_len);
79 (*result)[prefix_len] = '\0';80 (*result)[prefix_len] = '\0';
80 const char *prefix_end = str + prefix_len;81 const char *prefix_end = str + prefix_len;
81 if (*prefix_end != '\0') prefix_end += internal_strlen(delimiter);82 if (*prefix_end != '\0')
83 prefix_end += internal_strlen(delimiter);
82 return prefix_end;84 return prefix_end;
83}85}
8486
...@@ -215,18 +217,20 @@ const LoadedModule *Symbolizer::FindModuleForAddress(uptr address) {...@@ -215,18 +217,20 @@ const LoadedModule *Symbolizer::FindModuleForAddress(uptr address) {
215 modules_were_reloaded = true;217 modules_were_reloaded = true;
216 }218 }
217 const LoadedModule *module = SearchForModule(modules_, address);219 const LoadedModule *module = SearchForModule(modules_, address);
218 if (module) return module;220 if (module)
221 return module;
219222
220 // dlopen/dlclose interceptors invalidate the module list, but when223 // dlopen/dlclose interceptors invalidate the module list, but when
221 // interception is disabled, we need to retry if the lookup fails in224 // interception is disabled, we need to retry if the lookup fails in
222 // case the module list changed.225 // case the module list changed.
223#if !SANITIZER_INTERCEPT_DLOPEN_DLCLOSE226# if !SANITIZER_INTERCEPT_DLOPEN_DLCLOSE
224 if (!modules_were_reloaded) {227 if (!modules_were_reloaded) {
225 RefreshModules();228 RefreshModules();
226 module = SearchForModule(modules_, address);229 module = SearchForModule(modules_, address);
227 if (module) return module;230 if (module)
231 return module;
228 }232 }
229#endif233# endif
230234
231 if (fallback_modules_.size()) {235 if (fallback_modules_.size()) {
232 module = SearchForModule(fallback_modules_, address);236 module = SearchForModule(fallback_modules_, address);
...@@ -260,31 +264,31 @@ class LLVMSymbolizerProcess final : public SymbolizerProcess {...@@ -260,31 +264,31 @@ class LLVMSymbolizerProcess final : public SymbolizerProcess {
260 // script/asan_symbolize.py and sanitizer_common.h.264 // script/asan_symbolize.py and sanitizer_common.h.
261 void GetArgV(const char *path_to_binary,265 void GetArgV(const char *path_to_binary,
262 const char *(&argv)[kArgVMax]) const override {266 const char *(&argv)[kArgVMax]) const override {
263#if defined(__x86_64h__)267# if defined(__x86_64h__)
264 const char* const kSymbolizerArch = "--default-arch=x86_64h";268 const char *const kSymbolizerArch = "--default-arch=x86_64h";
265#elif defined(__x86_64__)269# elif defined(__x86_64__)
266 const char* const kSymbolizerArch = "--default-arch=x86_64";270 const char *const kSymbolizerArch = "--default-arch=x86_64";
267#elif defined(__i386__)271# elif defined(__i386__)
268 const char* const kSymbolizerArch = "--default-arch=i386";272 const char *const kSymbolizerArch = "--default-arch=i386";
269#elif SANITIZER_LOONGARCH64273# elif SANITIZER_LOONGARCH64
270 const char *const kSymbolizerArch = "--default-arch=loongarch64";274 const char *const kSymbolizerArch = "--default-arch=loongarch64";
271#elif SANITIZER_RISCV64275# elif SANITIZER_RISCV64
272 const char *const kSymbolizerArch = "--default-arch=riscv64";276 const char *const kSymbolizerArch = "--default-arch=riscv64";
273#elif defined(__aarch64__)277# elif defined(__aarch64__)
274 const char* const kSymbolizerArch = "--default-arch=arm64";278 const char *const kSymbolizerArch = "--default-arch=arm64";
275#elif defined(__arm__)279# elif defined(__arm__)
276 const char* const kSymbolizerArch = "--default-arch=arm";280 const char *const kSymbolizerArch = "--default-arch=arm";
277#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__281# elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
278 const char* const kSymbolizerArch = "--default-arch=powerpc64";282 const char *const kSymbolizerArch = "--default-arch=powerpc64";
279#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__283# elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
280 const char* const kSymbolizerArch = "--default-arch=powerpc64le";284 const char *const kSymbolizerArch = "--default-arch=powerpc64le";
281#elif defined(__s390x__)285# elif defined(__s390x__)
282 const char* const kSymbolizerArch = "--default-arch=s390x";286 const char *const kSymbolizerArch = "--default-arch=s390x";
283#elif defined(__s390__)287# elif defined(__s390__)
284 const char* const kSymbolizerArch = "--default-arch=s390";288 const char *const kSymbolizerArch = "--default-arch=s390";
285#else289# else
286 const char* const kSymbolizerArch = "--default-arch=unknown";290 const char *const kSymbolizerArch = "--default-arch=unknown";
287#endif291# endif
288292
289 const char *const demangle_flag =293 const char *const demangle_flag =
290 common_flags()->demangle ? "--demangle" : "--no-demangle";294 common_flags()->demangle ? "--demangle" : "--no-demangle";
...@@ -315,7 +319,8 @@ static const char *ParseFileLineInfo(AddressInfo *info, const char *str) {...@@ -315,7 +319,8 @@ static const char *ParseFileLineInfo(AddressInfo *info, const char *str) {
315 char *back = file_line_info + size - 1;319 char *back = file_line_info + size - 1;
316 for (int i = 0; i < 2; ++i) {320 for (int i = 0; i < 2; ++i) {
317 while (back > file_line_info && IsDigit(*back)) --back;321 while (back > file_line_info && IsDigit(*back)) --back;
318 if (*back != ':' || !IsDigit(back[1])) break;322 if (*back != ':' || !IsDigit(back[1]))
323 break;
319 info->column = info->line;324 info->column = info->line;
320 info->line = internal_atoll(back + 1);325 info->line = internal_atoll(back + 1);
321 // Truncate the string at the colon to keep only filename.326 // Truncate the string at the colon to keep only filename.
...@@ -436,7 +441,7 @@ bool LLVMSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {...@@ -436,7 +441,7 @@ bool LLVMSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {
436 if (!buf)441 if (!buf)
437 return false;442 return false;
438 ParseSymbolizeDataOutput(buf, info);443 ParseSymbolizeDataOutput(buf, info);
439 info->start += (addr - info->module_offset); // Add the base address.444 info->start += (addr - info->module_offset); // Add the base address.
440 return true;445 return true;
441}446}
442447
...@@ -459,10 +464,9 @@ const char *LLVMSymbolizer::FormatAndSendCommand(const char *command_prefix,...@@ -459,10 +464,9 @@ const char *LLVMSymbolizer::FormatAndSendCommand(const char *command_prefix,
459 size_needed = internal_snprintf(buffer_, kBufferSize, "%s \"%s\" 0x%zx\n",464 size_needed = internal_snprintf(buffer_, kBufferSize, "%s \"%s\" 0x%zx\n",
460 command_prefix, module_name, module_offset);465 command_prefix, module_name, module_offset);
461 else466 else
462 size_needed = internal_snprintf(buffer_, kBufferSize,467 size_needed = internal_snprintf(
463 "%s \"%s:%s\" 0x%zx\n", command_prefix,468 buffer_, kBufferSize, "%s \"%s:%s\" 0x%zx\n", command_prefix,
464 module_name, ModuleArchToString(arch),469 module_name, ModuleArchToString(arch), module_offset);
465 module_offset);
466470
467 if (size_needed >= static_cast<int>(kBufferSize)) {471 if (size_needed >= static_cast<int>(kBufferSize)) {
468 Report("WARNING: Command buffer too small");472 Report("WARNING: Command buffer too small");
...@@ -484,9 +488,9 @@ SymbolizerProcess::SymbolizerProcess(const char *path, bool use_posix_spawn)...@@ -484,9 +488,9 @@ SymbolizerProcess::SymbolizerProcess(const char *path, bool use_posix_spawn)
484 CHECK_NE(path_[0], '\0');488 CHECK_NE(path_[0], '\0');
485}489}
486490
487static bool IsSameModule(const char* path) {491static bool IsSameModule(const char *path) {
488 if (const char* ProcessName = GetProcessName()) {492 if (const char *ProcessName = GetProcessName()) {
489 if (const char* SymbolizerName = StripModuleName(path)) {493 if (const char *SymbolizerName = StripModuleName(path)) {
490 return !internal_strcmp(ProcessName, SymbolizerName);494 return !internal_strcmp(ProcessName, SymbolizerName);
491 }495 }
492 }496 }
...@@ -516,9 +520,9 @@ const char *SymbolizerProcess::SendCommand(const char *command) {...@@ -516,9 +520,9 @@ const char *SymbolizerProcess::SendCommand(const char *command) {
516520
517const char *SymbolizerProcess::SendCommandImpl(const char *command) {521const char *SymbolizerProcess::SendCommandImpl(const char *command) {
518 if (input_fd_ == kInvalidFd || output_fd_ == kInvalidFd)522 if (input_fd_ == kInvalidFd || output_fd_ == kInvalidFd)
519 return nullptr;523 return nullptr;
520 if (!WriteToSymbolizer(command, internal_strlen(command)))524 if (!WriteToSymbolizer(command, internal_strlen(command)))
521 return nullptr;525 return nullptr;
522 if (!ReadFromSymbolizer())526 if (!ReadFromSymbolizer())
523 return nullptr;527 return nullptr;
524 return buffer_.data();528 return buffer_.data();
lib/libtsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp+56-44
...@@ -38,9 +38,10 @@...@@ -38,9 +38,10 @@
38// because we do not require a C++ ABI library to be linked to a program38// because we do not require a C++ ABI library to be linked to a program
39// using sanitizers; if it's not present, we'll just use the mangled name.39// using sanitizers; if it's not present, we'll just use the mangled name.
40namespace __cxxabiv1 {40namespace __cxxabiv1 {
41 extern "C" SANITIZER_WEAK_ATTRIBUTE41extern "C" SANITIZER_WEAK_ATTRIBUTE char *__cxa_demangle(const char *mangled,
42 char *__cxa_demangle(const char *mangled, char *buffer,42 char *buffer,
43 size_t *length, int *status);43 size_t *length,
44 int *status);
44}45}
4546
46namespace __sanitizer {47namespace __sanitizer {
...@@ -53,8 +54,7 @@ const char *DemangleCXXABI(const char *name) {...@@ -53,8 +54,7 @@ const char *DemangleCXXABI(const char *name) {
53 // it does not allocate). For now, we just call it anyway, and we leak54 // it does not allocate). For now, we just call it anyway, and we leak
54 // the returned value.55 // the returned value.
55 if (&__cxxabiv1::__cxa_demangle)56 if (&__cxxabiv1::__cxa_demangle)
56 if (const char *demangled_name =57 if (const char *demangled_name = __cxxabiv1::__cxa_demangle(name, 0, 0, 0))
57 __cxxabiv1::__cxa_demangle(name, 0, 0, 0))
58 return demangled_name;58 return demangled_name;
5959
60 return nullptr;60 return nullptr;
...@@ -85,7 +85,8 @@ const char *DemangleSwift(const char *name) {...@@ -85,7 +85,8 @@ const char *DemangleSwift(const char *name) {
85}85}
8686
87const char *DemangleSwiftAndCXX(const char *name) {87const char *DemangleSwiftAndCXX(const char *name) {
88 if (!name) return nullptr;88 if (!name)
89 return nullptr;
89 if (const char *swift_demangled_name = DemangleSwift(name))90 if (const char *swift_demangled_name = DemangleSwift(name))
90 return swift_demangled_name;91 return swift_demangled_name;
91 return DemangleCXXABI(name);92 return DemangleCXXABI(name);
...@@ -114,7 +115,8 @@ static bool CreateTwoHighNumberedPipes(int *infd_, int *outfd_) {...@@ -114,7 +115,8 @@ static bool CreateTwoHighNumberedPipes(int *infd_, int *outfd_) {
114 } else {115 } else {
115 outfd = sock_pair[i];116 outfd = sock_pair[i];
116 for (int j = 0; j < i; j++) {117 for (int j = 0; j < i; j++) {
117 if (sock_pair[j] == infd) continue;118 if (sock_pair[j] == infd)
119 continue;
118 internal_close(sock_pair[j][0]);120 internal_close(sock_pair[j][0]);
119 internal_close(sock_pair[j][1]);121 internal_close(sock_pair[j][1]);
120 }122 }
...@@ -155,7 +157,7 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() {...@@ -155,7 +157,7 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() {
155 }157 }
156158
157 if (use_posix_spawn_) {159 if (use_posix_spawn_) {
158#if SANITIZER_APPLE160# if SANITIZER_APPLE
159 fd_t fd = internal_spawn(argv, const_cast<const char **>(GetEnvP()), &pid);161 fd_t fd = internal_spawn(argv, const_cast<const char **>(GetEnvP()), &pid);
160 if (fd == kInvalidFd) {162 if (fd == kInvalidFd) {
161 Report("WARNING: failed to spawn external symbolizer (errno: %d)\n",163 Report("WARNING: failed to spawn external symbolizer (errno: %d)\n",
...@@ -165,14 +167,16 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() {...@@ -165,14 +167,16 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() {
165167
166 input_fd_ = fd;168 input_fd_ = fd;
167 output_fd_ = fd;169 output_fd_ = fd;
168#else // SANITIZER_APPLE170# else // SANITIZER_APPLE
169 UNIMPLEMENTED();171 UNIMPLEMENTED();
170#endif // SANITIZER_APPLE172# endif // SANITIZER_APPLE
171 } else {173 } else {
172 fd_t infd[2] = {}, outfd[2] = {};174 fd_t infd[2] = {}, outfd[2] = {};
173 if (!CreateTwoHighNumberedPipes(infd, outfd)) {175 if (!CreateTwoHighNumberedPipes(infd, outfd)) {
174 Report("WARNING: Can't create a socket pair to start "176 Report(
175 "external symbolizer (errno: %d)\n", errno);177 "WARNING: Can't create a socket pair to start "
178 "external symbolizer (errno: %d)\n",
179 errno);
176 return false;180 return false;
177 }181 }
178182
...@@ -260,10 +264,11 @@ bool Addr2LineProcess::ReachedEndOfOutput(const char *buffer,...@@ -260,10 +264,11 @@ bool Addr2LineProcess::ReachedEndOfOutput(const char *buffer,
260 // 1. First one, corresponding to given offset to be symbolized264 // 1. First one, corresponding to given offset to be symbolized
261 // (may be equal to output_terminator_, if offset is not valid).265 // (may be equal to output_terminator_, if offset is not valid).
262 // 2. Second one for output_terminator_, itself to mark the end of output.266 // 2. Second one for output_terminator_, itself to mark the end of output.
263 if (length <= kTerminatorLen) return false;267 if (length <= kTerminatorLen)
268 return false;
264 // Addr2Line output should end up with output_terminator_.269 // Addr2Line output should end up with output_terminator_.
265 return !internal_memcmp(buffer + length - kTerminatorLen,270 return !internal_memcmp(buffer + length - kTerminatorLen, output_terminator_,
266 output_terminator_, kTerminatorLen);271 kTerminatorLen);
267}272}
268273
269class Addr2LinePool final : public SymbolizerTool {274class Addr2LinePool final : public SymbolizerTool {
...@@ -283,9 +288,7 @@ class Addr2LinePool final : public SymbolizerTool {...@@ -283,9 +288,7 @@ class Addr2LinePool final : public SymbolizerTool {
283 return false;288 return false;
284 }289 }
285290
286 bool SymbolizeData(uptr addr, DataInfo *info) override {291 bool SymbolizeData(uptr addr, DataInfo *info) override { return false; }
287 return false;
288 }
289292
290 private:293 private:
291 const char *SendCommand(const char *module_name, uptr module_offset) {294 const char *SendCommand(const char *module_name, uptr module_offset) {
...@@ -299,22 +302,21 @@ class Addr2LinePool final : public SymbolizerTool {...@@ -299,22 +302,21 @@ class Addr2LinePool final : public SymbolizerTool {
299 }302 }
300 if (!addr2line) {303 if (!addr2line) {
301 addr2line =304 addr2line =
302 new(*allocator_) Addr2LineProcess(addr2line_path_, module_name);305 new (*allocator_) Addr2LineProcess(addr2line_path_, module_name);
303 addr2line_pool_.push_back(addr2line);306 addr2line_pool_.push_back(addr2line);
304 }307 }
305 CHECK_EQ(0, internal_strcmp(module_name, addr2line->module_name()));308 CHECK_EQ(0, internal_strcmp(module_name, addr2line->module_name()));
306 char buffer[kBufferSize];309 char buffer[kBufferSize];
307 internal_snprintf(buffer, kBufferSize, "0x%zx\n0x%zx\n",310 internal_snprintf(buffer, kBufferSize, "0x%zx\n0x%zx\n", module_offset,
308 module_offset, dummy_address_);311 dummy_address_);
309 return addr2line->SendCommand(buffer);312 return addr2line->SendCommand(buffer);
310 }313 }
311314
312 static const uptr kBufferSize = 64;315 static const uptr kBufferSize = 64;
313 const char *addr2line_path_;316 const char *addr2line_path_;
314 LowLevelAllocator *allocator_;317 LowLevelAllocator *allocator_;
315 InternalMmapVector<Addr2LineProcess*> addr2line_pool_;318 InternalMmapVector<Addr2LineProcess *> addr2line_pool_;
316 static const uptr dummy_address_ =319 static const uptr dummy_address_ = FIRST_32_SECOND_64(UINT32_MAX, UINT64_MAX);
317 FIRST_32_SECOND_64(UINT32_MAX, UINT64_MAX);
318};320};
319321
320# if SANITIZER_SUPPORTS_WEAK_HOOKS322# if SANITIZER_SUPPORTS_WEAK_HOOKS
...@@ -352,8 +354,9 @@ class InternalSymbolizer final : public SymbolizerTool {...@@ -352,8 +354,9 @@ class InternalSymbolizer final : public SymbolizerTool {
352 }354 }
353355
354 bool SymbolizePC(uptr addr, SymbolizedStack *stack) override {356 bool SymbolizePC(uptr addr, SymbolizedStack *stack) override {
355 bool result = __sanitizer_symbolize_code(357 bool result = __sanitizer_symbolize_code(stack->info.module,
356 stack->info.module, stack->info.module_offset, buffer_, sizeof(buffer_));358 stack->info.module_offset, buffer_,
359 sizeof(buffer_));
357 if (result)360 if (result)
358 ParseSymbolizePCOutput(buffer_, stack);361 ParseSymbolizePCOutput(buffer_, stack);
359 return result;362 return result;
...@@ -423,44 +426,53 @@ static SymbolizerTool *ChooseExternalSymbolizer(LowLevelAllocator *allocator) {...@@ -423,44 +426,53 @@ static SymbolizerTool *ChooseExternalSymbolizer(LowLevelAllocator *allocator) {
423 } else if (!internal_strncmp(binary_name, kLLVMSymbolizerPrefix,426 } else if (!internal_strncmp(binary_name, kLLVMSymbolizerPrefix,
424 internal_strlen(kLLVMSymbolizerPrefix))) {427 internal_strlen(kLLVMSymbolizerPrefix))) {
425 VReport(2, "Using llvm-symbolizer at user-specified path: %s\n", path);428 VReport(2, "Using llvm-symbolizer at user-specified path: %s\n", path);
426 return new(*allocator) LLVMSymbolizer(path, allocator);429 return new (*allocator) LLVMSymbolizer(path, allocator);
427 } else if (!internal_strcmp(binary_name, "atos")) {430 } else if (!internal_strcmp(binary_name, "atos")) {
428#if SANITIZER_APPLE431# if SANITIZER_APPLE
429 VReport(2, "Using atos at user-specified path: %s\n", path);432 VReport(2, "Using atos at user-specified path: %s\n", path);
430 return new(*allocator) AtosSymbolizer(path, allocator);433 return new (*allocator) AtosSymbolizer(path, allocator);
431#else // SANITIZER_APPLE434# else // SANITIZER_APPLE
432 Report("ERROR: Using `atos` is only supported on Darwin.\n");435 Report("ERROR: Using `atos` is only supported on Darwin.\n");
433 Die();436 Die();
434#endif // SANITIZER_APPLE437# endif // SANITIZER_APPLE
435 } else if (!internal_strcmp(binary_name, "addr2line")) {438 } else if (!internal_strcmp(binary_name, "addr2line")) {
436 VReport(2, "Using addr2line at user-specified path: %s\n", path);439 VReport(2, "Using addr2line at user-specified path: %s\n", path);
437 return new(*allocator) Addr2LinePool(path, allocator);440 return new (*allocator) Addr2LinePool(path, allocator);
438 } else if (path) {441 } else if (path) {
439 Report("ERROR: External symbolizer path is set to '%s' which isn't "442 Report(
440 "a known symbolizer. Please set the path to the llvm-symbolizer "443 "ERROR: External symbolizer path is set to '%s' which isn't "
441 "binary or other known tool.\n", path);444 "a known symbolizer. Please set the path to the llvm-symbolizer "
445 "binary or other known tool.\n",
446 path);
442 Die();447 Die();
443 }448 }
444449
445 // Otherwise symbolizer program is unknown, let's search $PATH450 // Otherwise symbolizer program is unknown, let's search $PATH
451# ifdef SANITIZER_DISABLE_SYMBOLIZER_PATH_SEARCH
452 VReport(2,
453 "Symbolizer path search is disabled in the runtime "
454 "build configuration.\n");
455 return nullptr;
456# else
446 CHECK(path == nullptr);457 CHECK(path == nullptr);
447#if SANITIZER_APPLE458# if SANITIZER_APPLE
448 if (const char *found_path = FindPathToBinary("atos")) {459 if (const char *found_path = FindPathToBinary("atos")) {
449 VReport(2, "Using atos found at: %s\n", found_path);460 VReport(2, "Using atos found at: %s\n", found_path);
450 return new(*allocator) AtosSymbolizer(found_path, allocator);461 return new (*allocator) AtosSymbolizer(found_path, allocator);
451 }462 }
452#endif // SANITIZER_APPLE463# endif // SANITIZER_APPLE
453 if (const char *found_path = FindPathToBinary("llvm-symbolizer")) {464 if (const char *found_path = FindPathToBinary("llvm-symbolizer")) {
454 VReport(2, "Using llvm-symbolizer found at: %s\n", found_path);465 VReport(2, "Using llvm-symbolizer found at: %s\n", found_path);
455 return new(*allocator) LLVMSymbolizer(found_path, allocator);466 return new (*allocator) LLVMSymbolizer(found_path, allocator);
456 }467 }
457 if (common_flags()->allow_addr2line) {468 if (common_flags()->allow_addr2line) {
458 if (const char *found_path = FindPathToBinary("addr2line")) {469 if (const char *found_path = FindPathToBinary("addr2line")) {
459 VReport(2, "Using addr2line found at: %s\n", found_path);470 VReport(2, "Using addr2line found at: %s\n", found_path);
460 return new(*allocator) Addr2LinePool(found_path, allocator);471 return new (*allocator) Addr2LinePool(found_path, allocator);
461 }472 }
462 }473 }
463 return nullptr;474 return nullptr;
475# endif // SANITIZER_DISABLE_SYMBOLIZER_PATH_SEARCH
464}476}
465477
466static void ChooseSymbolizerTools(IntrusiveList<SymbolizerTool> *list,478static void ChooseSymbolizerTools(IntrusiveList<SymbolizerTool> *list,
...@@ -492,17 +504,17 @@ static void ChooseSymbolizerTools(IntrusiveList<SymbolizerTool> *list,...@@ -492,17 +504,17 @@ static void ChooseSymbolizerTools(IntrusiveList<SymbolizerTool> *list,
492 list->push_back(tool);504 list->push_back(tool);
493 }505 }
494506
495#if SANITIZER_APPLE507# if SANITIZER_APPLE
496 VReport(2, "Using dladdr symbolizer.\n");508 VReport(2, "Using dladdr symbolizer.\n");
497 list->push_back(new(*allocator) DlAddrSymbolizer());509 list->push_back(new (*allocator) DlAddrSymbolizer());
498#endif // SANITIZER_APPLE510# endif // SANITIZER_APPLE
499}511}
500512
501Symbolizer *Symbolizer::PlatformInit() {513Symbolizer *Symbolizer::PlatformInit() {
502 IntrusiveList<SymbolizerTool> list;514 IntrusiveList<SymbolizerTool> list;
503 list.clear();515 list.clear();
504 ChooseSymbolizerTools(&list, &symbolizer_allocator_);516 ChooseSymbolizerTools(&list, &symbolizer_allocator_);
505 return new(symbolizer_allocator_) Symbolizer(list);517 return new (symbolizer_allocator_) Symbolizer(list);
506}518}
507519
508void Symbolizer::LateInitialize() {520void Symbolizer::LateInitialize() {
lib/libtsan/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp+2-34
...@@ -12,7 +12,7 @@...@@ -12,7 +12,7 @@
1212
13#include "sanitizer_platform.h"13#include "sanitizer_platform.h"
14#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \14#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
15 SANITIZER_SOLARIS15 SANITIZER_SOLARIS || SANITIZER_HAIKU
16#include "sanitizer_common.h"16#include "sanitizer_common.h"
17#include "sanitizer_stacktrace.h"17#include "sanitizer_stacktrace.h"
1818
...@@ -91,38 +91,6 @@ _Unwind_Reason_Code Unwind_Trace(struct _Unwind_Context *ctx, void *param) {...@@ -91,38 +91,6 @@ _Unwind_Reason_Code Unwind_Trace(struct _Unwind_Context *ctx, void *param) {
9191
92} // namespace92} // namespace
9393
94#if SANITIZER_ANDROID
95void SanitizerInitializeUnwinder() {
96 if (AndroidGetApiLevel() >= ANDROID_LOLLIPOP_MR1) return;
97
98 // Pre-lollipop Android can not unwind through signal handler frames with
99 // libgcc unwinder, but it has a libcorkscrew.so library with the necessary
100 // workarounds.
101 void *p = dlopen("libcorkscrew.so", RTLD_LAZY);
102 if (!p) {
103 VReport(1,
104 "Failed to open libcorkscrew.so. You may see broken stack traces "
105 "in SEGV reports.");
106 return;
107 }
108 acquire_my_map_info_list =
109 (acquire_my_map_info_list_func)(uptr)dlsym(p, "acquire_my_map_info_list");
110 release_my_map_info_list =
111 (release_my_map_info_list_func)(uptr)dlsym(p, "release_my_map_info_list");
112 unwind_backtrace_signal_arch = (unwind_backtrace_signal_arch_func)(uptr)dlsym(
113 p, "unwind_backtrace_signal_arch");
114 if (!acquire_my_map_info_list || !release_my_map_info_list ||
115 !unwind_backtrace_signal_arch) {
116 VReport(1,
117 "Failed to find one of the required symbols in libcorkscrew.so. "
118 "You may see broken stack traces in SEGV reports.");
119 acquire_my_map_info_list = 0;
120 unwind_backtrace_signal_arch = 0;
121 release_my_map_info_list = 0;
122 }
123}
124#endif
125
126void BufferedStackTrace::UnwindSlow(uptr pc, u32 max_depth) {94void BufferedStackTrace::UnwindSlow(uptr pc, u32 max_depth) {
127 CHECK_GE(max_depth, 2);95 CHECK_GE(max_depth, 2);
128 size = 0;96 size = 0;
...@@ -171,4 +139,4 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {...@@ -171,4 +139,4 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {
171} // namespace __sanitizer139} // namespace __sanitizer
172140
173#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD ||141#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD ||
174 // SANITIZER_SOLARIS142 // SANITIZER_SOLARIS || SANITIZER_HAIKU
lib/libtsan/sanitizer_common/sanitizer_unwind_win.cpp+5
...@@ -75,6 +75,11 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {...@@ -75,6 +75,11 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {
75 stack_frame.AddrPC.Offset = ctx.Pc;75 stack_frame.AddrPC.Offset = ctx.Pc;
76 stack_frame.AddrFrame.Offset = ctx.R11;76 stack_frame.AddrFrame.Offset = ctx.R11;
77 stack_frame.AddrStack.Offset = ctx.Sp;77 stack_frame.AddrStack.Offset = ctx.Sp;
78# elif SANITIZER_MIPS32
79 int machine_type = IMAGE_FILE_MACHINE_R4000;
80 stack_frame.AddrPC.Offset = ctx.Fir;
81 stack_frame.AddrFrame.Offset = ctx.IntS8;
82 stack_frame.AddrStack.Offset = ctx.IntSp;
78# else83# else
79 int machine_type = IMAGE_FILE_MACHINE_I386;84 int machine_type = IMAGE_FILE_MACHINE_I386;
80 stack_frame.AddrPC.Offset = ctx.Eip;85 stack_frame.AddrPC.Offset = ctx.Eip;
lib/libtsan/sanitizer_common/sanitizer_win.cpp+3
...@@ -1011,6 +1011,9 @@ void SignalContext::InitPcSpBp() {...@@ -1011,6 +1011,9 @@ void SignalContext::InitPcSpBp() {
1011# if SANITIZER_ARM1011# if SANITIZER_ARM
1012 bp = (uptr)context_record->R11;1012 bp = (uptr)context_record->R11;
1013 sp = (uptr)context_record->Sp;1013 sp = (uptr)context_record->Sp;
1014# elif SANITIZER_MIPS32
1015 bp = (uptr)context_record->IntS8;
1016 sp = (uptr)context_record->IntSp;
1014# else1017# else
1015 bp = (uptr)context_record->Ebp;1018 bp = (uptr)context_record->Ebp;
1016 sp = (uptr)context_record->Esp;1019 sp = (uptr)context_record->Esp;
lib/libtsan/tsan_interceptors_posix.cpp+72-15
...@@ -12,6 +12,9 @@...@@ -12,6 +12,9 @@
12// sanitizer_common/sanitizer_common_interceptors.inc12// sanitizer_common/sanitizer_common_interceptors.inc
13//===----------------------------------------------------------------------===//13//===----------------------------------------------------------------------===//
1414
15#include <stdarg.h>
16
17#include "interception/interception.h"
15#include "sanitizer_common/sanitizer_allocator_dlsym.h"18#include "sanitizer_common/sanitizer_allocator_dlsym.h"
16#include "sanitizer_common/sanitizer_atomic.h"19#include "sanitizer_common/sanitizer_atomic.h"
17#include "sanitizer_common/sanitizer_errno.h"20#include "sanitizer_common/sanitizer_errno.h"
...@@ -19,21 +22,20 @@...@@ -19,21 +22,20 @@
19#include "sanitizer_common/sanitizer_internal_defs.h"22#include "sanitizer_common/sanitizer_internal_defs.h"
20#include "sanitizer_common/sanitizer_libc.h"23#include "sanitizer_common/sanitizer_libc.h"
21#include "sanitizer_common/sanitizer_linux.h"24#include "sanitizer_common/sanitizer_linux.h"
25#include "sanitizer_common/sanitizer_platform_interceptors.h"
22#include "sanitizer_common/sanitizer_platform_limits_netbsd.h"26#include "sanitizer_common/sanitizer_platform_limits_netbsd.h"
23#include "sanitizer_common/sanitizer_platform_limits_posix.h"27#include "sanitizer_common/sanitizer_platform_limits_posix.h"
24#include "sanitizer_common/sanitizer_posix.h"28#include "sanitizer_common/sanitizer_posix.h"
25#include "sanitizer_common/sanitizer_stacktrace.h"29#include "sanitizer_common/sanitizer_stacktrace.h"
26#include "sanitizer_common/sanitizer_tls_get_addr.h"30#include "sanitizer_common/sanitizer_tls_get_addr.h"
27#include "interception/interception.h"31#include "sanitizer_common/sanitizer_vector.h"
32#include "tsan_fd.h"
28#include "tsan_interceptors.h"33#include "tsan_interceptors.h"
29#include "tsan_interface.h"34#include "tsan_interface.h"
35#include "tsan_mman.h"
30#include "tsan_platform.h"36#include "tsan_platform.h"
31#include "tsan_suppressions.h"
32#include "tsan_rtl.h"37#include "tsan_rtl.h"
33#include "tsan_mman.h"38#include "tsan_suppressions.h"
34#include "tsan_fd.h"
35
36#include <stdarg.h>
3739
38using namespace __tsan;40using namespace __tsan;
3941
...@@ -177,7 +179,7 @@ struct ThreadSignalContext {...@@ -177,7 +179,7 @@ struct ThreadSignalContext {
177 SignalDesc pending_signals[kSigCount];179 SignalDesc pending_signals[kSigCount];
178 // emptyset and oldset are too big for stack.180 // emptyset and oldset are too big for stack.
179 __sanitizer_sigset_t emptyset;181 __sanitizer_sigset_t emptyset;
180 __sanitizer_sigset_t oldset;182 __sanitizer::Vector<__sanitizer_sigset_t> oldset;
181};183};
182184
183void EnterBlockingFunc(ThreadState *thr) {185void EnterBlockingFunc(ThreadState *thr) {
...@@ -558,6 +560,7 @@ static void SetJmp(ThreadState *thr, uptr sp) {...@@ -558,6 +560,7 @@ static void SetJmp(ThreadState *thr, uptr sp) {
558 buf->shadow_stack_pos = thr->shadow_stack_pos;560 buf->shadow_stack_pos = thr->shadow_stack_pos;
559 ThreadSignalContext *sctx = SigCtx(thr);561 ThreadSignalContext *sctx = SigCtx(thr);
560 buf->int_signal_send = sctx ? sctx->int_signal_send : 0;562 buf->int_signal_send = sctx ? sctx->int_signal_send : 0;
563 buf->oldset_stack_size = sctx ? sctx->oldset.Size() : 0;
561 buf->in_blocking_func = atomic_load(&thr->in_blocking_func, memory_order_relaxed);564 buf->in_blocking_func = atomic_load(&thr->in_blocking_func, memory_order_relaxed);
562 buf->in_signal_handler = atomic_load(&thr->in_signal_handler,565 buf->in_signal_handler = atomic_load(&thr->in_signal_handler,
563 memory_order_relaxed);566 memory_order_relaxed);
...@@ -574,8 +577,11 @@ static void LongJmp(ThreadState *thr, uptr *env) {...@@ -574,8 +577,11 @@ static void LongJmp(ThreadState *thr, uptr *env) {
574 while (thr->shadow_stack_pos > buf->shadow_stack_pos)577 while (thr->shadow_stack_pos > buf->shadow_stack_pos)
575 FuncExit(thr);578 FuncExit(thr);
576 ThreadSignalContext *sctx = SigCtx(thr);579 ThreadSignalContext *sctx = SigCtx(thr);
577 if (sctx)580 if (sctx) {
578 sctx->int_signal_send = buf->int_signal_send;581 sctx->int_signal_send = buf->int_signal_send;
582 while (sctx->oldset.Size() > buf->oldset_stack_size)
583 sctx->oldset.PopBack();
584 }
579 atomic_store(&thr->in_blocking_func, buf->in_blocking_func,585 atomic_store(&thr->in_blocking_func, buf->in_blocking_func,
580 memory_order_relaxed);586 memory_order_relaxed);
581 atomic_store(&thr->in_signal_handler, buf->in_signal_handler,587 atomic_store(&thr->in_signal_handler, buf->in_signal_handler,
...@@ -742,6 +748,41 @@ TSAN_INTERCEPTOR(void, free, void *p) {...@@ -742,6 +748,41 @@ TSAN_INTERCEPTOR(void, free, void *p) {
742 user_free(thr, pc, p);748 user_free(thr, pc, p);
743}749}
744750
751# if SANITIZER_INTERCEPT_FREE_SIZED
752TSAN_INTERCEPTOR(void, free_sized, void *p, uptr size) {
753 if (UNLIKELY(!p))
754 return;
755 if (in_symbolizer())
756 return InternalFree(p);
757 if (DlsymAlloc::PointerIsMine(p))
758 return DlsymAlloc::Free(p);
759 invoke_free_hook(p);
760 SCOPED_INTERCEPTOR_RAW(free_sized, p, size);
761 user_free(thr, pc, p);
762}
763# define TSAN_MAYBE_INTERCEPT_FREE_SIZED INTERCEPT_FUNCTION(free_sized)
764# else
765# define TSAN_MAYBE_INTERCEPT_FREE_SIZED
766# endif
767
768# if SANITIZER_INTERCEPT_FREE_ALIGNED_SIZED
769TSAN_INTERCEPTOR(void, free_aligned_sized, void *p, uptr alignment, uptr size) {
770 if (UNLIKELY(!p))
771 return;
772 if (in_symbolizer())
773 return InternalFree(p);
774 if (DlsymAlloc::PointerIsMine(p))
775 return DlsymAlloc::Free(p);
776 invoke_free_hook(p);
777 SCOPED_INTERCEPTOR_RAW(free_aligned_sized, p, alignment, size);
778 user_free(thr, pc, p);
779}
780# define TSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED \
781 INTERCEPT_FUNCTION(free_aligned_sized)
782# else
783# define TSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED
784# endif
785
745TSAN_INTERCEPTOR(void, cfree, void *p) {786TSAN_INTERCEPTOR(void, cfree, void *p) {
746 if (UNLIKELY(!p))787 if (UNLIKELY(!p))
747 return;788 return;
...@@ -758,6 +799,9 @@ TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {...@@ -758,6 +799,9 @@ TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {
758 SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p);799 SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p);
759 return user_alloc_usable_size(p);800 return user_alloc_usable_size(p);
760}801}
802#else
803# define TSAN_MAYBE_INTERCEPT_FREE_SIZED
804# define TSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED
761#endif805#endif
762806
763TSAN_INTERCEPTOR(char *, strcpy, char *dst, const char *src) {807TSAN_INTERCEPTOR(char *, strcpy, char *dst, const char *src) {
...@@ -892,10 +936,9 @@ constexpr u32 kGuardWaiter = 1 << 17;...@@ -892,10 +936,9 @@ constexpr u32 kGuardWaiter = 1 << 17;
892936
893static int guard_acquire(ThreadState *thr, uptr pc, atomic_uint32_t *g,937static int guard_acquire(ThreadState *thr, uptr pc, atomic_uint32_t *g,
894 bool blocking_hooks = true) {938 bool blocking_hooks = true) {
895 if (blocking_hooks)939 bool in_potentially_blocking_region = false;
896 OnPotentiallyBlockingRegionBegin();940 auto on_exit = at_scope_exit([&] {
897 auto on_exit = at_scope_exit([blocking_hooks] {941 if (in_potentially_blocking_region)
898 if (blocking_hooks)
899 OnPotentiallyBlockingRegionEnd();942 OnPotentiallyBlockingRegionEnd();
900 });943 });
901944
...@@ -912,8 +955,13 @@ static int guard_acquire(ThreadState *thr, uptr pc, atomic_uint32_t *g,...@@ -912,8 +955,13 @@ static int guard_acquire(ThreadState *thr, uptr pc, atomic_uint32_t *g,
912 } else {955 } else {
913 if ((cmp & kGuardWaiter) ||956 if ((cmp & kGuardWaiter) ||
914 atomic_compare_exchange_strong(g, &cmp, cmp | kGuardWaiter,957 atomic_compare_exchange_strong(g, &cmp, cmp | kGuardWaiter,
915 memory_order_relaxed))958 memory_order_relaxed)) {
959 if (blocking_hooks && !in_potentially_blocking_region) {
960 in_potentially_blocking_region = true;
961 OnPotentiallyBlockingRegionBegin();
962 }
916 FutexWait(g, cmp | kGuardWaiter);963 FutexWait(g, cmp | kGuardWaiter);
964 }
917 }965 }
918 }966 }
919}967}
...@@ -976,6 +1024,7 @@ void PlatformCleanUpThreadState(ThreadState *thr) {...@@ -976,6 +1024,7 @@ void PlatformCleanUpThreadState(ThreadState *thr) {
976 &thr->signal_ctx, memory_order_relaxed);1024 &thr->signal_ctx, memory_order_relaxed);
977 if (sctx) {1025 if (sctx) {
978 atomic_store(&thr->signal_ctx, 0, memory_order_relaxed);1026 atomic_store(&thr->signal_ctx, 0, memory_order_relaxed);
1027 sctx->oldset.Reset();
979 UnmapOrDie(sctx, sizeof(*sctx));1028 UnmapOrDie(sctx, sizeof(*sctx));
980 }1029 }
981}1030}
...@@ -2172,7 +2221,8 @@ void ProcessPendingSignalsImpl(ThreadState *thr) {...@@ -2172,7 +2221,8 @@ void ProcessPendingSignalsImpl(ThreadState *thr) {
2172 return;2221 return;
2173 atomic_fetch_add(&thr->in_signal_handler, 1, memory_order_relaxed);2222 atomic_fetch_add(&thr->in_signal_handler, 1, memory_order_relaxed);
2174 internal_sigfillset(&sctx->emptyset);2223 internal_sigfillset(&sctx->emptyset);
2175 int res = REAL(pthread_sigmask)(SIG_SETMASK, &sctx->emptyset, &sctx->oldset);2224 __sanitizer_sigset_t *oldset = sctx->oldset.PushBack();
2225 int res = REAL(pthread_sigmask)(SIG_SETMASK, &sctx->emptyset, oldset);
2176 CHECK_EQ(res, 0);2226 CHECK_EQ(res, 0);
2177 for (int sig = 0; sig < kSigCount; sig++) {2227 for (int sig = 0; sig < kSigCount; sig++) {
2178 SignalDesc *signal = &sctx->pending_signals[sig];2228 SignalDesc *signal = &sctx->pending_signals[sig];
...@@ -2182,8 +2232,9 @@ void ProcessPendingSignalsImpl(ThreadState *thr) {...@@ -2182,8 +2232,9 @@ void ProcessPendingSignalsImpl(ThreadState *thr) {
2182 &signal->ctx);2232 &signal->ctx);
2183 }2233 }
2184 }2234 }
2185 res = REAL(pthread_sigmask)(SIG_SETMASK, &sctx->oldset, 0);2235 res = REAL(pthread_sigmask)(SIG_SETMASK, oldset, 0);
2186 CHECK_EQ(res, 0);2236 CHECK_EQ(res, 0);
2237 sctx->oldset.PopBack();
2187 atomic_fetch_add(&thr->in_signal_handler, -1, memory_order_relaxed);2238 atomic_fetch_add(&thr->in_signal_handler, -1, memory_order_relaxed);
2188}2239}
21892240
...@@ -2951,6 +3002,8 @@ void InitializeInterceptors() {...@@ -2951,6 +3002,8 @@ void InitializeInterceptors() {
2951 TSAN_INTERCEPT(realloc);3002 TSAN_INTERCEPT(realloc);
2952 TSAN_INTERCEPT(reallocarray);3003 TSAN_INTERCEPT(reallocarray);
2953 TSAN_INTERCEPT(free);3004 TSAN_INTERCEPT(free);
3005 TSAN_MAYBE_INTERCEPT_FREE_SIZED;
3006 TSAN_MAYBE_INTERCEPT_FREE_ALIGNED_SIZED;
2954 TSAN_INTERCEPT(cfree);3007 TSAN_INTERCEPT(cfree);
2955 TSAN_INTERCEPT(munmap);3008 TSAN_INTERCEPT(munmap);
2956 TSAN_MAYBE_INTERCEPT_MEMALIGN;3009 TSAN_MAYBE_INTERCEPT_MEMALIGN;
...@@ -3073,6 +3126,10 @@ void InitializeInterceptors() {...@@ -3073,6 +3126,10 @@ void InitializeInterceptors() {
3073#if !SANITIZER_ANDROID3126#if !SANITIZER_ANDROID
3074 TSAN_INTERCEPT(dl_iterate_phdr);3127 TSAN_INTERCEPT(dl_iterate_phdr);
3075#endif3128#endif
3129
3130 // Symbolization indirectly calls dl_iterate_phdr
3131 ready_to_symbolize = true;
3132
3076 TSAN_MAYBE_INTERCEPT_ON_EXIT;3133 TSAN_MAYBE_INTERCEPT_ON_EXIT;
3077 TSAN_INTERCEPT(__cxa_atexit);3134 TSAN_INTERCEPT(__cxa_atexit);
3078 TSAN_INTERCEPT(_exit);3135 TSAN_INTERCEPT(_exit);
lib/libtsan/tsan_interface_java.cpp-1
...@@ -122,7 +122,6 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) {...@@ -122,7 +122,6 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) {
122 DCHECK_GE(dst, jctx->heap_begin);122 DCHECK_GE(dst, jctx->heap_begin);
123 DCHECK_LE(dst + size, jctx->heap_begin + jctx->heap_size);123 DCHECK_LE(dst + size, jctx->heap_begin + jctx->heap_size);
124 DCHECK_NE(dst, src);124 DCHECK_NE(dst, src);
125 DCHECK_NE(size, 0);
126125
127 // Assuming it's not running concurrently with threads that do126 // Assuming it's not running concurrently with threads that do
128 // memory accesses and mutex operations (stop-the-world phase).127 // memory accesses and mutex operations (stop-the-world phase).
lib/libtsan/tsan_malloc_mac.cpp+13-9
...@@ -73,15 +73,19 @@ using namespace __tsan;...@@ -73,15 +73,19 @@ using namespace __tsan;
73 invoke_free_hook(ptr); \73 invoke_free_hook(ptr); \
74 SCOPED_INTERCEPTOR_RAW(free, ptr); \74 SCOPED_INTERCEPTOR_RAW(free, ptr); \
75 user_free(thr, pc, ptr)75 user_free(thr, pc, ptr)
76#define COMMON_MALLOC_SIZE(ptr) uptr size = user_alloc_usable_size(ptr);76# define COMMON_MALLOC_FREE_SIZED(ptr, size) COMMON_MALLOC_FREE(ptr)
77#define COMMON_MALLOC_FILL_STATS(zone, stats)77# define COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size) \
78#define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \78 COMMON_MALLOC_FREE(ptr)
79 (void)zone_name; \79# define COMMON_MALLOC_SIZE(ptr) uptr size = user_alloc_usable_size(ptr);
80 Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", ptr);80# define COMMON_MALLOC_FILL_STATS(zone, stats)
81#define COMMON_MALLOC_NAMESPACE __tsan81# define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
82#define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 082 (void)zone_name; \
83#define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 083 Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", \
84 ptr);
85# define COMMON_MALLOC_NAMESPACE __tsan
86# define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
87# define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 0
8488
85#include "sanitizer_common/sanitizer_malloc_mac.inc"89# include "sanitizer_common/sanitizer_malloc_mac.inc"
8690
87#endif91#endif
lib/libtsan/tsan_platform.h+32-2
...@@ -681,6 +681,33 @@ struct MappingGoMips64_47 {...@@ -681,6 +681,33 @@ struct MappingGoMips64_47 {
681 static const uptr kShadowAdd = 0x200000000000ull;681 static const uptr kShadowAdd = 0x200000000000ull;
682};682};
683683
684/* Go on linux/riscv64 (48-bit VMA)
6850000 0001 0000 - 00e0 0000 0000: executable and heap (896 GiB)
68600e0 0000 0000 - 2000 0000 0000: -
6872000 0000 0000 - 2400 0000 0000: shadow - 4 TiB ( ~ 4 * app)
6882400 0000 0000 - 3000 0000 0000: -
6893000 0000 0000 - 3100 0000 0000: metainfo - 1 TiB ( ~ 1 * app)
6903100 0000 0000 - 8000 0000 0000: -
691*/
692struct MappingGoRiscv64 {
693 static const uptr kMetaShadowBeg = 0x300000000000ull;
694 static const uptr kMetaShadowEnd = 0x310000000000ull;
695 static const uptr kShadowBeg = 0x200000000000ull;
696 static const uptr kShadowEnd = 0x240000000000ull;
697 static const uptr kLoAppMemBeg = 0x000000010000ull;
698 static const uptr kLoAppMemEnd = 0x000e00000000ull;
699 static const uptr kMidAppMemBeg = 0;
700 static const uptr kMidAppMemEnd = 0;
701 static const uptr kHiAppMemBeg = 0;
702 static const uptr kHiAppMemEnd = 0;
703 static const uptr kHeapMemBeg = 0;
704 static const uptr kHeapMemEnd = 0;
705 static const uptr kVdsoBeg = 0;
706 static const uptr kShadowMsk = 0;
707 static const uptr kShadowXor = 0;
708 static const uptr kShadowAdd = 0x200000000000ull;
709};
710
684/*711/*
685Go on linux/s390x712Go on linux/s390x
6860000 0000 1000 - 1000 0000 0000: executable and heap - 16 TiB7130000 0000 1000 - 1000 0000 0000: executable and heap - 16 TiB
...@@ -728,6 +755,8 @@ ALWAYS_INLINE auto SelectMapping(Arg arg) {...@@ -728,6 +755,8 @@ ALWAYS_INLINE auto SelectMapping(Arg arg) {
728 return Func::template Apply<MappingGoAarch64>(arg);755 return Func::template Apply<MappingGoAarch64>(arg);
729# elif defined(__loongarch_lp64)756# elif defined(__loongarch_lp64)
730 return Func::template Apply<MappingGoLoongArch64_47>(arg);757 return Func::template Apply<MappingGoLoongArch64_47>(arg);
758# elif SANITIZER_RISCV64
759 return Func::template Apply<MappingGoRiscv64>(arg);
731# elif SANITIZER_WINDOWS760# elif SANITIZER_WINDOWS
732 return Func::template Apply<MappingGoWindows>(arg);761 return Func::template Apply<MappingGoWindows>(arg);
733# else762# else
...@@ -798,6 +827,7 @@ void ForEachMapping() {...@@ -798,6 +827,7 @@ void ForEachMapping() {
798 Func::template Apply<MappingGoAarch64>();827 Func::template Apply<MappingGoAarch64>();
799 Func::template Apply<MappingGoLoongArch64_47>();828 Func::template Apply<MappingGoLoongArch64_47>();
800 Func::template Apply<MappingGoMips64_47>();829 Func::template Apply<MappingGoMips64_47>();
830 Func::template Apply<MappingGoRiscv64>();
801 Func::template Apply<MappingGoS390x>();831 Func::template Apply<MappingGoS390x>();
802}832}
803833
...@@ -901,7 +931,7 @@ bool IsAppMem(uptr mem) { return SelectMapping<IsAppMemImpl>(mem); }...@@ -901,7 +931,7 @@ bool IsAppMem(uptr mem) { return SelectMapping<IsAppMemImpl>(mem); }
901struct IsShadowMemImpl {931struct IsShadowMemImpl {
902 template <typename Mapping>932 template <typename Mapping>
903 static bool Apply(uptr mem) {933 static bool Apply(uptr mem) {
904 return mem >= Mapping::kShadowBeg && mem <= Mapping::kShadowEnd;934 return mem >= Mapping::kShadowBeg && mem < Mapping::kShadowEnd;
905 }935 }
906};936};
907937
...@@ -913,7 +943,7 @@ bool IsShadowMem(RawShadow *p) {...@@ -913,7 +943,7 @@ bool IsShadowMem(RawShadow *p) {
913struct IsMetaMemImpl {943struct IsMetaMemImpl {
914 template <typename Mapping>944 template <typename Mapping>
915 static bool Apply(uptr mem) {945 static bool Apply(uptr mem) {
916 return mem >= Mapping::kMetaShadowBeg && mem <= Mapping::kMetaShadowEnd;946 return mem >= Mapping::kMetaShadowBeg && mem < Mapping::kMetaShadowEnd;
917 }947 }
918};948};
919949
lib/libtsan/tsan_platform_linux.cpp+27-2
...@@ -259,7 +259,15 @@ static void ReExecIfNeeded(bool ignore_heap) {...@@ -259,7 +259,15 @@ static void ReExecIfNeeded(bool ignore_heap) {
259 "WARNING: Program is run with randomized virtual address "259 "WARNING: Program is run with randomized virtual address "
260 "space, which wouldn't work with ThreadSanitizer on Android.\n"260 "space, which wouldn't work with ThreadSanitizer on Android.\n"
261 "Re-execing with fixed virtual address space.\n");261 "Re-execing with fixed virtual address space.\n");
262 CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1);262
263 if (personality(old_personality | ADDR_NO_RANDOMIZE) == -1) {
264 Printf(
265 "FATAL: ThreadSanitizer: unable to disable ASLR (perhaps "
266 "sandboxing is enabled?).\n");
267 Printf("FATAL: Please rerun without sandboxing and/or ASLR.\n");
268 Die();
269 }
270
263 reexec = true;271 reexec = true;
264 }272 }
265# endif273# endif
...@@ -287,7 +295,18 @@ static void ReExecIfNeeded(bool ignore_heap) {...@@ -287,7 +295,18 @@ static void ReExecIfNeeded(bool ignore_heap) {
287 "possibly due to high-entropy ASLR.\n"295 "possibly due to high-entropy ASLR.\n"
288 "Re-execing with fixed virtual address space.\n"296 "Re-execing with fixed virtual address space.\n"
289 "N.B. reducing ASLR entropy is preferable.\n");297 "N.B. reducing ASLR entropy is preferable.\n");
290 CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1);298
299 if (personality(old_personality | ADDR_NO_RANDOMIZE) == -1) {
300 Printf(
301 "FATAL: ThreadSanitizer: encountered an incompatible memory "
302 "layout but was unable to disable ASLR (perhaps sandboxing is "
303 "enabled?).\n");
304 Printf(
305 "FATAL: Please rerun with lower ASLR entropy, ASLR disabled, "
306 "and/or sandboxing disabled.\n");
307 Die();
308 }
309
291 reexec = true;310 reexec = true;
292 } else {311 } else {
293 Printf(312 Printf(
...@@ -373,6 +392,12 @@ void InitializePlatformEarly() {...@@ -373,6 +392,12 @@ void InitializePlatformEarly() {
373 Printf("FATAL: Found %zd - Supported 39 and 48\n", vmaSize);392 Printf("FATAL: Found %zd - Supported 39 and 48\n", vmaSize);
374 Die();393 Die();
375 }394 }
395# else
396 if (vmaSize != 48) {
397 Printf("FATAL: ThreadSanitizer: unsupported VMA range\n");
398 Printf("FATAL: Found %zd - Supported 48\n", vmaSize);
399 Die();
400 }
376# endif401# endif
377# endif402# endif
378403
lib/libtsan/tsan_rtl.cpp+25-6
...@@ -566,17 +566,32 @@ static bool IsValidMmapRange(uptr addr, uptr size) {...@@ -566,17 +566,32 @@ static bool IsValidMmapRange(uptr addr, uptr size) {
566 return false;566 return false;
567}567}
568568
569void UnmapShadow(ThreadState *thr, uptr addr, uptr size) {569void UnmapShadow(ThreadState* thr, uptr addr, uptr size) {
570 if (size == 0 || !IsValidMmapRange(addr, size))570 if (size == 0 || !IsValidMmapRange(addr, size))
571 return;571 return;
572 DontNeedShadowFor(addr, size);572 // unmap shadow is related to semantic of mmap/munmap, so we
573 // should clear the whole shadow range, including the tail shadow
574 // while addr + size % kShadowCell != 0.
575 uptr rounded_size_shadow = RoundUp(addr + size, kShadowCell) - addr;
576 DontNeedShadowFor(addr, rounded_size_shadow);
573 ScopedGlobalProcessor sgp;577 ScopedGlobalProcessor sgp;
574 SlotLocker locker(thr, true);578 SlotLocker locker(thr, true);
575 ctx->metamap.ResetRange(thr->proc(), addr, size, true);579 uptr rounded_size_meta = RoundUp(addr + size, kMetaShadowCell) - addr;
580 ctx->metamap.ResetRange(thr->proc(), addr, rounded_size_meta, true);
576}581}
577#endif582#endif
578583
579void MapShadow(uptr addr, uptr size) {584void MapShadow(uptr addr, uptr size) {
585 // Although named MapShadow, this function's semantic is unrelated to
586 // UnmapShadow. This function currently only used for Go's lazy allocation
587 // of shadow, whose targets are program section (e.g., bss, data, etc.).
588 // Therefore, we can guarantee that the addr and size align to kShadowCell
589 // and kMetaShadowCell by the following assertions.
590 DCHECK_EQ(addr % kShadowCell, 0);
591 DCHECK_EQ(size % kShadowCell, 0);
592 DCHECK_EQ(addr % kMetaShadowCell, 0);
593 DCHECK_EQ(size % kMetaShadowCell, 0);
594
580 // Ensure thead registry lock held, so as to synchronize595 // Ensure thead registry lock held, so as to synchronize
581 // with DoReset, which also access the mapped_shadow_* ctxt fields.596 // with DoReset, which also access the mapped_shadow_* ctxt fields.
582 ThreadRegistryLock lock0(&ctx->thread_registry);597 ThreadRegistryLock lock0(&ctx->thread_registry);
...@@ -624,6 +639,7 @@ void MapShadow(uptr addr, uptr size) {...@@ -624,6 +639,7 @@ void MapShadow(uptr addr, uptr size) {
624 static uptr mapped_meta_end = 0;639 static uptr mapped_meta_end = 0;
625 uptr meta_begin = (uptr)MemToMeta(addr);640 uptr meta_begin = (uptr)MemToMeta(addr);
626 uptr meta_end = (uptr)MemToMeta(addr + size);641 uptr meta_end = (uptr)MemToMeta(addr + size);
642 // Windows wants 64K alignment.
627 meta_begin = RoundDownTo(meta_begin, 64 << 10);643 meta_begin = RoundDownTo(meta_begin, 64 << 10);
628 meta_end = RoundUpTo(meta_end, 64 << 10);644 meta_end = RoundUpTo(meta_end, 64 << 10);
629 if (!data_mapped) {645 if (!data_mapped) {
...@@ -634,9 +650,6 @@ void MapShadow(uptr addr, uptr size) {...@@ -634,9 +650,6 @@ void MapShadow(uptr addr, uptr size) {
634 Die();650 Die();
635 } else {651 } else {
636 // Mapping continuous heap.652 // Mapping continuous heap.
637 // Windows wants 64K alignment.
638 meta_begin = RoundDownTo(meta_begin, 64 << 10);
639 meta_end = RoundUpTo(meta_end, 64 << 10);
640 CHECK_GT(meta_end, mapped_meta_end);653 CHECK_GT(meta_end, mapped_meta_end);
641 if (meta_begin < mapped_meta_end)654 if (meta_begin < mapped_meta_end)
642 meta_begin = mapped_meta_end;655 meta_begin = mapped_meta_end;
...@@ -679,6 +692,12 @@ void CheckUnwind() {...@@ -679,6 +692,12 @@ void CheckUnwind() {
679692
680bool is_initialized;693bool is_initialized;
681694
695// Symbolization indirectly calls dl_iterate_phdr. If a CHECK() fails early on
696// (prior to the dl_iterate_phdr interceptor setup), resulting in an attempted
697// symbolization, it will segfault.
698// dl_iterate_phdr is not intercepted for Android.
699bool ready_to_symbolize = SANITIZER_ANDROID;
700
682void Initialize(ThreadState *thr) {701void Initialize(ThreadState *thr) {
683 // Thread safe because done before all threads exist.702 // Thread safe because done before all threads exist.
684 if (is_initialized)703 if (is_initialized)
lib/libtsan/tsan_rtl.h+4-1
...@@ -54,13 +54,15 @@...@@ -54,13 +54,15 @@
5454
55namespace __tsan {55namespace __tsan {
5656
57extern bool ready_to_symbolize;
58
57#if !SANITIZER_GO59#if !SANITIZER_GO
58struct MapUnmapCallback;60struct MapUnmapCallback;
59# if defined(__mips64) || defined(__aarch64__) || defined(__loongarch__) || \61# if defined(__mips64) || defined(__aarch64__) || defined(__loongarch__) || \
60 defined(__powerpc__) || SANITIZER_RISCV6462 defined(__powerpc__) || SANITIZER_RISCV64
6163
62struct AP32 {64struct AP32 {
63 static const uptr kSpaceBeg = 0;65 static const uptr kSpaceBeg = SANITIZER_MMAP_BEGIN;
64 static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;66 static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;
65 static const uptr kMetadataSize = 0;67 static const uptr kMetadataSize = 0;
66 typedef __sanitizer::CompactSizeClassMap SizeClassMap;68 typedef __sanitizer::CompactSizeClassMap SizeClassMap;
...@@ -98,6 +100,7 @@ struct JmpBuf {...@@ -98,6 +100,7 @@ struct JmpBuf {
98 uptr sp;100 uptr sp;
99 int int_signal_send;101 int int_signal_send;
100 bool in_blocking_func;102 bool in_blocking_func;
103 uptr oldset_stack_size;
101 uptr in_signal_handler;104 uptr in_signal_handler;
102 uptr *shadow_stack_pos;105 uptr *shadow_stack_pos;
103};106};
lib/libtsan/tsan_rtl_access.cpp+18-12
...@@ -523,9 +523,9 @@ SECOND:...@@ -523,9 +523,9 @@ SECOND:
523}523}
524524
525void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) {525void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) {
526 DCHECK_LE(p, end);526 DCHECK_LT(p, end);
527 DCHECK(IsShadowMem(p));527 DCHECK(IsShadowMem(p));
528 DCHECK(IsShadowMem(end));528 DCHECK(IsShadowMem(end - 1));
529 UNUSED const uptr kAlign = kShadowCnt * kShadowSize;529 UNUSED const uptr kAlign = kShadowCnt * kShadowSize;
530 DCHECK_EQ(reinterpret_cast<uptr>(p) % kAlign, 0);530 DCHECK_EQ(reinterpret_cast<uptr>(p) % kAlign, 0);
531 DCHECK_EQ(reinterpret_cast<uptr>(end) % kAlign, 0);531 DCHECK_EQ(reinterpret_cast<uptr>(end) % kAlign, 0);
...@@ -569,6 +569,7 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {...@@ -569,6 +569,7 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
569 RawShadow* mid1 =569 RawShadow* mid1 =
570 Min(end, reinterpret_cast<RawShadow*>(RoundUp(570 Min(end, reinterpret_cast<RawShadow*>(RoundUp(
571 reinterpret_cast<uptr>(begin) + kPageSize / 2, kPageSize)));571 reinterpret_cast<uptr>(begin) + kPageSize / 2, kPageSize)));
572 // begin must < mid1
572 ShadowSet(begin, mid1, val);573 ShadowSet(begin, mid1, val);
573 // Reset middle part.574 // Reset middle part.
574 RawShadow* mid2 = RoundDown(end, kPageSize);575 RawShadow* mid2 = RoundDown(end, kPageSize);
...@@ -577,7 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {...@@ -577,7 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
577 Die();578 Die();
578 }579 }
579 // Set the ending.580 // Set the ending.
580 ShadowSet(mid2, end, val);581 if (mid2 < end)
582 ShadowSet(mid2, end, val);
583 else
584 DCHECK_EQ(mid2, end);
581}585}
582586
583void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {587void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {
...@@ -669,7 +673,7 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {...@@ -669,7 +673,7 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {
669 RawShadow* shadow_mem = MemToShadow(addr);673 RawShadow* shadow_mem = MemToShadow(addr);
670 DPrintf2("#%d: MemoryAccessRange: @%p %p size=%d is_read=%d\n", thr->tid,674 DPrintf2("#%d: MemoryAccessRange: @%p %p size=%d is_read=%d\n", thr->tid,
671 (void*)pc, (void*)addr, (int)size, is_read);675 (void*)pc, (void*)addr, (int)size, is_read);
672676 DCHECK_NE(size, 0);
673#if SANITIZER_DEBUG677#if SANITIZER_DEBUG
674 if (!IsAppMem(addr)) {678 if (!IsAppMem(addr)) {
675 Printf("Access to non app mem start: %p\n", (void*)addr);679 Printf("Access to non app mem start: %p\n", (void*)addr);
...@@ -684,16 +688,18 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {...@@ -684,16 +688,18 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {
684 DCHECK(IsShadowMem(shadow_mem));688 DCHECK(IsShadowMem(shadow_mem));
685 }689 }
686690
687 RawShadow* shadow_mem_end = reinterpret_cast<RawShadow*>(691 uptr rounded_size =
688 reinterpret_cast<uptr>(shadow_mem) + size * kShadowMultiplier - 1);692 (RoundUpTo(addr + size, kShadowCell) - RoundDownTo(addr, kShadowCell));
689 if (!IsShadowMem(shadow_mem_end)) {693 RawShadow* shadow_mem_end =
690 Printf("Bad shadow end addr: %p (%p)\n", shadow_mem_end,694 shadow_mem + rounded_size / kShadowCell * kShadowCnt;
695 if (!IsShadowMem(shadow_mem_end - 1)) {
696 Printf("Bad shadow end addr: %p (%p)\n", shadow_mem_end - 1,
691 (void*)(addr + size - 1));697 (void*)(addr + size - 1));
692 Printf(698 Printf(
693 "Shadow start addr (ok): %p (%p); size: 0x%zx; kShadowMultiplier: "699 "Shadow start addr (ok): %p (%p); size: 0x%zx; rounded_size: 0x%zx; "
694 "%zx\n",700 "kShadowMultiplier: %zx\n",
695 shadow_mem, (void*)addr, size, kShadowMultiplier);701 shadow_mem, (void*)addr, size, rounded_size, kShadowMultiplier);
696 DCHECK(IsShadowMem(shadow_mem_end));702 DCHECK(IsShadowMem(shadow_mem_end - 1));
697 }703 }
698#endif704#endif
699705
lib/libtsan/tsan_rtl_report.cpp+10-1
...@@ -846,7 +846,16 @@ ALWAYS_INLINE USED void PrintCurrentStack(uptr pc, bool fast) {...@@ -846,7 +846,16 @@ ALWAYS_INLINE USED void PrintCurrentStack(uptr pc, bool fast) {
846 ptrace->trace_buffer[i] = ptrace->trace_buffer[ptrace->size - i - 1];846 ptrace->trace_buffer[i] = ptrace->trace_buffer[ptrace->size - i - 1];
847 ptrace->trace_buffer[ptrace->size - i - 1] = tmp;847 ptrace->trace_buffer[ptrace->size - i - 1] = tmp;
848 }848 }
849 PrintStack(SymbolizeStack(*ptrace));849
850 if (ready_to_symbolize) {
851 PrintStack(SymbolizeStack(*ptrace));
852 } else {
853 Printf(
854 "WARNING: PrintCurrentStack() has been called too early, before "
855 "symbolization is possible. Printing unsymbolized stack trace:\n");
856 for (unsigned int i = 0; i < ptrace->size; i++)
857 Printf(" #%u: 0x%zx\n", i, ptrace->trace[i]);
858 }
850#endif859#endif
851}860}
852861
lib/libtsan/tsan_sync.cpp+22-5
...@@ -246,12 +246,29 @@ void MetaMap::MoveMemory(uptr src, uptr dst, uptr sz) {...@@ -246,12 +246,29 @@ void MetaMap::MoveMemory(uptr src, uptr dst, uptr sz) {
246 // there are no concurrent accesses to the regions (e.g. stop-the-world).246 // there are no concurrent accesses to the regions (e.g. stop-the-world).
247 CHECK_NE(src, dst);247 CHECK_NE(src, dst);
248 CHECK_NE(sz, 0);248 CHECK_NE(sz, 0);
249
250 // The current MoveMemory implementation behaves incorrectly when src, dst,
251 // and sz are not aligned to kMetaShadowCell.
252 // For example, with kMetaShadowCell == 8:
253 // - src = 4: unexpectedly clears the metadata for the range [0, 4).
254 // - src = 16, dst = 4, size = 8: A sync variable for addr = 20, which should
255 // be moved to the metadata for address 8, is incorrectly moved to the
256 // metadata for address 0 instead.
257 // - src = 0, sz = 4: fails to move the tail metadata.
258 // Therefore, the following assertions is needed.
259 DCHECK_EQ(src % kMetaShadowCell, 0);
260 DCHECK_EQ(dst % kMetaShadowCell, 0);
261 DCHECK_EQ(sz % kMetaShadowCell, 0);
262
249 uptr diff = dst - src;263 uptr diff = dst - src;
250 u32 *src_meta = MemToMeta(src);264 u32 *src_meta, *dst_meta, *src_meta_end;
251 u32 *dst_meta = MemToMeta(dst);265 uptr inc;
252 u32 *src_meta_end = MemToMeta(src + sz);266 if (dst < src) {
253 uptr inc = 1;267 src_meta = MemToMeta(src);
254 if (dst > src) {268 dst_meta = MemToMeta(dst);
269 src_meta_end = MemToMeta(src + sz);
270 inc = 1;
271 } else {
255 src_meta = MemToMeta(src + sz) - 1;272 src_meta = MemToMeta(src + sz) - 1;
256 dst_meta = MemToMeta(dst + sz) - 1;273 dst_meta = MemToMeta(dst + sz) - 1;
257 src_meta_end = MemToMeta(src) - 1;274 src_meta_end = MemToMeta(src) - 1;
lib/libtsan/ubsan/ubsan_platform.h+1-1
...@@ -16,7 +16,7 @@...@@ -16,7 +16,7 @@
16#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || \16#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || \
17 defined(__NetBSD__) || defined(__DragonFly__) || \17 defined(__NetBSD__) || defined(__DragonFly__) || \
18 (defined(__sun__) && defined(__svr4__)) || defined(_WIN32) || \18 (defined(__sun__) && defined(__svr4__)) || defined(_WIN32) || \
19 defined(__Fuchsia__)19 defined(__Fuchsia__) || defined(__HAIKU__)
20#define CAN_SANITIZE_UB 120#define CAN_SANITIZE_UB 1
21#else21#else
22# define CAN_SANITIZE_UB 022# define CAN_SANITIZE_UB 0
src/libs/libtsan.zig+3
...@@ -403,6 +403,7 @@ const sanitizer_common_sources = [_][]const u8{...@@ -403,6 +403,7 @@ const sanitizer_common_sources = [_][]const u8{
403 "sanitizer_flag_parser.cpp",403 "sanitizer_flag_parser.cpp",
404 "sanitizer_flags.cpp",404 "sanitizer_flags.cpp",
405 "sanitizer_fuchsia.cpp",405 "sanitizer_fuchsia.cpp",
406 "sanitizer_haiku.cpp",
406 "sanitizer_libc.cpp",407 "sanitizer_libc.cpp",
407 "sanitizer_libignore.cpp",408 "sanitizer_libignore.cpp",
408 "sanitizer_linux.cpp",409 "sanitizer_linux.cpp",
...@@ -420,6 +421,7 @@ const sanitizer_common_sources = [_][]const u8{...@@ -420,6 +421,7 @@ const sanitizer_common_sources = [_][]const u8{
420 "sanitizer_procmaps_bsd.cpp",421 "sanitizer_procmaps_bsd.cpp",
421 "sanitizer_procmaps_common.cpp",422 "sanitizer_procmaps_common.cpp",
422 "sanitizer_procmaps_fuchsia.cpp",423 "sanitizer_procmaps_fuchsia.cpp",
424 "sanitizer_procmaps_haiku.cpp",
423 "sanitizer_procmaps_linux.cpp",425 "sanitizer_procmaps_linux.cpp",
424 "sanitizer_procmaps_mac.cpp",426 "sanitizer_procmaps_mac.cpp",
425 "sanitizer_procmaps_solaris.cpp",427 "sanitizer_procmaps_solaris.cpp",
...@@ -478,6 +480,7 @@ const sanitizer_symbolizer_sources = [_][]const u8{...@@ -478,6 +480,7 @@ const sanitizer_symbolizer_sources = [_][]const u8{
478};480};
479481
480const interception_sources = [_][]const u8{482const interception_sources = [_][]const u8{
483 "interception_aix.cpp",
481 "interception_linux.cpp",484 "interception_linux.cpp",
482 "interception_mac.cpp",485 "interception_mac.cpp",
483 "interception_win.cpp",486 "interception_win.cpp",