From 3ca75cd55030a53a858bdbe9aba6d87f6b1e90b8 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 5 Nov 2019 14:54:57 +0100 Subject: [PATCH] Libsanitizer: merge from trunk with merge.sh. 2019-11-05 Martin Liska * all source files: Merge from upstream r375507. From-SVN: r277834 --- libsanitizer/ChangeLog | 4 + libsanitizer/MERGE | 2 +- libsanitizer/asan/asan_allocator.cpp | 2 +- libsanitizer/asan/asan_debugging.cpp | 8 +- libsanitizer/asan/asan_descriptions.h | 2 +- libsanitizer/asan/asan_errors.cpp | 5 +- libsanitizer/asan/asan_errors.h | 3 +- libsanitizer/asan/asan_flags.inc | 13 +- libsanitizer/asan/asan_globals.cpp | 27 +- libsanitizer/asan/asan_globals_win.cpp | 8 +- libsanitizer/asan/asan_interceptors.cpp | 121 +- libsanitizer/asan/asan_interceptors.h | 19 +- .../asan/asan_interceptors_memintrinsics.cpp | 2 +- libsanitizer/asan/asan_mac.cpp | 2 +- libsanitizer/asan/asan_malloc_linux.cpp | 2 +- libsanitizer/asan/asan_malloc_win.cpp | 11 +- libsanitizer/asan/asan_mapping.h | 2 +- libsanitizer/asan/asan_new_delete.cpp | 2 +- libsanitizer/asan/asan_poisoning.cpp | 2 +- libsanitizer/asan/asan_report.cpp | 10 +- libsanitizer/asan/asan_rtems.cpp | 4 +- libsanitizer/asan/asan_rtl.cpp | 6 +- libsanitizer/asan/asan_scariness_score.h | 2 +- libsanitizer/asan/asan_shadow_setup.cpp | 3 +- libsanitizer/asan/asan_stats.cpp | 2 +- libsanitizer/asan/asan_suppressions.cpp | 2 +- libsanitizer/asan/asan_thread.cpp | 5 +- libsanitizer/asan/asan_win.cpp | 10 +- libsanitizer/asan/asan_win_dll_thunk.cpp | 8 +- .../asan/asan_win_dynamic_runtime_thunk.cpp | 12 +- .../include/sanitizer/dfsan_interface.h | 2 +- .../include/sanitizer/tsan_interface_atomic.h | 8 +- .../include/sanitizer/ubsan_interface.h | 32 + libsanitizer/interception/interception.h | 4 +- .../interception/interception_win.cpp | 8 +- libsanitizer/lsan/lsan.cpp | 4 +- libsanitizer/lsan/lsan_common.cpp | 16 +- libsanitizer/lsan/lsan_common.h | 5 +- libsanitizer/lsan/lsan_common_linux.cpp | 12 +- libsanitizer/lsan/lsan_common_mac.cpp | 6 +- libsanitizer/lsan/lsan_interceptors.cpp | 55 + libsanitizer/lsan/lsan_mac.cpp | 2 +- libsanitizer/merge.sh | 1 - .../sanitizer_allocator_checks.h | 2 +- .../sanitizer_allocator_report.cpp | 9 +- libsanitizer/sanitizer_common/sanitizer_asm.h | 4 +- .../sanitizer_common/sanitizer_atomic_msvc.h | 63 +- .../sanitizer_common/sanitizer_common.cpp | 2 +- .../sanitizer_common/sanitizer_common.h | 25 +- .../sanitizer_common_interceptors.inc | 118 +- .../sanitizer_common_interface.inc | 1 + .../sanitizer_coverage_fuchsia.cpp | 6 +- .../sanitizer_coverage_libcdep_new.cpp | 4 +- .../sanitizer_coverage_win_sections.cpp | 12 +- .../sanitizer_common/sanitizer_file.cpp | 2 +- .../sanitizer_flag_parser.cpp | 3 +- .../sanitizer_common/sanitizer_flag_parser.h | 4 +- .../sanitizer_common/sanitizer_flags.cpp | 4 +- .../sanitizer_common/sanitizer_fuchsia.cpp | 2 +- .../sanitizer_common/sanitizer_getauxval.h | 30 +- .../sanitizer_glibc_version.h | 26 + .../sanitizer_interceptors_ioctl_netbsd.inc | 2 +- .../sanitizer_internal_defs.h | 75 +- .../sanitizer_common/sanitizer_libc.cpp | 11 +- .../sanitizer_common/sanitizer_linux.cpp | 39 +- .../sanitizer_linux_libcdep.cpp | 11 +- .../sanitizer_common/sanitizer_mac.cpp | 126 +- .../sanitizer_platform_interceptors.h | 24 +- .../sanitizer_platform_limits_freebsd.h | 1090 ++++----- .../sanitizer_platform_limits_linux.cpp | 7 +- .../sanitizer_platform_limits_posix.cpp | 15 +- .../sanitizer_platform_limits_posix.h | 2168 +++++++++-------- .../sanitizer_platform_limits_solaris.h | 5 +- .../sanitizer_common/sanitizer_posix.cpp | 2 + .../sanitizer_common/sanitizer_posix.h | 2 +- .../sanitizer_posix_libcdep.cpp | 26 +- .../sanitizer_common/sanitizer_printf.cpp | 6 +- .../sanitizer_common/sanitizer_procmaps.h | 2 +- .../sanitizer_procmaps_mac.cpp | 25 +- .../sanitizer_common/sanitizer_stacktrace.cpp | 17 +- .../sanitizer_stacktrace_libcdep.cpp | 5 +- .../sanitizer_stoptheworld_linux_libcdep.cpp | 5 +- .../sanitizer_common/sanitizer_suppressions.h | 2 +- .../sanitizer_symbolizer_internal.h | 4 +- .../sanitizer_symbolizer_libcdep.cpp | 7 +- .../sanitizer_symbolizer_mac.cpp | 4 +- .../sanitizer_symbolizer_posix_libcdep.cpp | 82 +- .../sanitizer_symbolizer_report.cpp | 20 +- .../sanitizer_termination.cpp | 2 +- .../sanitizer_unwind_linux_libcdep.cpp | 68 +- .../sanitizer_common/sanitizer_vector.h | 6 +- .../sanitizer_common/sanitizer_win.cpp | 12 +- .../sanitizer_common/sanitizer_win_defs.h | 12 + .../sanitizer_win_dll_thunk.cpp | 8 +- .../sanitizer_win_weak_interception.cpp | 9 +- libsanitizer/tsan/tsan_dispatch_defs.h | 14 +- libsanitizer/tsan/tsan_external.cpp | 2 +- libsanitizer/tsan/tsan_fd.cpp | 3 +- ....cpp => tsan_interceptors_libdispatch.cpp} | 3 +- libsanitizer/tsan/tsan_interceptors_mac.cpp | 42 +- .../tsan/tsan_interceptors_mach_vm.cpp | 52 + ...eptors.cpp => tsan_interceptors_posix.cpp} | 45 +- libsanitizer/tsan/tsan_interface.cpp | 2 +- libsanitizer/tsan/tsan_interface.h | 13 +- libsanitizer/tsan/tsan_interface_ann.cpp | 4 +- libsanitizer/tsan/tsan_interface_atomic.cpp | 2 +- libsanitizer/tsan/tsan_interface_inl.h | 10 +- libsanitizer/tsan/tsan_interface_java.cpp | 2 +- libsanitizer/tsan/tsan_interface_java.h | 2 +- libsanitizer/tsan/tsan_md5.cpp | 2 +- libsanitizer/tsan/tsan_mman.h | 5 +- libsanitizer/tsan/tsan_new_delete.cpp | 2 +- libsanitizer/tsan/tsan_platform.h | 2 + libsanitizer/tsan/tsan_report.cpp | 2 +- libsanitizer/tsan/tsan_rtl.cpp | 19 +- libsanitizer/tsan/tsan_rtl.h | 5 +- libsanitizer/tsan/tsan_rtl_ppc64.S | 1 - libsanitizer/tsan/tsan_rtl_report.cpp | 5 +- libsanitizer/tsan/tsan_suppressions.cpp | 2 +- libsanitizer/ubsan/ubsan_checks.inc | 5 + libsanitizer/ubsan/ubsan_diag.cpp | 2 +- libsanitizer/ubsan/ubsan_flags.cpp | 1 - libsanitizer/ubsan/ubsan_handlers.cpp | 38 +- libsanitizer/ubsan/ubsan_handlers.h | 8 - libsanitizer/ubsan/ubsan_platform.h | 2 - .../ubsan/ubsan_signals_standalone.cpp | 5 +- 126 files changed, 2758 insertions(+), 2216 deletions(-) create mode 100644 libsanitizer/include/sanitizer/ubsan_interface.h create mode 100644 libsanitizer/sanitizer_common/sanitizer_glibc_version.h rename libsanitizer/tsan/{tsan_libdispatch.cpp => tsan_interceptors_libdispatch.cpp} (99%) create mode 100644 libsanitizer/tsan/tsan_interceptors_mach_vm.cpp rename libsanitizer/tsan/{tsan_interceptors.cpp => tsan_interceptors_posix.cpp} (98%) diff --git a/libsanitizer/ChangeLog b/libsanitizer/ChangeLog index 2724f2829b3..3a926394b73 100644 --- a/libsanitizer/ChangeLog +++ b/libsanitizer/ChangeLog @@ -1,3 +1,7 @@ +2019-11-05 Martin Liska + + * all source files: Merge from upstream r375507. + 2019-10-22 Tamar Christina PR sanitizer/92154 diff --git a/libsanitizer/MERGE b/libsanitizer/MERGE index bb1b045f488..b7bf2529910 100644 --- a/libsanitizer/MERGE +++ b/libsanitizer/MERGE @@ -1,4 +1,4 @@ -368656 +375507 The first line of this file holds the svn revision number of the last merge done from the master library sources. diff --git a/libsanitizer/asan/asan_allocator.cpp b/libsanitizer/asan/asan_allocator.cpp index b58116e17b7..c9e9f5a93d0 100644 --- a/libsanitizer/asan/asan_allocator.cpp +++ b/libsanitizer/asan/asan_allocator.cpp @@ -1075,7 +1075,7 @@ IgnoreObjectResult IgnoreObjectLocked(const void *p) { } // namespace __lsan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; // ASan allocator doesn't reserve extra bytes, so normally we would // just return "size". We don't want to expose our redzone sizes, etc here. diff --git a/libsanitizer/asan/asan_debugging.cpp b/libsanitizer/asan/asan_debugging.cpp index 3fc15adf7b8..c01360b52fc 100644 --- a/libsanitizer/asan/asan_debugging.cpp +++ b/libsanitizer/asan/asan_debugging.cpp @@ -25,7 +25,7 @@ using namespace __asan; static void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset, char *name, uptr name_size, - uptr ®ion_address, uptr ®ion_size) { + uptr *region_address, uptr *region_size) { InternalMmapVector vars; vars.reserve(16); if (!ParseFrameDescription(frame_descr, &vars)) { @@ -39,8 +39,8 @@ static void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset, // the whole name and then terminate with '\0'. internal_strlcpy(name, vars[i].name_pos, Min(name_size, vars[i].name_len + 1)); - region_address = addr - (offset - vars[i].beg); - region_size = vars[i].size; + *region_address = addr - (offset - vars[i].beg); + *region_size = vars[i].size; return; } } @@ -108,7 +108,7 @@ const char *__asan_locate_address(uptr addr, char *name, uptr name_size, // region_{address,size} are already 0 } else { FindInfoForStackVar(addr, stack->frame_descr, stack->offset, name, - name_size, region_address, region_size); + name_size, ®ion_address, ®ion_size); } } else if (auto global = descr.AsGlobal()) { region_kind = "global"; diff --git a/libsanitizer/asan/asan_descriptions.h b/libsanitizer/asan/asan_descriptions.h index 28b38100b85..ee0e2061559 100644 --- a/libsanitizer/asan/asan_descriptions.h +++ b/libsanitizer/asan/asan_descriptions.h @@ -203,7 +203,7 @@ class AddressDescription { AddressDescription() = default; // shouldLockThreadRegistry allows us to skip locking if we're sure we already // have done it. - AddressDescription(uptr addr, bool shouldLockThreadRegistry = true) + explicit AddressDescription(uptr addr, bool shouldLockThreadRegistry = true) : AddressDescription(addr, 1, shouldLockThreadRegistry) {} AddressDescription(uptr addr, uptr access_size, bool shouldLockThreadRegistry = true); diff --git a/libsanitizer/asan/asan_errors.cpp b/libsanitizer/asan/asan_errors.cpp index 75ee996ceef..541c6e0353b 100644 --- a/libsanitizer/asan/asan_errors.cpp +++ b/libsanitizer/asan/asan_errors.cpp @@ -35,7 +35,8 @@ static void OnStackUnwind(const SignalContext &sig, // corresponding code in the sanitizer_common and we use this callback to // print it. static_cast(callback_context)->Print(); - stack->Unwind(sig.pc, sig.bp, sig.context, fast); + stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context, + fast); } void ErrorDeadlySignal::Print() { @@ -244,7 +245,7 @@ void ErrorInvalidPosixMemalignAlignment::Print() { "ERROR: AddressSanitizer: invalid alignment requested in posix_memalign: " "%zd, alignment must be a power of two and a multiple of sizeof(void*) " "== %zd (thread %s)\n", - alignment, sizeof(void*), AsanThreadIdAndName(tid).c_str()); // NOLINT + alignment, sizeof(void *), AsanThreadIdAndName(tid).c_str()); Printf("%s", d.Default()); stack->Print(); PrintHintAllocatorCannotReturnNull(); diff --git a/libsanitizer/asan/asan_errors.h b/libsanitizer/asan/asan_errors.h index b84f56c1853..a7fda2fd9f5 100644 --- a/libsanitizer/asan/asan_errors.h +++ b/libsanitizer/asan/asan_errors.h @@ -48,7 +48,8 @@ struct ErrorDeadlySignal : ErrorBase { scariness.Scare(10, "stack-overflow"); } else if (!signal.is_memory_access) { scariness.Scare(10, "signal"); - } else if (signal.addr < GetPageSizeCached()) { + } else if (signal.is_true_faulting_addr && + signal.addr < GetPageSizeCached()) { scariness.Scare(10, "null-deref"); } else if (signal.addr == signal.pc) { scariness.Scare(60, "wild-jump"); diff --git a/libsanitizer/asan/asan_flags.inc b/libsanitizer/asan/asan_flags.inc index d360e03ca55..43c70dbca56 100644 --- a/libsanitizer/asan/asan_flags.inc +++ b/libsanitizer/asan/asan_flags.inc @@ -139,10 +139,10 @@ ASAN_FLAG( "If >= 2, detect operations like <, <=, >, >= and - on invalid pointer " "pairs (e.g. when pointers belong to different objects); " "If == 1, detect invalid operations only when both pointers are non-null.") -ASAN_FLAG( - bool, detect_container_overflow, true, - "If true, honor the container overflow annotations. See " - "https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow") +ASAN_FLAG(bool, detect_container_overflow, true, + "If true, honor the container overflow annotations. See " + "https://github.com/google/sanitizers/wiki/" + "AddressSanitizerContainerOverflow") ASAN_FLAG(int, detect_odr_violation, 2, "If >=2, detect violation of One-Definition-Rule (ODR); " "If ==1, detect ODR-violation only if the two variables " @@ -158,5 +158,6 @@ ASAN_FLAG(bool, allocator_frees_and_returns_null_on_realloc_zero, true, ASAN_FLAG(bool, verify_asan_link_order, true, "Check position of ASan runtime in library list (needs to be disabled" " when other library has to be preloaded system-wide)") -ASAN_FLAG(bool, windows_hook_rtl_allocators, false, - "(Windows only) enable hooking of Rtl(Allocate|Free|Size|ReAllocate)Heap.") +ASAN_FLAG( + bool, windows_hook_rtl_allocators, false, + "(Windows only) enable hooking of Rtl(Allocate|Free|Size|ReAllocate)Heap.") diff --git a/libsanitizer/asan/asan_globals.cpp b/libsanitizer/asan/asan_globals.cpp index c77e5357bf9..9d7dbc6f264 100644 --- a/libsanitizer/asan/asan_globals.cpp +++ b/libsanitizer/asan/asan_globals.cpp @@ -154,6 +154,23 @@ static void CheckODRViolationViaIndicator(const Global *g) { } } +// Check ODR violation for given global G by checking if it's already poisoned. +// We use this method in case compiler doesn't use private aliases for global +// variables. +static void CheckODRViolationViaPoisoning(const Global *g) { + if (__asan_region_is_poisoned(g->beg, g->size_with_redzone)) { + // This check may not be enough: if the first global is much larger + // the entire redzone of the second global may be within the first global. + for (ListOfGlobals *l = list_of_all_globals; l; l = l->next) { + if (g->beg == l->g->beg && + (flags()->detect_odr_violation >= 2 || g->size != l->g->size) && + !IsODRViolationSuppressed(g->name)) + ReportODRViolation(g, FindRegistrationSite(g), + l->g, FindRegistrationSite(l->g)); + } + } +} + // Clang provides two different ways for global variables protection: // it can poison the global itself or its private alias. In former // case we may poison same symbol multiple times, that can help us to @@ -199,6 +216,8 @@ static void RegisterGlobal(const Global *g) { // where two globals with the same name are defined in different modules. if (UseODRIndicator(g)) CheckODRViolationViaIndicator(g); + else + CheckODRViolationViaPoisoning(g); } if (CanPoisonMemory()) PoisonRedZones(*g); @@ -208,8 +227,7 @@ static void RegisterGlobal(const Global *g) { list_of_all_globals = l; if (g->has_dynamic_init) { if (!dynamic_init_globals) { - dynamic_init_globals = - new (allocator_for_globals) VectorOfGlobals; // NOLINT + dynamic_init_globals = new (allocator_for_globals) VectorOfGlobals; dynamic_init_globals->reserve(kDynamicInitGlobalsInitialCapacity); } DynInitGlobal dyn_global = { *g, false }; @@ -296,8 +314,7 @@ void PrintGlobalLocation(InternalScopedString *str, const __asan_global &g) { } // namespace __asan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT - +using namespace __asan; // Apply __asan_register_globals to all globals found in the same loaded // executable or shared library as `flag'. The flag tracks whether globals have @@ -345,7 +362,7 @@ void __asan_register_globals(__asan_global *globals, uptr n) { BlockingMutexLock lock(&mu_for_globals); if (!global_registration_site_vector) { global_registration_site_vector = - new (allocator_for_globals) GlobalRegistrationSiteVector; // NOLINT + new (allocator_for_globals) GlobalRegistrationSiteVector; global_registration_site_vector->reserve(128); } GlobalRegistrationSite site = {stack_id, &globals[0], &globals[n - 1]}; diff --git a/libsanitizer/asan/asan_globals_win.cpp b/libsanitizer/asan/asan_globals_win.cpp index ff5fe226b53..19af88ab12b 100644 --- a/libsanitizer/asan/asan_globals_win.cpp +++ b/libsanitizer/asan/asan_globals_win.cpp @@ -15,8 +15,8 @@ namespace __asan { -#pragma section(".ASAN$GA", read, write) // NOLINT -#pragma section(".ASAN$GZ", read, write) // NOLINT +#pragma section(".ASAN$GA", read, write) +#pragma section(".ASAN$GZ", read, write) extern "C" __declspec(allocate(".ASAN$GA")) ALIGNED(sizeof(__asan_global)) __asan_global __asan_globals_start = {}; extern "C" __declspec(allocate(".ASAN$GZ")) @@ -49,8 +49,8 @@ static void unregister_dso_globals() { } // Register globals -#pragma section(".CRT$XCU", long, read) // NOLINT -#pragma section(".CRT$XTX", long, read) // NOLINT +#pragma section(".CRT$XCU", long, read) +#pragma section(".CRT$XTX", long, read) extern "C" __declspec(allocate(".CRT$XCU")) void (*const __asan_dso_reg_hook)() = ®ister_dso_globals; extern "C" __declspec(allocate(".CRT$XTX")) diff --git a/libsanitizer/asan/asan_interceptors.cpp b/libsanitizer/asan/asan_interceptors.cpp index 482e44d83b7..b19cf25c7cd 100644 --- a/libsanitizer/asan/asan_interceptors.cpp +++ b/libsanitizer/asan/asan_interceptors.cpp @@ -79,7 +79,7 @@ int OnExit() { } // namespace __asan // ---------------------- Wrappers ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; DECLARE_REAL_AND_INTERCEPTOR(void *, malloc, uptr) DECLARE_REAL_AND_INTERCEPTOR(void, free, void *) @@ -164,6 +164,11 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *) ASAN_MEMSET_IMPL(ctx, block, c, size); \ } while (false) +#if CAN_SANITIZE_LEAKS +#define COMMON_INTERCEPTOR_STRERROR() \ + __lsan::ScopedInterceptorDisabler disabler +#endif + #include "sanitizer_common/sanitizer_common_interceptors.inc" #include "sanitizer_common/sanitizer_signal_interceptors.inc" @@ -373,26 +378,26 @@ DEFINE_REAL(char*, index, const char *string, int c) // For both strcat() and strncat() we need to check the validity of |to| // argument irrespective of the |from| length. -INTERCEPTOR(char*, strcat, char *to, const char *from) { // NOLINT - void *ctx; - ASAN_INTERCEPTOR_ENTER(ctx, strcat); // NOLINT - ENSURE_ASAN_INITED(); - if (flags()->replace_str) { - uptr from_length = REAL(strlen)(from); - ASAN_READ_RANGE(ctx, from, from_length + 1); - uptr to_length = REAL(strlen)(to); - ASAN_READ_STRING_OF_LEN(ctx, to, to_length, to_length); - ASAN_WRITE_RANGE(ctx, to + to_length, from_length + 1); - // If the copying actually happens, the |from| string should not overlap - // with the resulting string starting at |to|, which has a length of - // to_length + from_length + 1. - if (from_length > 0) { - CHECK_RANGES_OVERLAP("strcat", to, from_length + to_length + 1, - from, from_length + 1); + INTERCEPTOR(char *, strcat, char *to, const char *from) { + void *ctx; + ASAN_INTERCEPTOR_ENTER(ctx, strcat); + ENSURE_ASAN_INITED(); + if (flags()->replace_str) { + uptr from_length = REAL(strlen)(from); + ASAN_READ_RANGE(ctx, from, from_length + 1); + uptr to_length = REAL(strlen)(to); + ASAN_READ_STRING_OF_LEN(ctx, to, to_length, to_length); + ASAN_WRITE_RANGE(ctx, to + to_length, from_length + 1); + // If the copying actually happens, the |from| string should not overlap + // with the resulting string starting at |to|, which has a length of + // to_length + from_length + 1. + if (from_length > 0) { + CHECK_RANGES_OVERLAP("strcat", to, from_length + to_length + 1, from, + from_length + 1); + } } + return REAL(strcat)(to, from); } - return REAL(strcat)(to, from); // NOLINT -} INTERCEPTOR(char*, strncat, char *to, const char *from, uptr size) { void *ctx; @@ -413,16 +418,17 @@ INTERCEPTOR(char*, strncat, char *to, const char *from, uptr size) { return REAL(strncat)(to, from, size); } -INTERCEPTOR(char*, strcpy, char *to, const char *from) { // NOLINT +INTERCEPTOR(char *, strcpy, char *to, const char *from) { void *ctx; - ASAN_INTERCEPTOR_ENTER(ctx, strcpy); // NOLINT + ASAN_INTERCEPTOR_ENTER(ctx, strcpy); #if SANITIZER_MAC - if (UNLIKELY(!asan_inited)) return REAL(strcpy)(to, from); // NOLINT + if (UNLIKELY(!asan_inited)) + return REAL(strcpy)(to, from); #endif // strcpy is called from malloc_default_purgeable_zone() // in __asan::ReplaceSystemAlloc() on Mac. if (asan_init_is_running) { - return REAL(strcpy)(to, from); // NOLINT + return REAL(strcpy)(to, from); } ENSURE_ASAN_INITED(); if (flags()->replace_str) { @@ -431,7 +437,7 @@ INTERCEPTOR(char*, strcpy, char *to, const char *from) { // NOLINT ASAN_READ_RANGE(ctx, from, from_size); ASAN_WRITE_RANGE(ctx, to, from_size); } - return REAL(strcpy)(to, from); // NOLINT + return REAL(strcpy)(to, from); } INTERCEPTOR(char*, strdup, const char *s) { @@ -479,8 +485,7 @@ INTERCEPTOR(char*, strncpy, char *to, const char *from, uptr size) { return REAL(strncpy)(to, from, size); } -INTERCEPTOR(long, strtol, const char *nptr, // NOLINT - char **endptr, int base) { +INTERCEPTOR(long, strtol, const char *nptr, char **endptr, int base) { void *ctx; ASAN_INTERCEPTOR_ENTER(ctx, strtol); ENSURE_ASAN_INITED(); @@ -488,7 +493,7 @@ INTERCEPTOR(long, strtol, const char *nptr, // NOLINT return REAL(strtol)(nptr, endptr, base); } char *real_endptr; - long result = REAL(strtol)(nptr, &real_endptr, base); // NOLINT + long result = REAL(strtol)(nptr, &real_endptr, base); StrtolFixAndCheck(ctx, nptr, endptr, real_endptr, base); return result; } @@ -514,7 +519,7 @@ INTERCEPTOR(int, atoi, const char *nptr) { return result; } -INTERCEPTOR(long, atol, const char *nptr) { // NOLINT +INTERCEPTOR(long, atol, const char *nptr) { void *ctx; ASAN_INTERCEPTOR_ENTER(ctx, atol); #if SANITIZER_MAC @@ -525,15 +530,14 @@ INTERCEPTOR(long, atol, const char *nptr) { // NOLINT return REAL(atol)(nptr); } char *real_endptr; - long result = REAL(strtol)(nptr, &real_endptr, 10); // NOLINT + long result = REAL(strtol)(nptr, &real_endptr, 10); FixRealStrtolEndptr(nptr, &real_endptr); ASAN_READ_STRING(ctx, nptr, (real_endptr - nptr) + 1); return result; } #if ASAN_INTERCEPT_ATOLL_AND_STRTOLL -INTERCEPTOR(long long, strtoll, const char *nptr, // NOLINT - char **endptr, int base) { +INTERCEPTOR(long long, strtoll, const char *nptr, char **endptr, int base) { void *ctx; ASAN_INTERCEPTOR_ENTER(ctx, strtoll); ENSURE_ASAN_INITED(); @@ -541,12 +545,12 @@ INTERCEPTOR(long long, strtoll, const char *nptr, // NOLINT return REAL(strtoll)(nptr, endptr, base); } char *real_endptr; - long long result = REAL(strtoll)(nptr, &real_endptr, base); // NOLINT + long long result = REAL(strtoll)(nptr, &real_endptr, base); StrtolFixAndCheck(ctx, nptr, endptr, real_endptr, base); return result; } -INTERCEPTOR(long long, atoll, const char *nptr) { // NOLINT +INTERCEPTOR(long long, atoll, const char *nptr) { void *ctx; ASAN_INTERCEPTOR_ENTER(ctx, atoll); ENSURE_ASAN_INITED(); @@ -554,31 +558,66 @@ INTERCEPTOR(long long, atoll, const char *nptr) { // NOLINT return REAL(atoll)(nptr); } char *real_endptr; - long long result = REAL(strtoll)(nptr, &real_endptr, 10); // NOLINT + long long result = REAL(strtoll)(nptr, &real_endptr, 10); FixRealStrtolEndptr(nptr, &real_endptr); ASAN_READ_STRING(ctx, nptr, (real_endptr - nptr) + 1); return result; } #endif // ASAN_INTERCEPT_ATOLL_AND_STRTOLL -#if ASAN_INTERCEPT___CXA_ATEXIT +#if ASAN_INTERCEPT___CXA_ATEXIT || ASAN_INTERCEPT_ATEXIT static void AtCxaAtexit(void *unused) { (void)unused; StopInitOrderChecking(); } +#endif +#if ASAN_INTERCEPT___CXA_ATEXIT INTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg, void *dso_handle) { #if SANITIZER_MAC if (UNLIKELY(!asan_inited)) return REAL(__cxa_atexit)(func, arg, dso_handle); #endif ENSURE_ASAN_INITED(); +#if CAN_SANITIZE_LEAKS + __lsan::ScopedInterceptorDisabler disabler; +#endif int res = REAL(__cxa_atexit)(func, arg, dso_handle); REAL(__cxa_atexit)(AtCxaAtexit, nullptr, nullptr); return res; } #endif // ASAN_INTERCEPT___CXA_ATEXIT +#if ASAN_INTERCEPT_ATEXIT +INTERCEPTOR(int, atexit, void (*func)()) { + ENSURE_ASAN_INITED(); +#if CAN_SANITIZE_LEAKS + __lsan::ScopedInterceptorDisabler disabler; +#endif + // Avoid calling real atexit as it is unrechable on at least on Linux. + int res = REAL(__cxa_atexit)((void (*)(void *a))func, nullptr, nullptr); + REAL(__cxa_atexit)(AtCxaAtexit, nullptr, nullptr); + return res; +} +#endif + +#if ASAN_INTERCEPT_PTHREAD_ATFORK +extern "C" { +extern int _pthread_atfork(void (*prepare)(), void (*parent)(), + void (*child)()); +}; + +INTERCEPTOR(int, pthread_atfork, void (*prepare)(), void (*parent)(), + void (*child)()) { +#if CAN_SANITIZE_LEAKS + __lsan::ScopedInterceptorDisabler disabler; +#endif + // REAL(pthread_atfork) cannot be called due to symbol indirections at least + // on NetBSD + return _pthread_atfork(prepare, parent, child); +} +#endif + #if ASAN_INTERCEPT_VFORK DEFINE_REAL(int, vfork) DECLARE_EXTERN_INTERCEPTOR_AND_WRAPPER(int, vfork) @@ -594,8 +633,8 @@ void InitializeAsanInterceptors() { InitializeSignalInterceptors(); // Intercept str* functions. - ASAN_INTERCEPT_FUNC(strcat); // NOLINT - ASAN_INTERCEPT_FUNC(strcpy); // NOLINT + ASAN_INTERCEPT_FUNC(strcat); + ASAN_INTERCEPT_FUNC(strcpy); ASAN_INTERCEPT_FUNC(strncat); ASAN_INTERCEPT_FUNC(strncpy); ASAN_INTERCEPT_FUNC(strdup); @@ -661,6 +700,14 @@ void InitializeAsanInterceptors() { ASAN_INTERCEPT_FUNC(__cxa_atexit); #endif +#if ASAN_INTERCEPT_ATEXIT + ASAN_INTERCEPT_FUNC(atexit); +#endif + +#if ASAN_INTERCEPT_PTHREAD_ATFORK + ASAN_INTERCEPT_FUNC(pthread_atfork); +#endif + #if ASAN_INTERCEPT_VFORK ASAN_INTERCEPT_FUNC(vfork); #endif diff --git a/libsanitizer/asan/asan_interceptors.h b/libsanitizer/asan/asan_interceptors.h index 035a84e1a42..344a64bd83d 100644 --- a/libsanitizer/asan/asan_interceptors.h +++ b/libsanitizer/asan/asan_interceptors.h @@ -80,12 +80,7 @@ void InitializePlatformInterceptors(); #if ASAN_HAS_EXCEPTIONS && !SANITIZER_WINDOWS && !SANITIZER_SOLARIS && \ !SANITIZER_NETBSD # define ASAN_INTERCEPT___CXA_THROW 1 -# if ! defined(ASAN_HAS_CXA_RETHROW_PRIMARY_EXCEPTION) \ - || ASAN_HAS_CXA_RETHROW_PRIMARY_EXCEPTION -# define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 1 -# else -# define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 0 -# endif +# define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 1 # if defined(_GLIBCXX_SJLJ_EXCEPTIONS) || (SANITIZER_IOS && defined(__arm__)) # define ASAN_INTERCEPT__UNWIND_SJLJ_RAISEEXCEPTION 1 # else @@ -104,6 +99,12 @@ void InitializePlatformInterceptors(); # define ASAN_INTERCEPT___CXA_ATEXIT 0 #endif +#if SANITIZER_NETBSD +# define ASAN_INTERCEPT_ATEXIT 1 +#else +# define ASAN_INTERCEPT_ATEXIT 0 +#endif + #if SANITIZER_LINUX && !SANITIZER_ANDROID # define ASAN_INTERCEPT___STRDUP 1 #else @@ -117,6 +118,12 @@ void InitializePlatformInterceptors(); # define ASAN_INTERCEPT_VFORK 0 #endif +#if SANITIZER_NETBSD +# define ASAN_INTERCEPT_PTHREAD_ATFORK 1 +#else +# define ASAN_INTERCEPT_PTHREAD_ATFORK 0 +#endif + DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size) DECLARE_REAL(char*, strchr, const char *str, int c) DECLARE_REAL(SIZE_T, strlen, const char *s) diff --git a/libsanitizer/asan/asan_interceptors_memintrinsics.cpp b/libsanitizer/asan/asan_interceptors_memintrinsics.cpp index 56df60ba681..ccdd5159042 100644 --- a/libsanitizer/asan/asan_interceptors_memintrinsics.cpp +++ b/libsanitizer/asan/asan_interceptors_memintrinsics.cpp @@ -16,7 +16,7 @@ #include "asan_stack.h" #include "asan_suppressions.h" -using namespace __asan; // NOLINT +using namespace __asan; void *__asan_memcpy(void *to, const void *from, uptr size) { ASAN_MEMCPY_IMPL(nullptr, to, from, size); diff --git a/libsanitizer/asan/asan_mac.cpp b/libsanitizer/asan/asan_mac.cpp index 769d499672d..a8d3f5d3473 100644 --- a/libsanitizer/asan/asan_mac.cpp +++ b/libsanitizer/asan/asan_mac.cpp @@ -205,7 +205,7 @@ void asan_dispatch_call_block_and_release(void *block) { } // namespace __asan -using namespace __asan; // NOLINT +using namespace __asan; // Wrap |ctxt| and |func| into an asan_block_context_t. // The caller retains control of the allocated context. diff --git a/libsanitizer/asan/asan_malloc_linux.cpp b/libsanitizer/asan/asan_malloc_linux.cpp index 706bc39f0c4..faa8968a5d0 100644 --- a/libsanitizer/asan/asan_malloc_linux.cpp +++ b/libsanitizer/asan/asan_malloc_linux.cpp @@ -27,7 +27,7 @@ #include "asan_stack.h" // ---------------------- Replacement functions ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; static uptr allocated_for_dlsym; static uptr last_dlsym_alloc_size_in_words; diff --git a/libsanitizer/asan/asan_malloc_win.cpp b/libsanitizer/asan/asan_malloc_win.cpp index 291d411ea79..13c6f652119 100644 --- a/libsanitizer/asan/asan_malloc_win.cpp +++ b/libsanitizer/asan/asan_malloc_win.cpp @@ -54,7 +54,7 @@ size_t WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); BOOL WINAPI HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); } -using namespace __asan; // NOLINT +using namespace __asan; // MT: Simply defining functions with the same signature in *.obj // files overrides the standard functions in the CRT. @@ -528,10 +528,11 @@ void ReplaceSystemMalloc() { (uptr)WRAP(RtlAllocateHeap), (uptr *)&REAL(RtlAllocateHeap)); } else { -#define INTERCEPT_UCRT_FUNCTION(func) \ - if (!INTERCEPT_FUNCTION_DLLIMPORT("ucrtbase.dll", \ - "api-ms-win-core-heap-l1-1-0.dll", func)) \ - VPrintf(2, "Failed to intercept ucrtbase.dll import %s\n", #func); +#define INTERCEPT_UCRT_FUNCTION(func) \ + if (!INTERCEPT_FUNCTION_DLLIMPORT( \ + "ucrtbase.dll", "api-ms-win-core-heap-l1-1-0.dll", func)) { \ + VPrintf(2, "Failed to intercept ucrtbase.dll import %s\n", #func); \ + } INTERCEPT_UCRT_FUNCTION(HeapAlloc); INTERCEPT_UCRT_FUNCTION(HeapFree); INTERCEPT_UCRT_FUNCTION(HeapReAlloc); diff --git a/libsanitizer/asan/asan_mapping.h b/libsanitizer/asan/asan_mapping.h index 09be904270c..41fb49ee46d 100644 --- a/libsanitizer/asan/asan_mapping.h +++ b/libsanitizer/asan/asan_mapping.h @@ -163,7 +163,7 @@ static const u64 kDefaultShort64bitShadowOffset = static const u64 kAArch64_ShadowOffset64 = 1ULL << 36; static const u64 kMIPS32_ShadowOffset32 = 0x0aaa0000; static const u64 kMIPS64_ShadowOffset64 = 1ULL << 37; -static const u64 kPPC64_ShadowOffset64 = 1ULL << 41; +static const u64 kPPC64_ShadowOffset64 = 1ULL << 44; static const u64 kSystemZ_ShadowOffset64 = 1ULL << 52; static const u64 kSPARC64_ShadowOffset64 = 1ULL << 43; // 0x80000000000 static const u64 kFreeBSD_ShadowOffset32 = 1ULL << 30; // 0x40000000 diff --git a/libsanitizer/asan/asan_new_delete.cpp b/libsanitizer/asan/asan_new_delete.cpp index c15e208094e..5dfcc00fd5d 100644 --- a/libsanitizer/asan/asan_new_delete.cpp +++ b/libsanitizer/asan/asan_new_delete.cpp @@ -48,7 +48,7 @@ COMMENT_EXPORT("??_V@YAXPAX@Z") // operator delete[] #define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE #endif -using namespace __asan; // NOLINT +using namespace __asan; // FreeBSD prior v9.2 have wrong definition of 'size_t'. // http://svnweb.freebsd.org/base?view=revision&revision=232261 diff --git a/libsanitizer/asan/asan_poisoning.cpp b/libsanitizer/asan/asan_poisoning.cpp index 6b36be7d1cd..f3fbe684e2c 100644 --- a/libsanitizer/asan/asan_poisoning.cpp +++ b/libsanitizer/asan/asan_poisoning.cpp @@ -92,7 +92,7 @@ void AsanPoisonOrUnpoisonIntraObjectRedzone(uptr ptr, uptr size, bool poison) { } // namespace __asan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; // Current implementation of __asan_(un)poison_memory_region doesn't check // that user program (un)poisons the memory it owns. It poisons memory diff --git a/libsanitizer/asan/asan_report.cpp b/libsanitizer/asan/asan_report.cpp index d36b0b4c594..2e6ce436d03 100644 --- a/libsanitizer/asan/asan_report.cpp +++ b/libsanitizer/asan/asan_report.cpp @@ -410,8 +410,12 @@ static bool IsInvalidPointerPair(uptr a1, uptr a2) { static INLINE void CheckForInvalidPointerPair(void *p1, void *p2) { switch (flags()->detect_invalid_pointer_pairs) { - case 0 : return; - case 1 : if (p1 == nullptr || p2 == nullptr) return; break; + case 0: + return; + case 1: + if (p1 == nullptr || p2 == nullptr) + return; + break; } uptr a1 = reinterpret_cast(p1); @@ -472,7 +476,7 @@ void ReportGenericError(uptr pc, uptr bp, uptr sp, uptr addr, bool is_write, } // namespace __asan // --------------------------- Interface --------------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; void __asan_report_error(uptr pc, uptr bp, uptr sp, uptr addr, int is_write, uptr access_size, u32 exp) { diff --git a/libsanitizer/asan/asan_rtems.cpp b/libsanitizer/asan/asan_rtems.cpp index 360d5780a3f..ecd568c5981 100644 --- a/libsanitizer/asan/asan_rtems.cpp +++ b/libsanitizer/asan/asan_rtems.cpp @@ -181,11 +181,11 @@ static void ThreadStartHook(void *hook, uptr os_id) { asanThreadRegistry().GetThreadLocked(thread->tid())->status; DCHECK(status == ThreadStatusCreated || status == ThreadStatusRunning); // Determine whether we are starting or restarting the thread. - if (status == ThreadStatusCreated) + if (status == ThreadStatusCreated) { // In lieu of AsanThread::ThreadStart. asanThreadRegistry().StartThread(thread->tid(), os_id, ThreadType::Regular, nullptr); - else { + } else { // In a thread restart, a thread may resume execution at an // arbitrary function entry point, with its stack and TLS state // reset. We unpoison the stack in that case. diff --git a/libsanitizer/asan/asan_rtl.cpp b/libsanitizer/asan/asan_rtl.cpp index b16ca950518..594d7752eea 100644 --- a/libsanitizer/asan/asan_rtl.cpp +++ b/libsanitizer/asan/asan_rtl.cpp @@ -402,7 +402,6 @@ static void AsanInitInternal() { asan_init_is_running = true; CacheBinaryName(); - CheckASLR(); // Initialize flags. This must be done early, because most of the // initialization steps look at flags(). @@ -450,6 +449,7 @@ static void AsanInitInternal() { SetLowLevelAllocateCallback(OnLowLevelAllocate); InitializeAsanInterceptors(); + CheckASLR(); // Enable system log ("adb logcat") on Android. // Doing this before interceptors are initialized crashes in: @@ -542,7 +542,7 @@ void AsanInitFromRtl() { // (and thus normal initializers from .preinit_array or modules haven't run). class AsanInitializer { -public: // NOLINT + public: AsanInitializer() { AsanInitFromRtl(); } @@ -554,7 +554,7 @@ static AsanInitializer asan_initializer; } // namespace __asan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; void NOINLINE __asan_handle_no_return() { if (asan_init_is_running) diff --git a/libsanitizer/asan/asan_scariness_score.h b/libsanitizer/asan/asan_scariness_score.h index 9e7ba47d82d..3932973c225 100644 --- a/libsanitizer/asan/asan_scariness_score.h +++ b/libsanitizer/asan/asan_scariness_score.h @@ -43,7 +43,7 @@ struct ScarinessScoreBase { internal_strlcat(descr, "-", sizeof(descr)); internal_strlcat(descr, reason, sizeof(descr)); score += add_to_score; - }; + } int GetScore() const { return score; } const char *GetDescription() const { return descr; } void Print() const { diff --git a/libsanitizer/asan/asan_shadow_setup.cpp b/libsanitizer/asan/asan_shadow_setup.cpp index fc9bf51e1b5..17324932a86 100644 --- a/libsanitizer/asan/asan_shadow_setup.cpp +++ b/libsanitizer/asan/asan_shadow_setup.cpp @@ -30,14 +30,13 @@ void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name) { CHECK_EQ(((end + 1) % GetMmapGranularity()), 0); uptr size = end - beg + 1; DecreaseTotalMmap(size); // Don't count the shadow against mmap_limit_mb. - if (!MmapFixedNoReserve(beg, size, name)) { + if (!MmapFixedSuperNoReserve(beg, size, name)) { Report( "ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. " "Perhaps you're using ulimit -v\n", size); Abort(); } - SetShadowRegionHugePageMode(beg, size); if (common_flags()->use_madv_dontdump) DontDumpShadowMemory(beg, size); } diff --git a/libsanitizer/asan/asan_stats.cpp b/libsanitizer/asan/asan_stats.cpp index bc4e8c15cc1..00ded8f5ef5 100644 --- a/libsanitizer/asan/asan_stats.cpp +++ b/libsanitizer/asan/asan_stats.cpp @@ -133,7 +133,7 @@ static void PrintAccumulatedStats() { } // namespace __asan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; uptr __sanitizer_get_current_allocated_bytes() { AsanStats stats; diff --git a/libsanitizer/asan/asan_suppressions.cpp b/libsanitizer/asan/asan_suppressions.cpp index a9c0d107694..8cb2c3e3b9b 100644 --- a/libsanitizer/asan/asan_suppressions.cpp +++ b/libsanitizer/asan/asan_suppressions.cpp @@ -36,7 +36,7 @@ SANITIZER_INTERFACE_WEAK_DEF(const char *, __asan_default_suppressions, void) { void InitializeSuppressions() { CHECK_EQ(nullptr, suppression_ctx); - suppression_ctx = new (suppression_placeholder) // NOLINT + suppression_ctx = new (suppression_placeholder) SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes)); suppression_ctx->ParseFromFile(flags()->suppressions); if (&__asan_default_suppressions) diff --git a/libsanitizer/asan/asan_thread.cpp b/libsanitizer/asan/asan_thread.cpp index d48b3414dd5..6734d9a1668 100644 --- a/libsanitizer/asan/asan_thread.cpp +++ b/libsanitizer/asan/asan_thread.cpp @@ -367,8 +367,9 @@ uptr AsanThread::GetStackVariableShadowStart(uptr addr) { } else if (has_fake_stack()) { bottom = fake_stack()->AddrIsInFakeStack(addr); CHECK(bottom); - } else + } else { return 0; + } uptr aligned_addr = RoundDownTo(addr, SANITIZER_WORDSIZE / 8); // align addr. u8 *shadow_ptr = (u8*)MemToShadow(aligned_addr); @@ -505,7 +506,7 @@ void EnsureMainThreadIDIsCorrect() { } // namespace __lsan // ---------------------- Interface ---------------- {{{1 -using namespace __asan; // NOLINT +using namespace __asan; extern "C" { SANITIZER_INTERFACE_ATTRIBUTE diff --git a/libsanitizer/asan/asan_win.cpp b/libsanitizer/asan/asan_win.cpp index f8b98ca3366..417892aaedd 100644 --- a/libsanitizer/asan/asan_win.cpp +++ b/libsanitizer/asan/asan_win.cpp @@ -29,7 +29,7 @@ #include "sanitizer_common/sanitizer_win.h" #include "sanitizer_common/sanitizer_win_defs.h" -using namespace __asan; // NOLINT +using namespace __asan; extern "C" { SANITIZER_INTERFACE_ATTRIBUTE @@ -106,7 +106,7 @@ INTERCEPTOR_WINAPI(void, RaiseException, void *a, void *b, void *c, void *d) { INTERCEPTOR_WINAPI(EXCEPTION_DISPOSITION, __C_specific_handler, _EXCEPTION_RECORD *a, void *b, _CONTEXT *c, - _DISPATCHER_CONTEXT *d) { // NOLINT + _DISPATCHER_CONTEXT *d) { CHECK(REAL(__C_specific_handler)); __asan_handle_no_return(); return REAL(__C_specific_handler)(a, b, c, d); @@ -362,7 +362,7 @@ bool HandleDlopenInit() { // beginning of C++ initialization. We set our priority to XCAB to run // immediately after the CRT runs. This way, our exception filter is called // first and we can delegate to their filter if appropriate. -#pragma section(".CRT$XCAB", long, read) // NOLINT +#pragma section(".CRT$XCAB", long, read) __declspec(allocate(".CRT$XCAB")) int (*__intercept_seh)() = __asan_set_seh_filter; @@ -375,7 +375,7 @@ static void NTAPI asan_thread_init(void *module, DWORD reason, void *reserved) { __asan_init(); } -#pragma section(".CRT$XLAB", long, read) // NOLINT +#pragma section(".CRT$XLAB", long, read) __declspec(allocate(".CRT$XLAB")) void(NTAPI *__asan_tls_init)( void *, unsigned long, void *) = asan_thread_init; #endif @@ -389,7 +389,7 @@ static void NTAPI asan_thread_exit(void *module, DWORD reason, void *reserved) { } } -#pragma section(".CRT$XLY", long, read) // NOLINT +#pragma section(".CRT$XLY", long, read) __declspec(allocate(".CRT$XLY")) void(NTAPI *__asan_tls_exit)( void *, unsigned long, void *) = asan_thread_exit; diff --git a/libsanitizer/asan/asan_win_dll_thunk.cpp b/libsanitizer/asan/asan_win_dll_thunk.cpp index 95eee5eed0d..a5671cc9dff 100644 --- a/libsanitizer/asan/asan_win_dll_thunk.cpp +++ b/libsanitizer/asan/asan_win_dll_thunk.cpp @@ -67,10 +67,10 @@ INTERCEPT_LIBRARY_FUNCTION(memcmp); INTERCEPT_LIBRARY_FUNCTION(memcpy); INTERCEPT_LIBRARY_FUNCTION(memmove); INTERCEPT_LIBRARY_FUNCTION(memset); -INTERCEPT_LIBRARY_FUNCTION(strcat); // NOLINT +INTERCEPT_LIBRARY_FUNCTION(strcat); INTERCEPT_LIBRARY_FUNCTION(strchr); INTERCEPT_LIBRARY_FUNCTION(strcmp); -INTERCEPT_LIBRARY_FUNCTION(strcpy); // NOLINT +INTERCEPT_LIBRARY_FUNCTION(strcpy); INTERCEPT_LIBRARY_FUNCTION(strcspn); INTERCEPT_LIBRARY_FUNCTION(strdup); INTERCEPT_LIBRARY_FUNCTION(strlen); @@ -135,7 +135,7 @@ static int asan_dll_thunk_init() { return 0; } -#pragma section(".CRT$XIB", long, read) // NOLINT +#pragma section(".CRT$XIB", long, read) __declspec(allocate(".CRT$XIB")) int (*__asan_preinit)() = asan_dll_thunk_init; static void WINAPI asan_thread_init(void *mod, unsigned long reason, @@ -143,7 +143,7 @@ static void WINAPI asan_thread_init(void *mod, unsigned long reason, if (reason == /*DLL_PROCESS_ATTACH=*/1) asan_dll_thunk_init(); } -#pragma section(".CRT$XLAB", long, read) // NOLINT +#pragma section(".CRT$XLAB", long, read) __declspec(allocate(".CRT$XLAB")) void (WINAPI *__asan_tls_init)(void *, unsigned long, void *) = asan_thread_init; diff --git a/libsanitizer/asan/asan_win_dynamic_runtime_thunk.cpp b/libsanitizer/asan/asan_win_dynamic_runtime_thunk.cpp index 5bd457a22b6..f0b5ec9eef7 100644 --- a/libsanitizer/asan/asan_win_dynamic_runtime_thunk.cpp +++ b/libsanitizer/asan/asan_win_dynamic_runtime_thunk.cpp @@ -32,12 +32,12 @@ #include "asan_interface.inc" // First, declare CRT sections we'll be using in this file -#pragma section(".CRT$XIB", long, read) // NOLINT -#pragma section(".CRT$XID", long, read) // NOLINT -#pragma section(".CRT$XCAB", long, read) // NOLINT -#pragma section(".CRT$XTW", long, read) // NOLINT -#pragma section(".CRT$XTY", long, read) // NOLINT -#pragma section(".CRT$XLAB", long, read) // NOLINT +#pragma section(".CRT$XIB", long, read) +#pragma section(".CRT$XID", long, read) +#pragma section(".CRT$XCAB", long, read) +#pragma section(".CRT$XTW", long, read) +#pragma section(".CRT$XTY", long, read) +#pragma section(".CRT$XLAB", long, read) //////////////////////////////////////////////////////////////////////////////// // Define a copy of __asan_option_detect_stack_use_after_return that should be diff --git a/libsanitizer/include/sanitizer/dfsan_interface.h b/libsanitizer/include/sanitizer/dfsan_interface.h index c189ee55790..81546e5df71 100644 --- a/libsanitizer/include/sanitizer/dfsan_interface.h +++ b/libsanitizer/include/sanitizer/dfsan_interface.h @@ -112,7 +112,7 @@ void dfsan_weak_hook_strncmp(void *caller_pc, const char *s1, const char *s2, } // extern "C" template -void dfsan_set_label(dfsan_label label, T &data) { // NOLINT +void dfsan_set_label(dfsan_label label, T &data) { // NOLINT dfsan_set_label(label, (void *)&data, sizeof(T)); } diff --git a/libsanitizer/include/sanitizer/tsan_interface_atomic.h b/libsanitizer/include/sanitizer/tsan_interface_atomic.h index 9ce0411917d..8052bc1d56b 100644 --- a/libsanitizer/include/sanitizer/tsan_interface_atomic.h +++ b/libsanitizer/include/sanitizer/tsan_interface_atomic.h @@ -17,10 +17,10 @@ extern "C" { #endif -typedef char __tsan_atomic8; -typedef short __tsan_atomic16; // NOLINT -typedef int __tsan_atomic32; -typedef long __tsan_atomic64; // NOLINT +typedef char __tsan_atomic8; +typedef short __tsan_atomic16; +typedef int __tsan_atomic32; +typedef long __tsan_atomic64; #if defined(__SIZEOF_INT128__) \ || (__clang_major__ * 100 + __clang_minor__ >= 302) __extension__ typedef __int128 __tsan_atomic128; diff --git a/libsanitizer/include/sanitizer/ubsan_interface.h b/libsanitizer/include/sanitizer/ubsan_interface.h new file mode 100644 index 00000000000..59fc6c3c184 --- /dev/null +++ b/libsanitizer/include/sanitizer/ubsan_interface.h @@ -0,0 +1,32 @@ +//===-- sanitizer/ubsan_interface.h -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of UBSanitizer (UBSan). +// +// Public interface header. +//===----------------------------------------------------------------------===// +#ifndef SANITIZER_UBSAN_INTERFACE_H +#define SANITIZER_UBSAN_INTERFACE_H + +#ifdef __cplusplus +extern "C" { +#endif +/// User-provided default option settings. +/// +/// You can provide your own implementation of this function to return a string +/// containing UBSan runtime options (for example, +/// verbosity=1:halt_on_error=0). +/// +/// \returns Default options string. +const char* __ubsan_default_options(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // SANITIZER_UBSAN_INTERFACE_H diff --git a/libsanitizer/interception/interception.h b/libsanitizer/interception/interception.h index dacfa5ede28..d27a8ccf92a 100644 --- a/libsanitizer/interception/interception.h +++ b/libsanitizer/interception/interception.h @@ -272,9 +272,9 @@ const interpose_substitution substitution_##func_name[] \ // INTERCEPT_FUNCTION macro, only its name. namespace __interception { #if defined(_WIN64) -typedef unsigned long long uptr; // NOLINT +typedef unsigned long long uptr; #else -typedef unsigned long uptr; // NOLINT +typedef unsigned long uptr; #endif // _WIN64 } // namespace __interception diff --git a/libsanitizer/interception/interception_win.cpp b/libsanitizer/interception/interception_win.cpp index b94e214fdff..1a1c327e612 100644 --- a/libsanitizer/interception/interception_win.cpp +++ b/libsanitizer/interception/interception_win.cpp @@ -883,8 +883,8 @@ uptr InternalGetProcAddress(void *module, const char *func_name) { // Check that the module header is full and present. RVAPtr dos_stub(module, 0); RVAPtr headers(module, dos_stub->e_lfanew); - if (!module || dos_stub->e_magic != IMAGE_DOS_SIGNATURE || // "MZ" - headers->Signature != IMAGE_NT_SIGNATURE || // "PE\0\0" + if (!module || dos_stub->e_magic != IMAGE_DOS_SIGNATURE || // "MZ" + headers->Signature != IMAGE_NT_SIGNATURE || // "PE\0\0" headers->FileHeader.SizeOfOptionalHeader < sizeof(IMAGE_OPTIONAL_HEADER)) { return 0; @@ -963,8 +963,8 @@ bool OverrideImportedFunction(const char *module_to_patch, // Check that the module header is full and present. RVAPtr dos_stub(module, 0); RVAPtr headers(module, dos_stub->e_lfanew); - if (!module || dos_stub->e_magic != IMAGE_DOS_SIGNATURE || // "MZ" - headers->Signature != IMAGE_NT_SIGNATURE || // "PE\0\0" + if (!module || dos_stub->e_magic != IMAGE_DOS_SIGNATURE || // "MZ" + headers->Signature != IMAGE_NT_SIGNATURE || // "PE\0\0" headers->FileHeader.SizeOfOptionalHeader < sizeof(IMAGE_OPTIONAL_HEADER)) { return false; diff --git a/libsanitizer/lsan/lsan.cpp b/libsanitizer/lsan/lsan.cpp index 5b5f6198a69..4ce03046ffb 100644 --- a/libsanitizer/lsan/lsan.cpp +++ b/libsanitizer/lsan/lsan.cpp @@ -50,7 +50,7 @@ void __sanitizer::BufferedStackTrace::UnwindImpl( } } -using namespace __lsan; // NOLINT +using namespace __lsan; static void InitializeFlags() { // Set all the default values. @@ -89,7 +89,7 @@ static void InitializeFlags() { static void OnStackUnwind(const SignalContext &sig, const void *, BufferedStackTrace *stack) { - stack->Unwind(sig.pc, sig.bp, sig.context, + stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context, common_flags()->fast_unwind_on_fatal); } diff --git a/libsanitizer/lsan/lsan_common.cpp b/libsanitizer/lsan/lsan_common.cpp index c39fab97c64..9ff9f4c5d1c 100644 --- a/libsanitizer/lsan/lsan_common.cpp +++ b/libsanitizer/lsan/lsan_common.cpp @@ -84,7 +84,7 @@ static const char kStdSuppressions[] = void InitializeSuppressions() { CHECK_EQ(nullptr, suppression_ctx); - suppression_ctx = new (suppression_placeholder) // NOLINT + suppression_ctx = new (suppression_placeholder) SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes)); suppression_ctx->ParseFromFile(flags()->suppressions); if (&__lsan_default_suppressions) @@ -104,7 +104,7 @@ InternalMmapVector const *GetRootRegions() { return root_regions; } void InitializeRootRegions() { CHECK(!root_regions); ALIGNED(64) static char placeholder[sizeof(InternalMmapVector)]; - root_regions = new (placeholder) InternalMmapVector(); // NOLINT + root_regions = new (placeholder) InternalMmapVector(); } const char *MaybeCallLsanDefaultOptions() { @@ -162,7 +162,7 @@ void ScanRangeForPointers(uptr begin, uptr end, uptr pp = begin; if (pp % alignment) pp = pp + alignment - pp % alignment; - for (; pp + sizeof(void *) <= end; pp += alignment) { // NOLINT + for (; pp + sizeof(void *) <= end; pp += alignment) { void *p = *reinterpret_cast(pp); if (!CanBeAHeapPointer(reinterpret_cast(p))) continue; uptr chunk = PointsIntoChunk(p); @@ -535,7 +535,7 @@ static void ReportIfNotSuspended(ThreadContextBase *tctx, void *arg) { if (i >= suspended_threads.size() || suspended_threads[i] != tctx->os_id) Report("Running thread %d was not suspended. False leaks are possible.\n", tctx->os_id); - }; + } } static void ReportUnsuspendedThreads( @@ -570,11 +570,7 @@ static bool CheckForLeaks() { EnsureMainThreadIDIsCorrect(); CheckForLeaksParam param; param.success = false; - LockThreadRegistry(); - LockAllocator(); - DoStopTheWorld(CheckForLeaksCallback, ¶m); - UnlockAllocator(); - UnlockThreadRegistry(); + LockStuffAndStopTheWorld(CheckForLeaksCallback, ¶m); if (!param.success) { Report("LeakSanitizer has encountered a fatal error.\n"); @@ -794,7 +790,7 @@ void EnableInThisThread() { } } #endif // CAN_SANITIZE_LEAKS -using namespace __lsan; // NOLINT +using namespace __lsan; extern "C" { SANITIZER_INTERFACE_ATTRIBUTE diff --git a/libsanitizer/lsan/lsan_common.h b/libsanitizer/lsan/lsan_common.h index 58dc00faaee..d24abe31b71 100644 --- a/libsanitizer/lsan/lsan_common.h +++ b/libsanitizer/lsan/lsan_common.h @@ -129,8 +129,9 @@ struct RootRegion { InternalMmapVector const *GetRootRegions(); void ScanRootRegion(Frontier *frontier, RootRegion const ®ion, uptr region_begin, uptr region_end, bool is_readable); -// Run stoptheworld while holding any platform-specific locks. -void DoStopTheWorld(StopTheWorldCallback callback, void* argument); +// Run stoptheworld while holding any platform-specific locks, as well as the +// allocator and thread registry locks. +void LockStuffAndStopTheWorld(StopTheWorldCallback callback, void* argument); void ScanRangeForPointers(uptr begin, uptr end, Frontier *frontier, diff --git a/libsanitizer/lsan/lsan_common_linux.cpp b/libsanitizer/lsan/lsan_common_linux.cpp index 9ce27a983b5..ea1a4a2f569 100644 --- a/libsanitizer/lsan/lsan_common_linux.cpp +++ b/libsanitizer/lsan/lsan_common_linux.cpp @@ -115,10 +115,14 @@ void HandleLeaks() { if (common_flags()->exitcode) Die(); } -static int DoStopTheWorldCallback(struct dl_phdr_info *info, size_t size, - void *data) { +static int LockStuffAndStopTheWorldCallback(struct dl_phdr_info *info, + size_t size, void *data) { + LockThreadRegistry(); + LockAllocator(); DoStopTheWorldParam *param = reinterpret_cast(data); StopTheWorld(param->callback, param->argument); + UnlockAllocator(); + UnlockThreadRegistry(); return 1; } @@ -130,9 +134,9 @@ static int DoStopTheWorldCallback(struct dl_phdr_info *info, size_t size, // while holding the libdl lock in the parent thread, we can safely reenter it // in the tracer. The solution is to run stoptheworld from a dl_iterate_phdr() // callback in the parent thread. -void DoStopTheWorld(StopTheWorldCallback callback, void *argument) { +void LockStuffAndStopTheWorld(StopTheWorldCallback callback, void *argument) { DoStopTheWorldParam param = {callback, argument}; - dl_iterate_phdr(DoStopTheWorldCallback, ¶m); + dl_iterate_phdr(LockStuffAndStopTheWorldCallback, ¶m); } } // namespace __lsan diff --git a/libsanitizer/lsan/lsan_common_mac.cpp b/libsanitizer/lsan/lsan_common_mac.cpp index 5204a6624ed..c1804e93c11 100644 --- a/libsanitizer/lsan/lsan_common_mac.cpp +++ b/libsanitizer/lsan/lsan_common_mac.cpp @@ -193,8 +193,12 @@ void ProcessPlatformSpecificAllocations(Frontier *frontier) { // causes rare race conditions. void HandleLeaks() {} -void DoStopTheWorld(StopTheWorldCallback callback, void *argument) { +void LockStuffAndStopTheWorld(StopTheWorldCallback callback, void *argument) { + LockThreadRegistry(); + LockAllocator(); StopTheWorld(callback, argument); + UnlockAllocator(); + UnlockThreadRegistry(); } } // namespace __lsan diff --git a/libsanitizer/lsan/lsan_interceptors.cpp b/libsanitizer/lsan/lsan_interceptors.cpp index f06d5fff706..f642bb807bc 100644 --- a/libsanitizer/lsan/lsan_interceptors.cpp +++ b/libsanitizer/lsan/lsan_interceptors.cpp @@ -345,6 +345,55 @@ INTERCEPTOR(void, thr_exit, tid_t *state) { #define LSAN_MAYBE_INTERCEPT_THR_EXIT #endif +#if SANITIZER_INTERCEPT___CXA_ATEXIT +INTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg, + void *dso_handle) { + __lsan::ScopedInterceptorDisabler disabler; + return REAL(__cxa_atexit)(func, arg, dso_handle); +} +#define LSAN_MAYBE_INTERCEPT___CXA_ATEXIT INTERCEPT_FUNCTION(__cxa_atexit) +#else +#define LSAN_MAYBE_INTERCEPT___CXA_ATEXIT +#endif + +#if SANITIZER_INTERCEPT_ATEXIT +INTERCEPTOR(int, atexit, void (*f)()) { + __lsan::ScopedInterceptorDisabler disabler; + return REAL(__cxa_atexit)((void (*)(void *a))f, 0, 0); +} +#define LSAN_MAYBE_INTERCEPT_ATEXIT INTERCEPT_FUNCTION(atexit) +#else +#define LSAN_MAYBE_INTERCEPT_ATEXIT +#endif + +#if SANITIZER_INTERCEPT_PTHREAD_ATFORK +extern "C" { +extern int _pthread_atfork(void (*prepare)(), void (*parent)(), + void (*child)()); +}; + +INTERCEPTOR(int, pthread_atfork, void (*prepare)(), void (*parent)(), + void (*child)()) { + __lsan::ScopedInterceptorDisabler disabler; + // REAL(pthread_atfork) cannot be called due to symbol indirections at least + // on NetBSD + return _pthread_atfork(prepare, parent, child); +} +#define LSAN_MAYBE_INTERCEPT_PTHREAD_ATFORK INTERCEPT_FUNCTION(pthread_atfork) +#else +#define LSAN_MAYBE_INTERCEPT_PTHREAD_ATFORK +#endif + +#if SANITIZER_INTERCEPT_STRERROR +INTERCEPTOR(char *, strerror, int errnum) { + __lsan::ScopedInterceptorDisabler disabler; + return REAL(strerror)(errnum); +} +#define LSAN_MAYBE_INTERCEPT_STRERROR INTERCEPT_FUNCTION(strerror) +#else +#define LSAN_MAYBE_INTERCEPT_STRERROR +#endif + struct ThreadParam { void *(*callback)(void *arg); void *param; @@ -454,6 +503,12 @@ void InitializeInterceptors() { LSAN_MAYBE_INTERCEPT__LWP_EXIT; LSAN_MAYBE_INTERCEPT_THR_EXIT; + LSAN_MAYBE_INTERCEPT___CXA_ATEXIT; + LSAN_MAYBE_INTERCEPT_ATEXIT; + LSAN_MAYBE_INTERCEPT_PTHREAD_ATFORK; + + LSAN_MAYBE_INTERCEPT_STRERROR; + #if !SANITIZER_NETBSD && !SANITIZER_FREEBSD if (pthread_key_create(&g_thread_finalize_key, &thread_finalize)) { Report("LeakSanitizer: failed to create thread key.\n"); diff --git a/libsanitizer/lsan/lsan_mac.cpp b/libsanitizer/lsan/lsan_mac.cpp index 7bcd9c828ef..b96893e2801 100644 --- a/libsanitizer/lsan/lsan_mac.cpp +++ b/libsanitizer/lsan/lsan_mac.cpp @@ -90,7 +90,7 @@ extern "C" void lsan_dispatch_call_block_and_release(void *block) { } // namespace __lsan -using namespace __lsan; // NOLINT +using namespace __lsan; // Wrap |ctxt| and |func| into an lsan_block_context_t. // The caller retains control of the allocated context. diff --git a/libsanitizer/merge.sh b/libsanitizer/merge.sh index 168fbbc9729..2f74fbef260 100755 --- a/libsanitizer/merge.sh +++ b/libsanitizer/merge.sh @@ -74,7 +74,6 @@ merge lib/tsan/rtl tsan merge lib/sanitizer_common sanitizer_common merge lib/interception interception merge lib/ubsan ubsan -merge lib/BlocksRuntime/ BlocksRuntime # Need to merge lib/builtins/assembly.h file: mkdir -p builtins diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator_checks.h b/libsanitizer/sanitizer_common/sanitizer_allocator_checks.h index f436ce9ecde..fc426f0e74f 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator_checks.h +++ b/libsanitizer/sanitizer_common/sanitizer_allocator_checks.h @@ -54,7 +54,7 @@ INLINE bool CheckAlignedAllocAlignmentAndSize(uptr alignment, uptr size) { // and a multiple of sizeof(void *). INLINE bool CheckPosixMemalignAlignment(uptr alignment) { return alignment != 0 && IsPowerOfTwo(alignment) && - (alignment % sizeof(void *)) == 0; // NOLINT + (alignment % sizeof(void *)) == 0; } // Returns true if calloc(size, n) call overflows on size*n calculation. diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp b/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp index dbcf2b7bf26..d74e08010d5 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_allocator_report.cpp @@ -106,10 +106,11 @@ void NORETURN ReportInvalidPosixMemalignAlignment(uptr alignment, { ScopedAllocatorErrorReport report("invalid-posix-memalign-alignment", stack); - Report("ERROR: %s: invalid alignment requested in " - "posix_memalign: %zd, alignment must be a power of two and a " - "multiple of sizeof(void*) == %zd\n", SanitizerToolName, alignment, - sizeof(void*)); // NOLINT + Report( + "ERROR: %s: invalid alignment requested in " + "posix_memalign: %zd, alignment must be a power of two and a " + "multiple of sizeof(void*) == %zd\n", + SanitizerToolName, alignment, sizeof(void *)); } Die(); } diff --git a/libsanitizer/sanitizer_common/sanitizer_asm.h b/libsanitizer/sanitizer_common/sanitizer_asm.h index 184d118d97d..803af3285e1 100644 --- a/libsanitizer/sanitizer_common/sanitizer_asm.h +++ b/libsanitizer/sanitizer_common/sanitizer_asm.h @@ -60,7 +60,9 @@ #if defined(__ELF__) && (defined(__GNU__) || defined(__FreeBSD__) || \ defined(__Fuchsia__) || defined(__linux__)) -#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits // NOLINT +// clang-format off +#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits // NOLINT +// clang-format on #else #define NO_EXEC_STACK_DIRECTIVE #endif diff --git a/libsanitizer/sanitizer_common/sanitizer_atomic_msvc.h b/libsanitizer/sanitizer_common/sanitizer_atomic_msvc.h index a249657d661..6a7c5465dcb 100644 --- a/libsanitizer/sanitizer_common/sanitizer_atomic_msvc.h +++ b/libsanitizer/sanitizer_common/sanitizer_atomic_msvc.h @@ -20,44 +20,35 @@ extern "C" void _mm_mfence(); #pragma intrinsic(_mm_mfence) extern "C" void _mm_pause(); #pragma intrinsic(_mm_pause) -extern "C" char _InterlockedExchange8( // NOLINT - char volatile *Addend, char Value); // NOLINT +extern "C" char _InterlockedExchange8(char volatile *Addend, char Value); #pragma intrinsic(_InterlockedExchange8) -extern "C" short _InterlockedExchange16( // NOLINT - short volatile *Addend, short Value); // NOLINT +extern "C" short _InterlockedExchange16(short volatile *Addend, short Value); #pragma intrinsic(_InterlockedExchange16) -extern "C" long _InterlockedExchange( // NOLINT - long volatile *Addend, long Value); // NOLINT +extern "C" long _InterlockedExchange(long volatile *Addend, long Value); #pragma intrinsic(_InterlockedExchange) -extern "C" long _InterlockedExchangeAdd( // NOLINT - long volatile * Addend, long Value); // NOLINT +extern "C" long _InterlockedExchangeAdd(long volatile *Addend, long Value); #pragma intrinsic(_InterlockedExchangeAdd) -extern "C" char _InterlockedCompareExchange8( // NOLINT - char volatile *Destination, // NOLINT - char Exchange, char Comparand); // NOLINT +extern "C" char _InterlockedCompareExchange8(char volatile *Destination, + char Exchange, char Comparand); #pragma intrinsic(_InterlockedCompareExchange8) -extern "C" short _InterlockedCompareExchange16( // NOLINT - short volatile *Destination, // NOLINT - short Exchange, short Comparand); // NOLINT +extern "C" short _InterlockedCompareExchange16(short volatile *Destination, + short Exchange, short Comparand); #pragma intrinsic(_InterlockedCompareExchange16) -extern "C" -long long _InterlockedCompareExchange64( // NOLINT - long long volatile *Destination, // NOLINT - long long Exchange, long long Comparand); // NOLINT +extern "C" long long _InterlockedCompareExchange64( + long long volatile *Destination, long long Exchange, long long Comparand); #pragma intrinsic(_InterlockedCompareExchange64) extern "C" void *_InterlockedCompareExchangePointer( void *volatile *Destination, void *Exchange, void *Comparand); #pragma intrinsic(_InterlockedCompareExchangePointer) -extern "C" -long __cdecl _InterlockedCompareExchange( // NOLINT - long volatile *Destination, // NOLINT - long Exchange, long Comparand); // NOLINT +extern "C" long __cdecl _InterlockedCompareExchange(long volatile *Destination, + long Exchange, + long Comparand); #pragma intrinsic(_InterlockedCompareExchange) #ifdef _WIN64 -extern "C" long long _InterlockedExchangeAdd64( // NOLINT - long long volatile * Addend, long long Value); // NOLINT +extern "C" long long _InterlockedExchangeAdd64(long long volatile *Addend, + long long Value); #pragma intrinsic(_InterlockedExchangeAdd64) #endif @@ -115,8 +106,8 @@ INLINE u32 atomic_fetch_add(volatile atomic_uint32_t *a, u32 v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); - return (u32)_InterlockedExchangeAdd( - (volatile long*)&a->val_dont_use, (long)v); // NOLINT + return (u32)_InterlockedExchangeAdd((volatile long *)&a->val_dont_use, + (long)v); } INLINE uptr atomic_fetch_add(volatile atomic_uintptr_t *a, @@ -124,11 +115,11 @@ INLINE uptr atomic_fetch_add(volatile atomic_uintptr_t *a, (void)mo; DCHECK(!((uptr)a % sizeof(*a))); #ifdef _WIN64 - return (uptr)_InterlockedExchangeAdd64( - (volatile long long*)&a->val_dont_use, (long long)v); // NOLINT + return (uptr)_InterlockedExchangeAdd64((volatile long long *)&a->val_dont_use, + (long long)v); #else - return (uptr)_InterlockedExchangeAdd( - (volatile long*)&a->val_dont_use, (long)v); // NOLINT + return (uptr)_InterlockedExchangeAdd((volatile long *)&a->val_dont_use, + (long)v); #endif } @@ -136,8 +127,8 @@ INLINE u32 atomic_fetch_sub(volatile atomic_uint32_t *a, u32 v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); - return (u32)_InterlockedExchangeAdd( - (volatile long*)&a->val_dont_use, -(long)v); // NOLINT + return (u32)_InterlockedExchangeAdd((volatile long *)&a->val_dont_use, + -(long)v); } INLINE uptr atomic_fetch_sub(volatile atomic_uintptr_t *a, @@ -145,11 +136,11 @@ INLINE uptr atomic_fetch_sub(volatile atomic_uintptr_t *a, (void)mo; DCHECK(!((uptr)a % sizeof(*a))); #ifdef _WIN64 - return (uptr)_InterlockedExchangeAdd64( - (volatile long long*)&a->val_dont_use, -(long long)v); // NOLINT + return (uptr)_InterlockedExchangeAdd64((volatile long long *)&a->val_dont_use, + -(long long)v); #else - return (uptr)_InterlockedExchangeAdd( - (volatile long*)&a->val_dont_use, -(long)v); // NOLINT + return (uptr)_InterlockedExchangeAdd((volatile long *)&a->val_dont_use, + -(long)v); #endif } diff --git a/libsanitizer/sanitizer_common/sanitizer_common.cpp b/libsanitizer/sanitizer_common/sanitizer_common.cpp index 451c9e526e0..f5f9f49d8cf 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_common.cpp @@ -323,7 +323,7 @@ static int InstallMallocFreeHooks(void (*malloc_hook)(const void *, uptr), } // namespace __sanitizer -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; extern "C" { SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_report_error_summary, diff --git a/libsanitizer/sanitizer_common/sanitizer_common.h b/libsanitizer/sanitizer_common/sanitizer_common.h index 4f0f16d3532..87b8f02b5b7 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.h +++ b/libsanitizer/sanitizer_common/sanitizer_common.h @@ -100,6 +100,8 @@ void UnmapOrDie(void *addr, uptr size); void *MmapOrDieOnFatalError(uptr size, const char *mem_type); bool MmapFixedNoReserve(uptr fixed_addr, uptr size, const char *name = nullptr) WARN_UNUSED_RESULT; +bool MmapFixedSuperNoReserve(uptr fixed_addr, uptr size, + const char *name = nullptr) WARN_UNUSED_RESULT; void *MmapNoReserveOrDie(uptr size, const char *mem_type); void *MmapFixedOrDie(uptr fixed_addr, uptr size, const char *name = nullptr); // Behaves just like MmapFixedOrDie, but tolerates out of memory condition, in @@ -337,18 +339,18 @@ void ReportMmapWriteExec(int prot); // Math #if SANITIZER_WINDOWS && !defined(__clang__) && !defined(__GNUC__) extern "C" { -unsigned char _BitScanForward(unsigned long *index, unsigned long mask); // NOLINT -unsigned char _BitScanReverse(unsigned long *index, unsigned long mask); // NOLINT +unsigned char _BitScanForward(unsigned long *index, unsigned long mask); +unsigned char _BitScanReverse(unsigned long *index, unsigned long mask); #if defined(_WIN64) -unsigned char _BitScanForward64(unsigned long *index, unsigned __int64 mask); // NOLINT -unsigned char _BitScanReverse64(unsigned long *index, unsigned __int64 mask); // NOLINT +unsigned char _BitScanForward64(unsigned long *index, unsigned __int64 mask); +unsigned char _BitScanReverse64(unsigned long *index, unsigned __int64 mask); #endif } #endif INLINE uptr MostSignificantSetBitIndex(uptr x) { CHECK_NE(x, 0U); - unsigned long up; // NOLINT + unsigned long up; #if !SANITIZER_WINDOWS || defined(__clang__) || defined(__GNUC__) # ifdef _WIN64 up = SANITIZER_WORDSIZE - 1 - __builtin_clzll(x); @@ -365,7 +367,7 @@ INLINE uptr MostSignificantSetBitIndex(uptr x) { INLINE uptr LeastSignificantSetBitIndex(uptr x) { CHECK_NE(x, 0U); - unsigned long up; // NOLINT + unsigned long up; #if !SANITIZER_WINDOWS || defined(__clang__) || defined(__GNUC__) # ifdef _WIN64 up = __builtin_ctzll(x); @@ -879,6 +881,11 @@ struct SignalContext { bool is_memory_access; enum WriteFlag { UNKNOWN, READ, WRITE } write_flag; + // In some cases the kernel cannot provide the true faulting address; `addr` + // will be zero then. This field allows to distinguish between these cases + // and dereferences of null. + bool is_true_faulting_addr; + // VS2013 doesn't implement unrestricted unions, so we need a trivial default // constructor SignalContext() = default; @@ -891,7 +898,8 @@ struct SignalContext { context(context), addr(GetAddress()), is_memory_access(IsMemoryAccess()), - write_flag(GetWriteFlag()) { + write_flag(GetWriteFlag()), + is_true_faulting_addr(IsTrueFaultingAddress()) { InitPcSpBp(); } @@ -912,6 +920,7 @@ struct SignalContext { uptr GetAddress() const; WriteFlag GetWriteFlag() const; bool IsMemoryAccess() const; + bool IsTrueFaultingAddress() const; }; void InitializePlatformEarly(); @@ -971,7 +980,7 @@ INLINE u32 GetNumberOfCPUsCached() { } // namespace __sanitizer inline void *operator new(__sanitizer::operator_new_size_type size, - __sanitizer::LowLevelAllocator &alloc) { + __sanitizer::LowLevelAllocator &alloc) { // NOLINT return alloc.Allocate(size); } diff --git a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc index 9975f5321a5..50e3558b52e 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc +++ b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc @@ -36,6 +36,7 @@ // COMMON_INTERCEPTOR_MMAP_IMPL // COMMON_INTERCEPTOR_COPY_STRING // COMMON_INTERCEPTOR_STRNDUP_IMPL +// COMMON_INTERCEPTOR_STRERROR //===----------------------------------------------------------------------===// #include "interception/interception.h" @@ -301,6 +302,10 @@ bool PlatformHasDifferentMemcpyAndMemmove(); return new_mem; #endif +#ifndef COMMON_INTERCEPTOR_STRERROR +#define COMMON_INTERCEPTOR_STRERROR() {} +#endif + struct FileMetadata { // For open_memstream(). char **addr; @@ -1267,9 +1272,8 @@ INTERCEPTOR(int, puts, char *s) { #endif #if SANITIZER_INTERCEPT_PRCTL -INTERCEPTOR(int, prctl, int option, unsigned long arg2, - unsigned long arg3, // NOLINT - unsigned long arg4, unsigned long arg5) { // NOLINT +INTERCEPTOR(int, prctl, int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, prctl, option, arg2, arg3, arg4, arg5); static const int PR_SET_NAME = 15; @@ -1701,13 +1705,13 @@ INTERCEPTOR(int, __fprintf_chk, __sanitizer_FILE *stream, SIZE_T size, FORMAT_INTERCEPTOR_IMPL(__fprintf_chk, vfprintf, stream, format) #endif -INTERCEPTOR(int, sprintf, char *str, const char *format, ...) // NOLINT -FORMAT_INTERCEPTOR_IMPL(sprintf, vsprintf, str, format) // NOLINT +INTERCEPTOR(int, sprintf, char *str, const char *format, ...) +FORMAT_INTERCEPTOR_IMPL(sprintf, vsprintf, str, format) #if SANITIZER_INTERCEPT___PRINTF_CHK INTERCEPTOR(int, __sprintf_chk, char *str, int flag, SIZE_T size_to, - const char *format, ...) // NOLINT -FORMAT_INTERCEPTOR_IMPL(__sprintf_chk, vsprintf, str, format) // NOLINT + const char *format, ...) +FORMAT_INTERCEPTOR_IMPL(__sprintf_chk, vsprintf, str, format) #endif INTERCEPTOR(int, snprintf, char *str, SIZE_T size, const char *format, ...) @@ -1715,8 +1719,8 @@ FORMAT_INTERCEPTOR_IMPL(snprintf, vsnprintf, str, size, format) #if SANITIZER_INTERCEPT___PRINTF_CHK INTERCEPTOR(int, __snprintf_chk, char *str, SIZE_T size, int flag, - SIZE_T size_to, const char *format, ...) // NOLINT -FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format) // NOLINT + SIZE_T size_to, const char *format, ...) +FORMAT_INTERCEPTOR_IMPL(__snprintf_chk, vsnprintf, str, size, format) #endif INTERCEPTOR(int, asprintf, char **strp, const char *format, ...) @@ -3071,13 +3075,14 @@ INTERCEPTOR(int, sendmmsg, int fd, struct __sanitizer_mmsghdr *msgvec, COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd); } int res = REAL(sendmmsg)(fd, msgvec, vlen, flags); - if (res >= 0 && msgvec) + if (res >= 0 && msgvec) { for (int i = 0; i < res; ++i) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, &msgvec[i].msg_len, sizeof(msgvec[i].msg_len)); if (common_flags()->intercept_send) read_msghdr(ctx, &msgvec[i].msg_hdr, msgvec[i].msg_len); } + } return res; } #define INIT_SENDMMSG COMMON_INTERCEPT_FUNCTION(sendmmsg); @@ -3208,20 +3213,21 @@ INTERCEPTOR(uptr, ptrace, int request, int pid, void *addr, void *data) { __sanitizer_iovec local_iovec; if (data) { - if (request == ptrace_setregs) + if (request == ptrace_setregs) { COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_regs_struct_sz); - else if (request == ptrace_setfpregs) + } else if (request == ptrace_setfpregs) { COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpregs_struct_sz); - else if (request == ptrace_setfpxregs) + } else if (request == ptrace_setfpxregs) { COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_fpxregs_struct_sz); - else if (request == ptrace_setvfpregs) + } else if (request == ptrace_setvfpregs) { COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_vfpregs_struct_sz); - else if (request == ptrace_setsiginfo) + } else if (request == ptrace_setsiginfo) { COMMON_INTERCEPTOR_READ_RANGE(ctx, data, siginfo_t_sz); + // Some kernel might zero the iovec::iov_base in case of invalid // write access. In this case copy the invalid address for further // inspection. - else if (request == ptrace_setregset || request == ptrace_getregset) { + } else if (request == ptrace_setregset || request == ptrace_getregset) { __sanitizer_iovec *iovec = (__sanitizer_iovec*)data; COMMON_INTERCEPTOR_READ_RANGE(ctx, iovec, sizeof(*iovec)); local_iovec = *iovec; @@ -3238,19 +3244,19 @@ INTERCEPTOR(uptr, ptrace, int request, int pid, void *addr, void *data) { if (!res && data) { // Note that PEEK* requests assign different meaning to the return value. // This function does not handle them (nor does it need to). - if (request == ptrace_getregs) + if (request == ptrace_getregs) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_regs_struct_sz); - else if (request == ptrace_getfpregs) + } else if (request == ptrace_getfpregs) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpregs_struct_sz); - else if (request == ptrace_getfpxregs) + } else if (request == ptrace_getfpxregs) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_fpxregs_struct_sz); - else if (request == ptrace_getvfpregs) + } else if (request == ptrace_getvfpregs) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_vfpregs_struct_sz); - else if (request == ptrace_getsiginfo) + } else if (request == ptrace_getsiginfo) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, siginfo_t_sz); - else if (request == ptrace_geteventmsg) + } else if (request == ptrace_geteventmsg) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, sizeof(unsigned long)); - else if (request == ptrace_getregset) { + } else if (request == ptrace_getregset) { __sanitizer_iovec *iovec = (__sanitizer_iovec*)data; COMMON_INTERCEPTOR_WRITE_RANGE(ctx, iovec, sizeof(*iovec)); COMMON_INTERCEPTOR_WRITE_RANGE(ctx, local_iovec.iov_base, @@ -3676,6 +3682,7 @@ INTERCEPTOR(int, sched_getparam, int pid, void *param) { INTERCEPTOR(char *, strerror, int errnum) { void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, strerror, errnum); + COMMON_INTERCEPTOR_STRERROR(); char *res = REAL(strerror)(errnum); if (res) COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1); return res; @@ -6716,7 +6723,7 @@ INTERCEPTOR(wchar_t *, wcscat, wchar_t *dst, const wchar_t *src) { COMMON_INTERCEPTOR_READ_RANGE(ctx, dst, (dst_size + 1) * sizeof(wchar_t)); COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst + dst_size, (src_size + 1) * sizeof(wchar_t)); - return REAL(wcscat)(dst, src); // NOLINT + return REAL(wcscat)(dst, src); } INTERCEPTOR(wchar_t *, wcsncat, wchar_t *dst, const wchar_t *src, SIZE_T n) { @@ -6729,7 +6736,7 @@ INTERCEPTOR(wchar_t *, wcsncat, wchar_t *dst, const wchar_t *src, SIZE_T n) { COMMON_INTERCEPTOR_READ_RANGE(ctx, dst, (dst_size + 1) * sizeof(wchar_t)); COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst + dst_size, (src_size + 1) * sizeof(wchar_t)); - return REAL(wcsncat)(dst, src, n); // NOLINT + return REAL(wcsncat)(dst, src, n); } #define INIT_WCSCAT \ COMMON_INTERCEPT_FUNCTION(wcscat); \ @@ -7843,10 +7850,11 @@ INTERCEPTOR(int, modctl, int operation, void *argp) { if (iov) COMMON_INTERCEPTOR_WRITE_RANGE( ctx, iov->iov_base, Min(iov_len, iov->iov_len)); - } else if (operation == modctl_exists) + } else if (operation == modctl_exists) { ret = REAL(modctl)(operation, argp); - else + } else { ret = REAL(modctl)(operation, argp); + } return ret; } @@ -9565,11 +9573,60 @@ INTERCEPTOR(SSIZE_T, getrandom, void *buf, SIZE_T buflen, unsigned int flags) { #define INIT_GETRANDOM #endif +#if SANITIZER_INTERCEPT_CRYPT +INTERCEPTOR(char *, crypt, char *key, char *salt) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, crypt, key, salt); + COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1); + COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1); + char *res = REAL(crypt)(key, salt); + if (res != nullptr) + COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1); + return res; +} +#define INIT_CRYPT COMMON_INTERCEPT_FUNCTION(crypt); +#else +#define INIT_CRYPT +#endif + +#if SANITIZER_INTERCEPT_CRYPT_R +INTERCEPTOR(char *, crypt_r, char *key, char *salt, void *data) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, crypt_r, key, salt, data); + COMMON_INTERCEPTOR_READ_RANGE(ctx, key, internal_strlen(key) + 1); + COMMON_INTERCEPTOR_READ_RANGE(ctx, salt, internal_strlen(salt) + 1); + char *res = REAL(crypt_r)(key, salt, data); + if (res != nullptr) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, + __sanitizer::struct_crypt_data_sz); + COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, internal_strlen(res) + 1); + } + return res; +} +#define INIT_CRYPT_R COMMON_INTERCEPT_FUNCTION(crypt_r); +#else +#define INIT_CRYPT_R +#endif + +#if SANITIZER_INTERCEPT_GETENTROPY +INTERCEPTOR(int, getentropy, void *buf, SIZE_T buflen) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, getentropy, buf, buflen); + int r = REAL(getentropy)(buf, buflen); + if (r == 0) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); + } + return r; +} +#define INIT_GETENTROPY COMMON_INTERCEPT_FUNCTION(getentropy) +#else +#define INIT_GETENTROPY +#endif + static void InitializeCommonInterceptors() { #if SI_POSIX static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1]; - interceptor_metadata_map = - new ((void *)&metadata_mem) MetadataHashMap(); // NOLINT + interceptor_metadata_map = new ((void *)&metadata_mem) MetadataHashMap(); #endif INIT_MMAP; @@ -9864,6 +9921,9 @@ static void InitializeCommonInterceptors() { INIT_GETUSERSHELL; INIT_SL_INIT; INIT_GETRANDOM; + INIT_CRYPT; + INIT_CRYPT_R; + INIT_GETENTROPY; INIT___PRINTF_CHK; } diff --git a/libsanitizer/sanitizer_common/sanitizer_common_interface.inc b/libsanitizer/sanitizer_common/sanitizer_common_interface.inc index c72554973b0..c78b6e10b68 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common_interface.inc +++ b/libsanitizer/sanitizer_common/sanitizer_common_interface.inc @@ -14,6 +14,7 @@ INTERFACE_FUNCTION(__sanitizer_set_death_callback) INTERFACE_FUNCTION(__sanitizer_set_report_path) INTERFACE_FUNCTION(__sanitizer_set_report_fd) INTERFACE_FUNCTION(__sanitizer_verify_contiguous_container) +INTERFACE_WEAK_FUNCTION(__sanitizer_on_print) INTERFACE_WEAK_FUNCTION(__sanitizer_report_error_summary) INTERFACE_WEAK_FUNCTION(__sanitizer_sandbox_on_notify) // Sanitizer weak hooks diff --git a/libsanitizer/sanitizer_common/sanitizer_coverage_fuchsia.cpp b/libsanitizer/sanitizer_common/sanitizer_coverage_fuchsia.cpp index 5451d1e758b..f18cee66b84 100644 --- a/libsanitizer/sanitizer_common/sanitizer_coverage_fuchsia.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_coverage_fuchsia.cpp @@ -36,7 +36,7 @@ #include #include -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; namespace __sancov { namespace { @@ -198,8 +198,8 @@ void InitializeCoverage(bool enabled, const char *dir) { } // namespace __sanitizer extern "C" { -SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage( // NOLINT - const uptr *pcs, uptr len) { +SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage(const uptr *pcs, + uptr len) { UNIMPLEMENTED(); } diff --git a/libsanitizer/sanitizer_common/sanitizer_coverage_libcdep_new.cpp b/libsanitizer/sanitizer_common/sanitizer_coverage_libcdep_new.cpp index ad137f936ff..6a75792f926 100644 --- a/libsanitizer/sanitizer_common/sanitizer_coverage_libcdep_new.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_coverage_libcdep_new.cpp @@ -166,8 +166,8 @@ void InitializeCoverage(bool enabled, const char *dir) { } // namespace __sanitizer extern "C" { -SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage( // NOLINT - const uptr* pcs, uptr len) { +SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage(const uptr* pcs, + uptr len) { return __sancov::SanitizerDumpCoverage(pcs, len); } diff --git a/libsanitizer/sanitizer_common/sanitizer_coverage_win_sections.cpp b/libsanitizer/sanitizer_common/sanitizer_coverage_win_sections.cpp index 40184bbb913..e7d6563393c 100644 --- a/libsanitizer/sanitizer_common/sanitizer_coverage_win_sections.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_coverage_win_sections.cpp @@ -31,7 +31,7 @@ extern "C" { // Use uint64_t so the linker won't need to add any padding if it tries to word // align the start of the 8-bit counters array. The array will always start 8 // bytes after __start_sancov_cntrs. -#pragma section(".SCOV$CA", read, write) // NOLINT +#pragma section(".SCOV$CA", read, write) __declspec(allocate(".SCOV$CA")) uint64_t __start___sancov_cntrs = 0; // Even though we said not to align __stop__sancov_cntrs (using the "align" @@ -41,13 +41,13 @@ __declspec(allocate(".SCOV$CA")) uint64_t __start___sancov_cntrs = 0; // padding would be added to align .SCOVP$Z, However, if .SCOV$CZ section is 1 // byte, the linker won't try to align it on an 8-byte boundary, so use a // uint8_t for __stop_sancov_cntrs. -#pragma section(".SCOV$CZ", read, write) // NOLINT +#pragma section(".SCOV$CZ", read, write) __declspec(allocate(".SCOV$CZ")) __declspec(align(1)) uint8_t __stop___sancov_cntrs = 0; -#pragma section(".SCOV$GA", read, write) // NOLINT +#pragma section(".SCOV$GA", read, write) __declspec(allocate(".SCOV$GA")) uint64_t __start___sancov_guards = 0; -#pragma section(".SCOV$GZ", read, write) // NOLINT +#pragma section(".SCOV$GZ", read, write) __declspec(allocate(".SCOV$GZ")) __declspec(align(1)) uint8_t __stop___sancov_guards = 0; @@ -56,9 +56,9 @@ __declspec(allocate(".SCOV$GZ")) __declspec(align(1)) uint8_t // constant it should be merged with the .rdata section. #pragma comment(linker, "/MERGE:.SCOV=.data") -#pragma section(".SCOVP$A", read) // NOLINT +#pragma section(".SCOVP$A", read) __declspec(allocate(".SCOVP$A")) uint64_t __start___sancov_pcs = 0; -#pragma section(".SCOVP$Z", read) // NOLINT +#pragma section(".SCOVP$Z", read) __declspec(allocate(".SCOVP$Z")) __declspec(align(1)) uint8_t __stop___sancov_pcs = 0; diff --git a/libsanitizer/sanitizer_common/sanitizer_file.cpp b/libsanitizer/sanitizer_common/sanitizer_file.cpp index c8c0b33cd6c..79930d79425 100644 --- a/libsanitizer/sanitizer_common/sanitizer_file.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_file.cpp @@ -199,7 +199,7 @@ char *FindPathToBinary(const char *name) { } // namespace __sanitizer -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; extern "C" { void __sanitizer_set_report_path(const char *path) { diff --git a/libsanitizer/sanitizer_common/sanitizer_flag_parser.cpp b/libsanitizer/sanitizer_common/sanitizer_flag_parser.cpp index 4831814b6df..1e2bc665261 100644 --- a/libsanitizer/sanitizer_common/sanitizer_flag_parser.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_flag_parser.cpp @@ -83,8 +83,9 @@ void FlagParser::parse_flag(const char *env_option_name) { Printf("%s: ERROR: expected '=' in %s\n", SanitizerToolName, env_option_name); Die(); - } else + } else { fatal_error("expected '='"); + } } char *name = ll_strndup(buf_ + name_start, pos_ - name_start); diff --git a/libsanitizer/sanitizer_common/sanitizer_flag_parser.h b/libsanitizer/sanitizer_common/sanitizer_flag_parser.h index 8e12700bbe8..c24ad25626b 100644 --- a/libsanitizer/sanitizer_common/sanitizer_flag_parser.h +++ b/libsanitizer/sanitizer_common/sanitizer_flag_parser.h @@ -24,7 +24,7 @@ class FlagHandlerBase { virtual bool Parse(const char *value) { return false; } protected: - ~FlagHandlerBase() {}; + ~FlagHandlerBase() {} }; template @@ -144,7 +144,7 @@ class FlagParser { template static void RegisterFlag(FlagParser *parser, const char *name, const char *desc, T *var) { - FlagHandler *fh = new (FlagParser::Alloc) FlagHandler(var); // NOLINT + FlagHandler *fh = new (FlagParser::Alloc) FlagHandler(var); parser->RegisterHandler(name, fh, desc); } diff --git a/libsanitizer/sanitizer_common/sanitizer_flags.cpp b/libsanitizer/sanitizer_common/sanitizer_flags.cpp index acc7ed39cb0..66a0a5579ed 100644 --- a/libsanitizer/sanitizer_common/sanitizer_flags.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_flags.cpp @@ -92,11 +92,11 @@ class FlagHandlerInclude : public FlagHandlerBase { }; void RegisterIncludeFlags(FlagParser *parser, CommonFlags *cf) { - FlagHandlerInclude *fh_include = new (FlagParser::Alloc) // NOLINT + FlagHandlerInclude *fh_include = new (FlagParser::Alloc) FlagHandlerInclude(parser, /*ignore_missing*/ false); parser->RegisterHandler("include", fh_include, "read more options from the given file"); - FlagHandlerInclude *fh_include_if_exists = new (FlagParser::Alloc) // NOLINT + FlagHandlerInclude *fh_include_if_exists = new (FlagParser::Alloc) FlagHandlerInclude(parser, /*ignore_missing*/ true); parser->RegisterHandler( "include_if_exists", fh_include_if_exists, diff --git a/libsanitizer/sanitizer_common/sanitizer_fuchsia.cpp b/libsanitizer/sanitizer_common/sanitizer_fuchsia.cpp index 3dc6863a03a..6e2c6137f0c 100644 --- a/libsanitizer/sanitizer_common/sanitizer_fuchsia.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_fuchsia.cpp @@ -502,7 +502,7 @@ uptr GetRSS() { UNIMPLEMENTED(); } } // namespace __sanitizer -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; extern "C" { void __sanitizer_startup_hook(int argc, char **argv, char **envp, diff --git a/libsanitizer/sanitizer_common/sanitizer_getauxval.h b/libsanitizer/sanitizer_common/sanitizer_getauxval.h index cbd1af12c04..86ad3a5e2c2 100644 --- a/libsanitizer/sanitizer_common/sanitizer_getauxval.h +++ b/libsanitizer/sanitizer_common/sanitizer_getauxval.h @@ -9,6 +9,7 @@ // Common getauxval() guards and definitions. // getauxval() is not defined until glibc version 2.16, or until API level 21 // for Android. +// Implement the getauxval() compat function for NetBSD. // //===----------------------------------------------------------------------===// @@ -16,15 +17,10 @@ #define SANITIZER_GETAUXVAL_H #include "sanitizer_platform.h" +#include "sanitizer_glibc_version.h" #if SANITIZER_LINUX || SANITIZER_FUCHSIA -# include - -# ifndef __GLIBC_PREREQ -# define __GLIBC_PREREQ(x, y) 0 -# endif - # if __GLIBC_PREREQ(2, 16) || (SANITIZER_ANDROID && __ANDROID_API__ >= 21) || \ SANITIZER_FUCHSIA # define SANITIZER_USE_GETAUXVAL 1 @@ -38,10 +34,26 @@ // The weak getauxval definition allows to check for the function at runtime. // This is useful for Android, when compiled at a lower API level yet running // on a more recent platform that offers the function. -extern "C" SANITIZER_WEAK_ATTRIBUTE -unsigned long getauxval(unsigned long type); // NOLINT +extern "C" SANITIZER_WEAK_ATTRIBUTE unsigned long getauxval(unsigned long type); # endif -#endif // SANITIZER_LINUX || SANITIZER_FUCHSIA +#elif SANITIZER_NETBSD + +#define SANITIZER_USE_GETAUXVAL 1 + +#include +#include + +static inline decltype(AuxInfo::a_v) getauxval(decltype(AuxInfo::a_type) type) { + for (const AuxInfo *aux = (const AuxInfo *)_dlauxinfo(); + aux->a_type != AT_NULL; ++aux) { + if (type == aux->a_type) + return aux->a_v; + } + + return 0; +} + +#endif #endif // SANITIZER_GETAUXVAL_H diff --git a/libsanitizer/sanitizer_common/sanitizer_glibc_version.h b/libsanitizer/sanitizer_common/sanitizer_glibc_version.h new file mode 100644 index 00000000000..47175f20aa0 --- /dev/null +++ b/libsanitizer/sanitizer_common/sanitizer_glibc_version.h @@ -0,0 +1,26 @@ +//===-- sanitizer_glibc_version.h -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of Sanitizer common code. +// +//===----------------------------------------------------------------------===// + +#ifndef SANITIZER_GLIBC_VERSION_H +#define SANITIZER_GLIBC_VERSION_H + +#include "sanitizer_platform.h" + +#if SANITIZER_LINUX || SANITIZER_FUCHSIA +#include +#endif + +#ifndef __GLIBC_PREREQ +#define __GLIBC_PREREQ(x, y) 0 +#endif + +#endif diff --git a/libsanitizer/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc b/libsanitizer/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc index 1ec73827b8b..03ef7c1788c 100644 --- a/libsanitizer/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc +++ b/libsanitizer/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc @@ -1404,7 +1404,7 @@ static void ioctl_table_fill() { _(SNDCTL_DSP_SKIP, NONE, 0); _(SNDCTL_DSP_SILENCE, NONE, 0); #undef _ -} +} // NOLINT static bool ioctl_initialized = false; diff --git a/libsanitizer/sanitizer_common/sanitizer_internal_defs.h b/libsanitizer/sanitizer_common/sanitizer_internal_defs.h index e0c6506bed5..00226305e07 100644 --- a/libsanitizer/sanitizer_common/sanitizer_internal_defs.h +++ b/libsanitizer/sanitizer_common/sanitizer_internal_defs.h @@ -133,27 +133,27 @@ namespace __sanitizer { #if defined(_WIN64) // 64-bit Windows uses LLP64 data model. -typedef unsigned long long uptr; // NOLINT -typedef signed long long sptr; // NOLINT +typedef unsigned long long uptr; +typedef signed long long sptr; #else -typedef unsigned long uptr; // NOLINT -typedef signed long sptr; // NOLINT +typedef unsigned long uptr; +typedef signed long sptr; #endif // defined(_WIN64) #if defined(__x86_64__) // Since x32 uses ILP32 data model in 64-bit hardware mode, we must use // 64-bit pointer to unwind stack frame. -typedef unsigned long long uhwptr; // NOLINT +typedef unsigned long long uhwptr; #else -typedef uptr uhwptr; // NOLINT +typedef uptr uhwptr; #endif typedef unsigned char u8; -typedef unsigned short u16; // NOLINT +typedef unsigned short u16; typedef unsigned int u32; -typedef unsigned long long u64; // NOLINT -typedef signed char s8; -typedef signed short s16; // NOLINT -typedef signed int s32; -typedef signed long long s64; // NOLINT +typedef unsigned long long u64; +typedef signed char s8; +typedef signed short s16; +typedef signed int s32; +typedef signed long long s64; #if SANITIZER_WINDOWS // On Windows, files are HANDLE, which is a synonim of void*. // Use void* to avoid including everywhere. @@ -264,7 +264,7 @@ typedef ALIGNED(1) s64 us64; #if SANITIZER_WINDOWS } // namespace __sanitizer -typedef unsigned long DWORD; // NOLINT +typedef unsigned long DWORD; namespace __sanitizer { typedef DWORD thread_return_t; # define THREAD_CALLING_CONV __stdcall @@ -419,18 +419,41 @@ inline void Trap() { } // namespace __sanitizer -namespace __asan { using namespace __sanitizer; } // NOLINT -namespace __dsan { using namespace __sanitizer; } // NOLINT -namespace __dfsan { using namespace __sanitizer; } // NOLINT -namespace __lsan { using namespace __sanitizer; } // NOLINT -namespace __msan { using namespace __sanitizer; } // NOLINT -namespace __hwasan { using namespace __sanitizer; } // NOLINT -namespace __tsan { using namespace __sanitizer; } // NOLINT -namespace __scudo { using namespace __sanitizer; } // NOLINT -namespace __ubsan { using namespace __sanitizer; } // NOLINT -namespace __xray { using namespace __sanitizer; } // NOLINT -namespace __interception { using namespace __sanitizer; } // NOLINT -namespace __hwasan { using namespace __sanitizer; } // NOLINT - +namespace __asan { +using namespace __sanitizer; +} +namespace __dsan { +using namespace __sanitizer; +} +namespace __dfsan { +using namespace __sanitizer; +} +namespace __lsan { +using namespace __sanitizer; +} +namespace __msan { +using namespace __sanitizer; +} +namespace __hwasan { +using namespace __sanitizer; +} +namespace __tsan { +using namespace __sanitizer; +} +namespace __scudo { +using namespace __sanitizer; +} +namespace __ubsan { +using namespace __sanitizer; +} +namespace __xray { +using namespace __sanitizer; +} +namespace __interception { +using namespace __sanitizer; +} +namespace __hwasan { +using namespace __sanitizer; +} #endif // SANITIZER_DEFS_H diff --git a/libsanitizer/sanitizer_common/sanitizer_libc.cpp b/libsanitizer/sanitizer_common/sanitizer_libc.cpp index 5c9d3a80c13..4bc04b48687 100644 --- a/libsanitizer/sanitizer_common/sanitizer_libc.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_libc.cpp @@ -63,10 +63,11 @@ void *internal_memmove(void *dest, const void *src, uptr n) { for (i = 0; i < signed_n; ++i) d[i] = s[i]; } else { - if (d > s && signed_n > 0) - for (i = signed_n - 1; i >= 0 ; --i) { + if (d > s && signed_n > 0) { + for (i = signed_n - 1; i >= 0; --i) { d[i] = s[i]; } + } } return dest; } @@ -270,9 +271,9 @@ bool mem_is_zero(const char *beg, uptr size) { for (; aligned_beg < aligned_end; aligned_beg++) all |= *aligned_beg; // Epilogue. - if ((char*)aligned_end >= beg) - for (const char *mem = (char*)aligned_end; mem < end; mem++) - all |= *mem; + if ((char *)aligned_end >= beg) { + for (const char *mem = (char *)aligned_end; mem < end; mem++) all |= *mem; + } return all == 0; } diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.cpp b/libsanitizer/sanitizer_common/sanitizer_linux.cpp index 1ed6af33fb8..0b53da6c349 100644 --- a/libsanitizer/sanitizer_common/sanitizer_linux.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux.cpp @@ -1062,8 +1062,6 @@ uptr GetMaxUserVirtualAddress() { uptr GetPageSize() { #if SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__)) return EXEC_PAGESIZE; -#elif SANITIZER_USE_GETAUXVAL - return getauxval(AT_PAGESZ); #elif SANITIZER_FREEBSD || SANITIZER_NETBSD // Use sysctl as sysconf can trigger interceptors internally. int pz = 0; @@ -1072,6 +1070,8 @@ uptr GetPageSize() { int rv = internal_sysctl(mib, 2, &pz, &pzl, nullptr, 0); CHECK_EQ(rv, 0); return (uptr)pz; +#elif SANITIZER_USE_GETAUXVAL + return getauxval(AT_PAGESZ); #else return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy. #endif @@ -1849,6 +1849,12 @@ SignalContext::WriteFlag SignalContext::GetWriteFlag() const { #endif } +bool SignalContext::IsTrueFaultingAddress() const { + auto si = static_cast(siginfo); + // SIGSEGV signals without a true fault address have si_code set to 128. + return si->si_signo == SIGSEGV && si->si_code != 128; +} + void SignalContext::DumpAllRegisters(void *context) { // FIXME: Implement this. } @@ -2011,6 +2017,35 @@ void CheckASLR() { CHECK_NE(personality(old_personality | ADDR_NO_RANDOMIZE), -1); ReExec(); } +#elif SANITIZER_FREEBSD + int aslr_pie; + uptr len = sizeof(aslr_pie); +#if SANITIZER_WORDSIZE == 64 + if (UNLIKELY(internal_sysctlbyname("kern.elf64.aslr.pie_enable", + &aslr_pie, &len, NULL, 0) == -1)) { + // We're making things less 'dramatic' here since + // the OID is not necessarily guaranteed to be here + // just yet regarding FreeBSD release + return; + } + + if (aslr_pie > 0) { + Printf("This sanitizer is not compatible with enabled ASLR " + "and binaries compiled with PIE\n"); + Die(); + } +#endif + // there might be 32 bits compat for 64 bits + if (UNLIKELY(internal_sysctlbyname("kern.elf32.aslr.pie_enable", + &aslr_pie, &len, NULL, 0) == -1)) { + return; + } + + if (aslr_pie > 0) { + Printf("This sanitizer is not compatible with enabled ASLR " + "and binaries compiled with PIE\n"); + Die(); + } #else // Do nothing #endif diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp index 7dc38a0b703..cd503718205 100644 --- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -23,6 +23,7 @@ #include "sanitizer_flags.h" #include "sanitizer_freebsd.h" #include "sanitizer_getauxval.h" +#include "sanitizer_glibc_version.h" #include "sanitizer_linux.h" #include "sanitizer_placement_new.h" #include "sanitizer_procmaps.h" @@ -188,11 +189,7 @@ __attribute__((unused)) static bool GetLibcVersion(int *major, int *minor, static uptr g_tls_size; #ifdef __i386__ -# ifndef __GLIBC_PREREQ -# define CHECK_GET_TLS_STATIC_INFO_VERSION 1 -# else -# define CHECK_GET_TLS_STATIC_INFO_VERSION (!__GLIBC_PREREQ(2, 27)) -# endif +# define CHECK_GET_TLS_STATIC_INFO_VERSION (!__GLIBC_PREREQ(2, 27)) #else # define CHECK_GET_TLS_STATIC_INFO_VERSION 0 #endif @@ -701,13 +698,9 @@ u32 GetNumberOfCPUs() { #elif SANITIZER_SOLARIS return sysconf(_SC_NPROCESSORS_ONLN); #else -#if defined(CPU_COUNT) cpu_set_t CPUs; CHECK_EQ(sched_getaffinity(0, sizeof(cpu_set_t), &CPUs), 0); return CPU_COUNT(&CPUs); -#else - return 1; -#endif #endif } diff --git a/libsanitizer/sanitizer_common/sanitizer_mac.cpp b/libsanitizer/sanitizer_common/sanitizer_mac.cpp index 7552b7aa965..ea4bd02aa92 100644 --- a/libsanitizer/sanitizer_common/sanitizer_mac.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_mac.cpp @@ -13,6 +13,7 @@ #include "sanitizer_platform.h" #if SANITIZER_MAC #include "sanitizer_mac.h" +#include "interception/interception.h" // Use 64-bit inodes in file operations. ASan does not support OS X 10.5, so // the clients will most certainly use 64-bit ones as well. @@ -36,7 +37,7 @@ extern char **environ; #endif -#if defined(__has_include) && __has_include() && defined(__BLOCKS__) +#if defined(__has_include) && __has_include() #define SANITIZER_OS_TRACE 1 #include #else @@ -64,7 +65,9 @@ extern "C" { #include #include #include +#include #include +#include #include #include #include @@ -239,27 +242,102 @@ int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp, (size_t)newlen); } -int internal_forkpty(int *aparent) { - int parent, worker; - if (openpty(&parent, &worker, nullptr, nullptr, nullptr) == -1) return -1; - int pid = internal_fork(); - if (pid == -1) { - close(parent); - close(worker); - return -1; +static fd_t internal_spawn_impl(const char *argv[], pid_t *pid) { + fd_t master_fd = kInvalidFd; + fd_t slave_fd = kInvalidFd; + + auto fd_closer = at_scope_exit([&] { + internal_close(master_fd); + internal_close(slave_fd); + }); + + // We need a new pseudoterminal to avoid buffering problems. The 'atos' tool + // in particular detects when it's talking to a pipe and forgets to flush the + // output stream after sending a response. + master_fd = posix_openpt(O_RDWR); + if (master_fd == kInvalidFd) return kInvalidFd; + + int res = grantpt(master_fd) || unlockpt(master_fd); + if (res != 0) return kInvalidFd; + + // Use TIOCPTYGNAME instead of ptsname() to avoid threading problems. + char slave_pty_name[128]; + res = ioctl(master_fd, TIOCPTYGNAME, slave_pty_name); + if (res == -1) return kInvalidFd; + + slave_fd = internal_open(slave_pty_name, O_RDWR); + if (slave_fd == kInvalidFd) return kInvalidFd; + + // File descriptor actions + posix_spawn_file_actions_t acts; + res = posix_spawn_file_actions_init(&acts); + if (res != 0) return kInvalidFd; + + auto acts_cleanup = at_scope_exit([&] { + posix_spawn_file_actions_destroy(&acts); + }); + + res = posix_spawn_file_actions_adddup2(&acts, slave_fd, STDIN_FILENO) || + posix_spawn_file_actions_adddup2(&acts, slave_fd, STDOUT_FILENO) || + posix_spawn_file_actions_addclose(&acts, slave_fd); + if (res != 0) return kInvalidFd; + + // Spawn attributes + posix_spawnattr_t attrs; + res = posix_spawnattr_init(&attrs); + if (res != 0) return kInvalidFd; + + auto attrs_cleanup = at_scope_exit([&] { + posix_spawnattr_destroy(&attrs); + }); + + // In the spawned process, close all file descriptors that are not explicitly + // described by the file actions object. This is Darwin-specific extension. + res = posix_spawnattr_setflags(&attrs, POSIX_SPAWN_CLOEXEC_DEFAULT); + if (res != 0) return kInvalidFd; + + // posix_spawn + char **argv_casted = const_cast(argv); + char **env = GetEnviron(); + res = posix_spawn(pid, argv[0], &acts, &attrs, argv_casted, env); + if (res != 0) return kInvalidFd; + + // Disable echo in the new terminal, disable CR. + struct termios termflags; + tcgetattr(master_fd, &termflags); + termflags.c_oflag &= ~ONLCR; + termflags.c_lflag &= ~ECHO; + tcsetattr(master_fd, TCSANOW, &termflags); + + // On success, do not close master_fd on scope exit. + fd_t fd = master_fd; + master_fd = kInvalidFd; + + return fd; +} + +fd_t internal_spawn(const char *argv[], pid_t *pid) { + // The client program may close its stdin and/or stdout and/or stderr thus + // allowing open/posix_openpt to reuse file descriptors 0, 1 or 2. In this + // case the communication is broken if either the parent or the child tries to + // close or duplicate these descriptors. We temporarily reserve these + // descriptors here to prevent this. + fd_t low_fds[3]; + size_t count = 0; + + for (; count < 3; count++) { + low_fds[count] = posix_openpt(O_RDWR); + if (low_fds[count] >= STDERR_FILENO) + break; } - if (pid == 0) { - close(parent); - if (login_tty(worker) != 0) { - // We already forked, there's not much we can do. Let's quit. - Report("login_tty failed (errno %d)\n", errno); - internal__exit(1); - } - } else { - *aparent = parent; - close(worker); + + fd_t fd = internal_spawn_impl(argv, pid); + + for (; count > 0; count--) { + internal_close(low_fds[count]); } - return pid; + + return fd; } uptr internal_rename(const char *oldpath, const char *newpath) { @@ -676,6 +754,12 @@ SignalContext::WriteFlag SignalContext::GetWriteFlag() const { #endif } +bool SignalContext::IsTrueFaultingAddress() const { + auto si = static_cast(siginfo); + // "Real" SIGSEGV codes (e.g., SEGV_MAPERR, SEGV_MAPERR) are non-zero. + return si->si_signo == SIGSEGV && si->si_code != 0; +} + static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) { ucontext_t *ucontext = (ucontext_t*)context; # if defined(__aarch64__) @@ -1122,7 +1206,7 @@ bool GetRandom(void *buffer, uptr length, bool blocking) { if (!buffer || !length || length > 256) return false; // arc4random never fails. - arc4random_buf(buffer, length); + REAL(arc4random_buf)(buffer, length); return true; } diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h index e7becbb0e20..61a6b82ef81 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform_interceptors.h @@ -13,6 +13,7 @@ #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H #define SANITIZER_PLATFORM_INTERCEPTORS_H +#include "sanitizer_glibc_version.h" #include "sanitizer_internal_defs.h" #if SANITIZER_POSIX @@ -331,10 +332,9 @@ #define SANITIZER_INTERCEPT_ETHER_HOST \ (SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID) #define SANITIZER_INTERCEPT_ETHER_R (SI_FREEBSD || SI_LINUX_NOT_ANDROID) -#define SANITIZER_INTERCEPT_SHMCTL \ - (SI_NETBSD || SI_OPENBSD || SI_SOLARIS || \ - ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && \ - SANITIZER_WORDSIZE == 64)) // NOLINT +#define SANITIZER_INTERCEPT_SHMCTL \ + (((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && SANITIZER_WORDSIZE == 64) || \ + SI_NETBSD || SI_OPENBSD || SI_SOLARIS) // NOLINT #define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_POSIX #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \ @@ -489,7 +489,8 @@ SI_NOT_RTEMS) #define SANITIZER_INTERCEPT_REALLOCARRAY SI_POSIX #define SANITIZER_INTERCEPT_ALIGNED_ALLOC (!SI_MAC && SI_NOT_RTEMS) -#define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE (!SI_MAC && !SI_OPENBSD) +#define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE \ + (!SI_MAC && !SI_OPENBSD && !SI_NETBSD) #define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_WCSCAT SI_POSIX #define SANITIZER_INTERCEPT_WCSDUP SI_POSIX @@ -561,11 +562,18 @@ #define SANITIZER_INTERCEPT_FUNOPEN (SI_NETBSD || SI_FREEBSD) #define SANITIZER_INTERCEPT_FUNOPEN2 SI_NETBSD #define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC) -#define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD) +#define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD || SI_MAC) #define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD #define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_ANDROID) #define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD) - -#define SANITIZER_INTERCEPT_GETRANDOM SI_LINUX +#define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID) +#define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID) + +#define SANITIZER_INTERCEPT_GETRANDOM \ + ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD) +#define SANITIZER_INTERCEPT___CXA_ATEXIT SI_NETBSD +#define SANITIZER_INTERCEPT_ATEXIT SI_NETBSD +#define SANITIZER_INTERCEPT_PTHREAD_ATFORK SI_NETBSD +#define SANITIZER_INTERCEPT_GETENTROPY SI_FREEBSD #endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_freebsd.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_freebsd.h index 46307c6c434..71cf5b9c357 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_freebsd.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_freebsd.h @@ -30,373 +30,373 @@ #include namespace __sanitizer { - extern unsigned struct_utsname_sz; - extern unsigned struct_stat_sz; +extern unsigned struct_utsname_sz; +extern unsigned struct_stat_sz; #if defined(__powerpc64__) - const unsigned struct___old_kernel_stat_sz = 0; +const unsigned struct___old_kernel_stat_sz = 0; #else - const unsigned struct___old_kernel_stat_sz = 32; +const unsigned struct___old_kernel_stat_sz = 32; #endif - extern unsigned struct_rusage_sz; - extern unsigned siginfo_t_sz; - extern unsigned struct_itimerval_sz; - extern unsigned pthread_t_sz; - extern unsigned pthread_mutex_t_sz; - extern unsigned pthread_cond_t_sz; - extern unsigned pid_t_sz; - extern unsigned timeval_sz; - extern unsigned uid_t_sz; - extern unsigned gid_t_sz; - extern unsigned fpos_t_sz; - extern unsigned mbstate_t_sz; - extern unsigned struct_timezone_sz; - extern unsigned struct_tms_sz; - extern unsigned struct_itimerspec_sz; - extern unsigned struct_sigevent_sz; - extern unsigned struct_sched_param_sz; - extern unsigned struct_statfs64_sz; - extern unsigned struct_statfs_sz; - extern unsigned struct_sockaddr_sz; - extern unsigned ucontext_t_sz; - extern unsigned struct_rlimit_sz; - extern unsigned struct_utimbuf_sz; - extern unsigned struct_timespec_sz; - extern unsigned struct_regmatch_sz; - extern unsigned struct_regex_sz; - extern unsigned struct_FTS_sz; - extern unsigned struct_FTSENT_sz; - extern const int unvis_valid; - extern const int unvis_validpush; - - struct __sanitizer_iocb { - u64 aio_data; - u32 aio_key_or_aio_reserved1; // Simply crazy. - u32 aio_reserved1_or_aio_key; // Luckily, we don't need these. - u16 aio_lio_opcode; - s16 aio_reqprio; - u32 aio_fildes; - u64 aio_buf; - u64 aio_nbytes; - s64 aio_offset; - u64 aio_reserved2; - u64 aio_reserved3; - }; - - struct __sanitizer_io_event { - u64 data; - u64 obj; - u64 res; - u64 res2; - }; - - const unsigned iocb_cmd_pread = 0; - const unsigned iocb_cmd_pwrite = 1; - const unsigned iocb_cmd_preadv = 7; - const unsigned iocb_cmd_pwritev = 8; - - struct __sanitizer___sysctl_args { - int *name; - int nlen; - void *oldval; - uptr *oldlenp; - void *newval; - uptr newlen; - unsigned long ___unused[4]; - }; - - struct __sanitizer_ipc_perm { - unsigned int cuid; - unsigned int cgid; - unsigned int uid; - unsigned int gid; - unsigned short mode; - unsigned short seq; - long key; - }; - - struct __sanitizer_shmid_ds { - __sanitizer_ipc_perm shm_perm; - unsigned long shm_segsz; - unsigned int shm_lpid; - unsigned int shm_cpid; - int shm_nattch; - unsigned long shm_atime; - unsigned long shm_dtime; - unsigned long shm_ctime; - }; - - extern unsigned struct_msqid_ds_sz; - extern unsigned struct_mq_attr_sz; - extern unsigned struct_timeb_sz; - extern unsigned struct_statvfs_sz; - - struct __sanitizer_iovec { - void *iov_base; - uptr iov_len; - }; - - struct __sanitizer_ifaddrs { - struct __sanitizer_ifaddrs *ifa_next; - char *ifa_name; - unsigned int ifa_flags; - void *ifa_addr; // (struct sockaddr *) - void *ifa_netmask; // (struct sockaddr *) -# undef ifa_dstaddr - void *ifa_dstaddr; // (struct sockaddr *) - void *ifa_data; - }; - - typedef unsigned __sanitizer_pthread_key_t; - - struct __sanitizer_passwd { - char *pw_name; - char *pw_passwd; - int pw_uid; - int pw_gid; - long pw_change; - char *pw_class; - char *pw_gecos; - char *pw_dir; - char *pw_shell; - long pw_expire; - int pw_fields; - }; - - struct __sanitizer_group { - char *gr_name; - char *gr_passwd; - int gr_gid; - char **gr_mem; - }; - -#if defined(__LP64___) - typedef long long __sanitizer_time_t; +extern unsigned struct_rusage_sz; +extern unsigned siginfo_t_sz; +extern unsigned struct_itimerval_sz; +extern unsigned pthread_t_sz; +extern unsigned pthread_mutex_t_sz; +extern unsigned pthread_cond_t_sz; +extern unsigned pid_t_sz; +extern unsigned timeval_sz; +extern unsigned uid_t_sz; +extern unsigned gid_t_sz; +extern unsigned fpos_t_sz; +extern unsigned mbstate_t_sz; +extern unsigned struct_timezone_sz; +extern unsigned struct_tms_sz; +extern unsigned struct_itimerspec_sz; +extern unsigned struct_sigevent_sz; +extern unsigned struct_sched_param_sz; +extern unsigned struct_statfs64_sz; +extern unsigned struct_statfs_sz; +extern unsigned struct_sockaddr_sz; +extern unsigned ucontext_t_sz; +extern unsigned struct_rlimit_sz; +extern unsigned struct_utimbuf_sz; +extern unsigned struct_timespec_sz; +extern unsigned struct_regmatch_sz; +extern unsigned struct_regex_sz; +extern unsigned struct_FTS_sz; +extern unsigned struct_FTSENT_sz; +extern const int unvis_valid; +extern const int unvis_validpush; + +struct __sanitizer_iocb { + u64 aio_data; + u32 aio_key_or_aio_reserved1; // Simply crazy. + u32 aio_reserved1_or_aio_key; // Luckily, we don't need these. + u16 aio_lio_opcode; + s16 aio_reqprio; + u32 aio_fildes; + u64 aio_buf; + u64 aio_nbytes; + s64 aio_offset; + u64 aio_reserved2; + u64 aio_reserved3; +}; + +struct __sanitizer_io_event { + u64 data; + u64 obj; + u64 res; + u64 res2; +}; + +const unsigned iocb_cmd_pread = 0; +const unsigned iocb_cmd_pwrite = 1; +const unsigned iocb_cmd_preadv = 7; +const unsigned iocb_cmd_pwritev = 8; + +struct __sanitizer___sysctl_args { + int *name; + int nlen; + void *oldval; + uptr *oldlenp; + void *newval; + uptr newlen; + unsigned long ___unused[4]; +}; + +struct __sanitizer_ipc_perm { + unsigned int cuid; + unsigned int cgid; + unsigned int uid; + unsigned int gid; + unsigned short mode; + unsigned short seq; + long key; +}; + +#if !defined(__i386__) +typedef long long __sanitizer_time_t; #else - typedef long __sanitizer_time_t; +typedef long __sanitizer_time_t; #endif - typedef long __sanitizer_suseconds_t; - - struct __sanitizer_timeval { - __sanitizer_time_t tv_sec; - __sanitizer_suseconds_t tv_usec; - }; - - struct __sanitizer_itimerval { - struct __sanitizer_timeval it_interval; - struct __sanitizer_timeval it_value; - }; - - struct __sanitizer_timeb { - __sanitizer_time_t time; - unsigned short millitm; - short timezone; - short dstflag; - }; - - struct __sanitizer_ether_addr { - u8 octet[6]; - }; - - struct __sanitizer_tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - long int tm_gmtoff; - const char *tm_zone; - }; - - struct __sanitizer_msghdr { - void *msg_name; - unsigned msg_namelen; - struct __sanitizer_iovec *msg_iov; - unsigned msg_iovlen; - void *msg_control; - unsigned msg_controllen; - int msg_flags; - }; - - struct __sanitizer_cmsghdr { - unsigned cmsg_len; - int cmsg_level; - int cmsg_type; - }; - - struct __sanitizer_dirent { +struct __sanitizer_shmid_ds { + __sanitizer_ipc_perm shm_perm; + unsigned long shm_segsz; + unsigned int shm_lpid; + unsigned int shm_cpid; + int shm_nattch; + __sanitizer_time_t shm_atime; + __sanitizer_time_t shm_dtime; + __sanitizer_time_t shm_ctime; +}; + +extern unsigned struct_msqid_ds_sz; +extern unsigned struct_mq_attr_sz; +extern unsigned struct_timeb_sz; +extern unsigned struct_statvfs_sz; + +struct __sanitizer_iovec { + void *iov_base; + uptr iov_len; +}; + +struct __sanitizer_ifaddrs { + struct __sanitizer_ifaddrs *ifa_next; + char *ifa_name; + unsigned int ifa_flags; + void *ifa_addr; // (struct sockaddr *) + void *ifa_netmask; // (struct sockaddr *) +# undef ifa_dstaddr + void *ifa_dstaddr; // (struct sockaddr *) + void *ifa_data; +}; + +typedef unsigned __sanitizer_pthread_key_t; + +struct __sanitizer_passwd { + char *pw_name; + char *pw_passwd; + int pw_uid; + int pw_gid; + __sanitizer_time_t pw_change; + char *pw_class; + char *pw_gecos; + char *pw_dir; + char *pw_shell; + __sanitizer_time_t pw_expire; + int pw_fields; +}; + +struct __sanitizer_group { + char *gr_name; + char *gr_passwd; + int gr_gid; + char **gr_mem; +}; + +typedef long __sanitizer_suseconds_t; + +struct __sanitizer_timeval { + __sanitizer_time_t tv_sec; + __sanitizer_suseconds_t tv_usec; +}; + +struct __sanitizer_itimerval { + struct __sanitizer_timeval it_interval; + struct __sanitizer_timeval it_value; +}; + +struct __sanitizer_timeb { + __sanitizer_time_t time; + unsigned short millitm; + short timezone; + short dstflag; +}; + +struct __sanitizer_ether_addr { + u8 octet[6]; +}; + +struct __sanitizer_tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + long int tm_gmtoff; + const char *tm_zone; +}; + +struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + unsigned msg_iovlen; + void *msg_control; + unsigned msg_controllen; + int msg_flags; +}; + +struct __sanitizer_cmsghdr { + unsigned cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct __sanitizer_dirent { #if defined(__INO64) - unsigned long long d_fileno; - unsigned long long d_off; + unsigned long long d_fileno; + unsigned long long d_off; #else - unsigned int d_fileno; + unsigned int d_fileno; #endif - unsigned short d_reclen; - // more fields that we don't care about - }; + unsigned short d_reclen; + // more fields that we don't care about +}; // 'clock_t' is 32 bits wide on x64 FreeBSD - typedef int __sanitizer_clock_t; - typedef int __sanitizer_clockid_t; +typedef int __sanitizer_clock_t; +typedef int __sanitizer_clockid_t; -#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__)\ - || defined(__mips__) - typedef unsigned __sanitizer___kernel_uid_t; - typedef unsigned __sanitizer___kernel_gid_t; +#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \ + defined(__mips__) +typedef unsigned __sanitizer___kernel_uid_t; +typedef unsigned __sanitizer___kernel_gid_t; #else - typedef unsigned short __sanitizer___kernel_uid_t; - typedef unsigned short __sanitizer___kernel_gid_t; +typedef unsigned short __sanitizer___kernel_uid_t; +typedef unsigned short __sanitizer___kernel_gid_t; #endif - typedef long long __sanitizer___kernel_off_t; +typedef long long __sanitizer___kernel_off_t; #if defined(__powerpc__) || defined(__mips__) - typedef unsigned int __sanitizer___kernel_old_uid_t; - typedef unsigned int __sanitizer___kernel_old_gid_t; +typedef unsigned int __sanitizer___kernel_old_uid_t; +typedef unsigned int __sanitizer___kernel_old_gid_t; #else - typedef unsigned short __sanitizer___kernel_old_uid_t; - typedef unsigned short __sanitizer___kernel_old_gid_t; +typedef unsigned short __sanitizer___kernel_old_uid_t; +typedef unsigned short __sanitizer___kernel_old_gid_t; #endif - typedef long long __sanitizer___kernel_loff_t; - typedef struct { - unsigned long fds_bits[1024 / (8 * sizeof(long))]; - } __sanitizer___kernel_fd_set; - - // This thing depends on the platform. We are only interested in the upper - // limit. Verified with a compiler assert in .cpp. - const int pthread_attr_t_max_sz = 128; - union __sanitizer_pthread_attr_t { - char size[pthread_attr_t_max_sz]; // NOLINT - void *align; - }; - - const unsigned old_sigset_t_sz = sizeof(unsigned long); - - struct __sanitizer_sigset_t { - // uint32_t * 4 - unsigned int __bits[4]; - }; - - typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t; - - struct __sanitizer_siginfo { - // The size is determined by looking at sizeof of real siginfo_t on linux. - u64 opaque[128 / sizeof(u64)]; - }; - - using __sanitizer_sighandler_ptr = void (*)(int sig); - using __sanitizer_sigactionhandler_ptr = - void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx); - - struct __sanitizer_sigaction { - union { - __sanitizer_sigactionhandler_ptr sigaction; - __sanitizer_sighandler_ptr handler; - }; - int sa_flags; - __sanitizer_sigset_t sa_mask; - }; - - struct __sanitizer_sem_t { - u32 data[4]; - }; - - extern const uptr sig_ign; - extern const uptr sig_dfl; - extern const uptr sig_err; - extern const uptr sa_siginfo; - - extern int af_inet; - extern int af_inet6; - uptr __sanitizer_in_addr_sz(int af); - - struct __sanitizer_dl_phdr_info { - uptr dlpi_addr; - const char *dlpi_name; - const void *dlpi_phdr; - short dlpi_phnum; - }; - - extern unsigned struct_ElfW_Phdr_sz; - - struct __sanitizer_addrinfo { - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - unsigned ai_addrlen; - char *ai_canonname; - void *ai_addr; - struct __sanitizer_addrinfo *ai_next; - }; - - struct __sanitizer_hostent { - char *h_name; - char **h_aliases; - int h_addrtype; - int h_length; - char **h_addr_list; - }; - - struct __sanitizer_pollfd { - int fd; - short events; - short revents; - }; - - typedef unsigned __sanitizer_nfds_t; - - struct __sanitizer_glob_t { - uptr gl_pathc; - uptr gl_matchc; - uptr gl_offs; - int gl_flags; - char **gl_pathv; - int (*gl_errfunc)(const char*, int); - void (*gl_closedir)(void *dirp); - struct dirent *(*gl_readdir)(void *dirp); - void *(*gl_opendir)(const char*); - int (*gl_lstat)(const char*, void* /* struct stat* */); - int (*gl_stat)(const char*, void* /* struct stat* */); - }; - - extern int glob_nomatch; - extern int glob_altdirfunc; - - extern unsigned path_max; - - struct __sanitizer_wordexp_t { - uptr we_wordc; - char **we_wordv; - uptr we_offs; - char *we_strings; - uptr we_nbytes; - }; - - typedef void __sanitizer_FILE; - - extern unsigned struct_shminfo_sz; - extern unsigned struct_shm_info_sz; - extern int shmctl_ipc_stat; - extern int shmctl_ipc_info; - extern int shmctl_shm_info; - extern int shmctl_shm_stat; - - extern unsigned struct_utmpx_sz; - - extern int map_fixed; - - // ioctl arguments - struct __sanitizer_ifconf { - int ifc_len; - union { - void *ifcu_req; - } ifc_ifcu; +typedef long long __sanitizer___kernel_loff_t; +typedef struct { + unsigned long fds_bits[1024 / (8 * sizeof(long))]; +} __sanitizer___kernel_fd_set; + +// This thing depends on the platform. We are only interested in the upper +// limit. Verified with a compiler assert in .cpp. +union __sanitizer_pthread_attr_t { + char size[128]; + void *align; +}; + +const unsigned old_sigset_t_sz = sizeof(unsigned long); + +struct __sanitizer_sigset_t { + // uint32_t * 4 + unsigned int __bits[4]; +}; + +typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t; + +struct __sanitizer_siginfo { + // The size is determined by looking at sizeof of real siginfo_t on linux. + u64 opaque[128 / sizeof(u64)]; +}; + +using __sanitizer_sighandler_ptr = void (*)(int sig); +using __sanitizer_sigactionhandler_ptr = void (*)(int sig, + __sanitizer_siginfo *siginfo, + void *uctx); + +struct __sanitizer_sigaction { + union { + __sanitizer_sigactionhandler_ptr sigaction; + __sanitizer_sighandler_ptr handler; }; + int sa_flags; + __sanitizer_sigset_t sa_mask; +}; + +struct __sanitizer_sem_t { + u32 data[4]; +}; + +extern const uptr sig_ign; +extern const uptr sig_dfl; +extern const uptr sig_err; +extern const uptr sa_siginfo; + +extern int af_inet; +extern int af_inet6; +uptr __sanitizer_in_addr_sz(int af); + +struct __sanitizer_dl_phdr_info { + uptr dlpi_addr; + const char *dlpi_name; + const void *dlpi_phdr; + short dlpi_phnum; +}; + +extern unsigned struct_ElfW_Phdr_sz; + +struct __sanitizer_addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + unsigned ai_addrlen; + char *ai_canonname; + void *ai_addr; + struct __sanitizer_addrinfo *ai_next; +}; + +struct __sanitizer_hostent { + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; +}; + +struct __sanitizer_pollfd { + int fd; + short events; + short revents; +}; + +typedef unsigned __sanitizer_nfds_t; + +struct __sanitizer_glob_t { + uptr gl_pathc; + uptr gl_matchc; + uptr gl_offs; + int gl_flags; + char **gl_pathv; + int (*gl_errfunc)(const char *, int); + void (*gl_closedir)(void *dirp); + struct dirent *(*gl_readdir)(void *dirp); + void *(*gl_opendir)(const char *); + int (*gl_lstat)(const char *, void * /* struct stat* */); + int (*gl_stat)(const char *, void * /* struct stat* */); +}; + +extern int glob_nomatch; +extern int glob_altdirfunc; + +extern unsigned path_max; + +struct __sanitizer_wordexp_t { + uptr we_wordc; + char **we_wordv; + uptr we_offs; + char *we_strings; + uptr we_nbytes; +}; + +typedef void __sanitizer_FILE; + +extern unsigned struct_shminfo_sz; +extern unsigned struct_shm_info_sz; +extern int shmctl_ipc_stat; +extern int shmctl_ipc_info; +extern int shmctl_shm_info; +extern int shmctl_shm_stat; + +extern unsigned struct_utmpx_sz; + +extern int map_fixed; + +// ioctl arguments +struct __sanitizer_ifconf { + int ifc_len; + union { + void *ifcu_req; + } ifc_ifcu; +}; #define IOC_NRBITS 8 #define IOC_TYPEBITS 8 @@ -432,204 +432,204 @@ namespace __sanitizer { #define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK) #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK) - extern unsigned struct_ifreq_sz; - extern unsigned struct_termios_sz; - extern unsigned struct_winsize_sz; - - extern unsigned struct_copr_buffer_sz; - extern unsigned struct_copr_debug_buf_sz; - extern unsigned struct_copr_msg_sz; - extern unsigned struct_midi_info_sz; - extern unsigned struct_mtget_sz; - extern unsigned struct_mtop_sz; - extern unsigned struct_rtentry_sz; - extern unsigned struct_sbi_instrument_sz; - extern unsigned struct_seq_event_rec_sz; - extern unsigned struct_synth_info_sz; - extern unsigned struct_vt_mode_sz; - - extern const unsigned long __sanitizer_bufsiz; - extern unsigned struct_audio_buf_info_sz; - extern unsigned struct_ppp_stats_sz; - extern unsigned struct_sioc_sg_req_sz; - extern unsigned struct_sioc_vif_req_sz; - - // ioctl request identifiers - - // A special value to mark ioctls that are not present on the target platform, - // when it can not be determined without including any system headers. - extern const unsigned IOCTL_NOT_PRESENT; - - extern unsigned IOCTL_FIOASYNC; - extern unsigned IOCTL_FIOCLEX; - extern unsigned IOCTL_FIOGETOWN; - extern unsigned IOCTL_FIONBIO; - extern unsigned IOCTL_FIONCLEX; - extern unsigned IOCTL_FIOSETOWN; - extern unsigned IOCTL_SIOCADDMULTI; - extern unsigned IOCTL_SIOCATMARK; - extern unsigned IOCTL_SIOCDELMULTI; - extern unsigned IOCTL_SIOCGIFADDR; - extern unsigned IOCTL_SIOCGIFBRDADDR; - extern unsigned IOCTL_SIOCGIFCONF; - extern unsigned IOCTL_SIOCGIFDSTADDR; - extern unsigned IOCTL_SIOCGIFFLAGS; - extern unsigned IOCTL_SIOCGIFMETRIC; - extern unsigned IOCTL_SIOCGIFMTU; - extern unsigned IOCTL_SIOCGIFNETMASK; - extern unsigned IOCTL_SIOCGPGRP; - extern unsigned IOCTL_SIOCSIFADDR; - extern unsigned IOCTL_SIOCSIFBRDADDR; - extern unsigned IOCTL_SIOCSIFDSTADDR; - extern unsigned IOCTL_SIOCSIFFLAGS; - extern unsigned IOCTL_SIOCSIFMETRIC; - extern unsigned IOCTL_SIOCSIFMTU; - extern unsigned IOCTL_SIOCSIFNETMASK; - extern unsigned IOCTL_SIOCSPGRP; - extern unsigned IOCTL_TIOCCONS; - extern unsigned IOCTL_TIOCEXCL; - extern unsigned IOCTL_TIOCGETD; - extern unsigned IOCTL_TIOCGPGRP; - extern unsigned IOCTL_TIOCGWINSZ; - extern unsigned IOCTL_TIOCMBIC; - extern unsigned IOCTL_TIOCMBIS; - extern unsigned IOCTL_TIOCMGET; - extern unsigned IOCTL_TIOCMSET; - extern unsigned IOCTL_TIOCNOTTY; - extern unsigned IOCTL_TIOCNXCL; - extern unsigned IOCTL_TIOCOUTQ; - extern unsigned IOCTL_TIOCPKT; - extern unsigned IOCTL_TIOCSCTTY; - extern unsigned IOCTL_TIOCSETD; - extern unsigned IOCTL_TIOCSPGRP; - extern unsigned IOCTL_TIOCSTI; - extern unsigned IOCTL_TIOCSWINSZ; - extern unsigned IOCTL_SIOCGETSGCNT; - extern unsigned IOCTL_SIOCGETVIFCNT; - extern unsigned IOCTL_MTIOCGET; - extern unsigned IOCTL_MTIOCTOP; - extern unsigned IOCTL_SIOCADDRT; - extern unsigned IOCTL_SIOCDELRT; - extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE; - extern unsigned IOCTL_SNDCTL_DSP_GETFMTS; - extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK; - extern unsigned IOCTL_SNDCTL_DSP_POST; - extern unsigned IOCTL_SNDCTL_DSP_RESET; - extern unsigned IOCTL_SNDCTL_DSP_SETFMT; - extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT; - extern unsigned IOCTL_SNDCTL_DSP_SPEED; - extern unsigned IOCTL_SNDCTL_DSP_STEREO; - extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE; - extern unsigned IOCTL_SNDCTL_DSP_SYNC; - extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE; - extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR; - extern unsigned IOCTL_SNDCTL_MIDI_INFO; - extern unsigned IOCTL_SNDCTL_MIDI_PRETIME; - extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE; - extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT; - extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT; - extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS; - extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS; - extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND; - extern unsigned IOCTL_SNDCTL_SEQ_PANIC; - extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE; - extern unsigned IOCTL_SNDCTL_SEQ_RESET; - extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES; - extern unsigned IOCTL_SNDCTL_SEQ_SYNC; - extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI; - extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD; - extern unsigned IOCTL_SNDCTL_SYNTH_INFO; - extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL; - extern unsigned IOCTL_SNDCTL_TMR_CONTINUE; - extern unsigned IOCTL_SNDCTL_TMR_METRONOME; - extern unsigned IOCTL_SNDCTL_TMR_SELECT; - extern unsigned IOCTL_SNDCTL_TMR_SOURCE; - extern unsigned IOCTL_SNDCTL_TMR_START; - extern unsigned IOCTL_SNDCTL_TMR_STOP; - extern unsigned IOCTL_SNDCTL_TMR_TEMPO; - extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE; - extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM; - extern unsigned IOCTL_SOUND_MIXER_READ_BASS; - extern unsigned IOCTL_SOUND_MIXER_READ_CAPS; - extern unsigned IOCTL_SOUND_MIXER_READ_CD; - extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK; - extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE; - extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN; - extern unsigned IOCTL_SOUND_MIXER_READ_IMIX; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE1; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE2; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE3; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE; - extern unsigned IOCTL_SOUND_MIXER_READ_LOUD; - extern unsigned IOCTL_SOUND_MIXER_READ_MIC; - extern unsigned IOCTL_SOUND_MIXER_READ_MUTE; - extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN; - extern unsigned IOCTL_SOUND_MIXER_READ_PCM; - extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV; - extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK; - extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC; - extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER; - extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS; - extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH; - extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE; - extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME; - extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM; - extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS; - extern unsigned IOCTL_SOUND_MIXER_WRITE_CD; - extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN; - extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD; - extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC; - extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN; - extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM; - extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV; - extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC; - extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER; - extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH; - extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME; - extern unsigned IOCTL_SOUND_PCM_READ_BITS; - extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS; - extern unsigned IOCTL_SOUND_PCM_READ_FILTER; - extern unsigned IOCTL_SOUND_PCM_READ_RATE; - extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS; - extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER; - extern unsigned IOCTL_VT_ACTIVATE; - extern unsigned IOCTL_VT_GETMODE; - extern unsigned IOCTL_VT_OPENQRY; - extern unsigned IOCTL_VT_RELDISP; - extern unsigned IOCTL_VT_SETMODE; - extern unsigned IOCTL_VT_WAITACTIVE; - extern unsigned IOCTL_GIO_SCRNMAP; - extern unsigned IOCTL_KDDISABIO; - extern unsigned IOCTL_KDENABIO; - extern unsigned IOCTL_KDGETLED; - extern unsigned IOCTL_KDGETMODE; - extern unsigned IOCTL_KDGKBMODE; - extern unsigned IOCTL_KDGKBTYPE; - extern unsigned IOCTL_KDMKTONE; - extern unsigned IOCTL_KDSETLED; - extern unsigned IOCTL_KDSETMODE; - extern unsigned IOCTL_KDSKBMODE; - - extern const int si_SEGV_MAPERR; - extern const int si_SEGV_ACCERR; - - struct __sanitizer_cap_rights { - u64 cr_rights[2]; - }; - - typedef struct __sanitizer_cap_rights __sanitizer_cap_rights_t; - extern unsigned struct_cap_rights_sz; - - extern unsigned struct_fstab_sz; - extern unsigned struct_StringList_sz; +extern unsigned struct_ifreq_sz; +extern unsigned struct_termios_sz; +extern unsigned struct_winsize_sz; + +extern unsigned struct_copr_buffer_sz; +extern unsigned struct_copr_debug_buf_sz; +extern unsigned struct_copr_msg_sz; +extern unsigned struct_midi_info_sz; +extern unsigned struct_mtget_sz; +extern unsigned struct_mtop_sz; +extern unsigned struct_rtentry_sz; +extern unsigned struct_sbi_instrument_sz; +extern unsigned struct_seq_event_rec_sz; +extern unsigned struct_synth_info_sz; +extern unsigned struct_vt_mode_sz; + +extern const unsigned long __sanitizer_bufsiz; +extern unsigned struct_audio_buf_info_sz; +extern unsigned struct_ppp_stats_sz; +extern unsigned struct_sioc_sg_req_sz; +extern unsigned struct_sioc_vif_req_sz; + +// ioctl request identifiers + +// A special value to mark ioctls that are not present on the target platform, +// when it can not be determined without including any system headers. +extern const unsigned IOCTL_NOT_PRESENT; + +extern unsigned IOCTL_FIOASYNC; +extern unsigned IOCTL_FIOCLEX; +extern unsigned IOCTL_FIOGETOWN; +extern unsigned IOCTL_FIONBIO; +extern unsigned IOCTL_FIONCLEX; +extern unsigned IOCTL_FIOSETOWN; +extern unsigned IOCTL_SIOCADDMULTI; +extern unsigned IOCTL_SIOCATMARK; +extern unsigned IOCTL_SIOCDELMULTI; +extern unsigned IOCTL_SIOCGIFADDR; +extern unsigned IOCTL_SIOCGIFBRDADDR; +extern unsigned IOCTL_SIOCGIFCONF; +extern unsigned IOCTL_SIOCGIFDSTADDR; +extern unsigned IOCTL_SIOCGIFFLAGS; +extern unsigned IOCTL_SIOCGIFMETRIC; +extern unsigned IOCTL_SIOCGIFMTU; +extern unsigned IOCTL_SIOCGIFNETMASK; +extern unsigned IOCTL_SIOCGPGRP; +extern unsigned IOCTL_SIOCSIFADDR; +extern unsigned IOCTL_SIOCSIFBRDADDR; +extern unsigned IOCTL_SIOCSIFDSTADDR; +extern unsigned IOCTL_SIOCSIFFLAGS; +extern unsigned IOCTL_SIOCSIFMETRIC; +extern unsigned IOCTL_SIOCSIFMTU; +extern unsigned IOCTL_SIOCSIFNETMASK; +extern unsigned IOCTL_SIOCSPGRP; +extern unsigned IOCTL_TIOCCONS; +extern unsigned IOCTL_TIOCEXCL; +extern unsigned IOCTL_TIOCGETD; +extern unsigned IOCTL_TIOCGPGRP; +extern unsigned IOCTL_TIOCGWINSZ; +extern unsigned IOCTL_TIOCMBIC; +extern unsigned IOCTL_TIOCMBIS; +extern unsigned IOCTL_TIOCMGET; +extern unsigned IOCTL_TIOCMSET; +extern unsigned IOCTL_TIOCNOTTY; +extern unsigned IOCTL_TIOCNXCL; +extern unsigned IOCTL_TIOCOUTQ; +extern unsigned IOCTL_TIOCPKT; +extern unsigned IOCTL_TIOCSCTTY; +extern unsigned IOCTL_TIOCSETD; +extern unsigned IOCTL_TIOCSPGRP; +extern unsigned IOCTL_TIOCSTI; +extern unsigned IOCTL_TIOCSWINSZ; +extern unsigned IOCTL_SIOCGETSGCNT; +extern unsigned IOCTL_SIOCGETVIFCNT; +extern unsigned IOCTL_MTIOCGET; +extern unsigned IOCTL_MTIOCTOP; +extern unsigned IOCTL_SIOCADDRT; +extern unsigned IOCTL_SIOCDELRT; +extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE; +extern unsigned IOCTL_SNDCTL_DSP_GETFMTS; +extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK; +extern unsigned IOCTL_SNDCTL_DSP_POST; +extern unsigned IOCTL_SNDCTL_DSP_RESET; +extern unsigned IOCTL_SNDCTL_DSP_SETFMT; +extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT; +extern unsigned IOCTL_SNDCTL_DSP_SPEED; +extern unsigned IOCTL_SNDCTL_DSP_STEREO; +extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE; +extern unsigned IOCTL_SNDCTL_DSP_SYNC; +extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE; +extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR; +extern unsigned IOCTL_SNDCTL_MIDI_INFO; +extern unsigned IOCTL_SNDCTL_MIDI_PRETIME; +extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE; +extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT; +extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT; +extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS; +extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS; +extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND; +extern unsigned IOCTL_SNDCTL_SEQ_PANIC; +extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE; +extern unsigned IOCTL_SNDCTL_SEQ_RESET; +extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES; +extern unsigned IOCTL_SNDCTL_SEQ_SYNC; +extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI; +extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD; +extern unsigned IOCTL_SNDCTL_SYNTH_INFO; +extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL; +extern unsigned IOCTL_SNDCTL_TMR_CONTINUE; +extern unsigned IOCTL_SNDCTL_TMR_METRONOME; +extern unsigned IOCTL_SNDCTL_TMR_SELECT; +extern unsigned IOCTL_SNDCTL_TMR_SOURCE; +extern unsigned IOCTL_SNDCTL_TMR_START; +extern unsigned IOCTL_SNDCTL_TMR_STOP; +extern unsigned IOCTL_SNDCTL_TMR_TEMPO; +extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE; +extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM; +extern unsigned IOCTL_SOUND_MIXER_READ_BASS; +extern unsigned IOCTL_SOUND_MIXER_READ_CAPS; +extern unsigned IOCTL_SOUND_MIXER_READ_CD; +extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK; +extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE; +extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN; +extern unsigned IOCTL_SOUND_MIXER_READ_IMIX; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE1; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE2; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE3; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE; +extern unsigned IOCTL_SOUND_MIXER_READ_LOUD; +extern unsigned IOCTL_SOUND_MIXER_READ_MIC; +extern unsigned IOCTL_SOUND_MIXER_READ_MUTE; +extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN; +extern unsigned IOCTL_SOUND_MIXER_READ_PCM; +extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV; +extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK; +extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC; +extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER; +extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS; +extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH; +extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE; +extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME; +extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM; +extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS; +extern unsigned IOCTL_SOUND_MIXER_WRITE_CD; +extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN; +extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD; +extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC; +extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN; +extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM; +extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV; +extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC; +extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER; +extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH; +extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME; +extern unsigned IOCTL_SOUND_PCM_READ_BITS; +extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS; +extern unsigned IOCTL_SOUND_PCM_READ_FILTER; +extern unsigned IOCTL_SOUND_PCM_READ_RATE; +extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS; +extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER; +extern unsigned IOCTL_VT_ACTIVATE; +extern unsigned IOCTL_VT_GETMODE; +extern unsigned IOCTL_VT_OPENQRY; +extern unsigned IOCTL_VT_RELDISP; +extern unsigned IOCTL_VT_SETMODE; +extern unsigned IOCTL_VT_WAITACTIVE; +extern unsigned IOCTL_GIO_SCRNMAP; +extern unsigned IOCTL_KDDISABIO; +extern unsigned IOCTL_KDENABIO; +extern unsigned IOCTL_KDGETLED; +extern unsigned IOCTL_KDGETMODE; +extern unsigned IOCTL_KDGKBMODE; +extern unsigned IOCTL_KDGKBTYPE; +extern unsigned IOCTL_KDMKTONE; +extern unsigned IOCTL_KDSETLED; +extern unsigned IOCTL_KDSETMODE; +extern unsigned IOCTL_KDSKBMODE; + +extern const int si_SEGV_MAPERR; +extern const int si_SEGV_ACCERR; + +struct __sanitizer_cap_rights { + u64 cr_rights[2]; +}; + +typedef struct __sanitizer_cap_rights __sanitizer_cap_rights_t; +extern unsigned struct_cap_rights_sz; + +extern unsigned struct_fstab_sz; +extern unsigned struct_StringList_sz; } // namespace __sanitizer #define CHECK_TYPE_SIZE(TYPE) \ diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp index 7c1a21d6ccb..842bc789f47 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp @@ -26,12 +26,9 @@ // With old kernels (and even new kernels on powerpc) asm/stat.h uses types that // are not defined anywhere in userspace headers. Fake them. This seems to work -// fine with newer headers, too. Beware that with , struct stat -// takes the form of struct stat64 on 32-bit platforms if _FILE_OFFSET_BITS=64. -// Also, for some platforms (e.g. mips) there are additional members in the -// struct stat:s. +// fine with newer headers, too. #include -#if defined(__x86_64__) +#if defined(__x86_64__) || defined(__mips__) #include #else #define ino_t __kernel_ino_t diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp index 1e3c7feff8b..9852e6ba787 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp @@ -22,6 +22,10 @@ #ifdef _FILE_OFFSET_BITS #undef _FILE_OFFSET_BITS #endif + +// Must go after undef _FILE_OFFSET_BITS. +#include "sanitizer_glibc_version.h" + #include #include #include @@ -136,6 +140,7 @@ typedef struct user_fpregs elf_fpregset_t; #include #include #include +#include #endif // SANITIZER_LINUX && !SANITIZER_ANDROID #if SANITIZER_ANDROID @@ -236,6 +241,7 @@ namespace __sanitizer { unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT; unsigned struct_rlimit64_sz = sizeof(struct rlimit64); unsigned struct_statvfs64_sz = sizeof(struct statvfs64); + unsigned struct_crypt_data_sz = sizeof(struct crypt_data); #endif // SANITIZER_LINUX && !SANITIZER_ANDROID #if SANITIZER_LINUX && !SANITIZER_ANDROID @@ -1005,10 +1011,6 @@ CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len); CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level); CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type); -#ifndef __GLIBC_PREREQ -#define __GLIBC_PREREQ(x, y) 0 -#endif - #if SANITIZER_LINUX && (__ANDROID_API__ >= 21 || __GLIBC_PREREQ (2, 14)) CHECK_TYPE_SIZE(mmsghdr); CHECK_SIZE_AND_OFFSET(mmsghdr, msg_hdr); @@ -1129,9 +1131,8 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, cgid); #if (!defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21)) && \ !defined(__arm__) /* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */ -/* On Arm glibc 2.31 and later provide a different mode field, this field is - never used by libsanitizer so we can simply ignore this assert for all glibc - versions. */ +/* On Arm newer glibc provide a different mode field, it's hard to detect + so just disable the check. */ CHECK_SIZE_AND_OFFSET(ipc_perm, mode); #endif diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h index f2d4812059b..db2c4f07b3a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h @@ -19,844 +19,846 @@ #include "sanitizer_internal_defs.h" #include "sanitizer_platform.h" -# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle)) - -#ifndef __GLIBC_PREREQ -#define __GLIBC_PREREQ(x, y) 0 +#if defined(__sparc__) +// FIXME: This can't be included from tsan which does not support sparc yet. +#include "sanitizer_glibc_version.h" #endif +# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle)) + namespace __sanitizer { - extern unsigned struct_utsname_sz; - extern unsigned struct_stat_sz; +extern unsigned struct_utsname_sz; +extern unsigned struct_stat_sz; #if !SANITIZER_IOS - extern unsigned struct_stat64_sz; -#endif - extern unsigned struct_rusage_sz; - extern unsigned siginfo_t_sz; - extern unsigned struct_itimerval_sz; - extern unsigned pthread_t_sz; - extern unsigned pthread_mutex_t_sz; - extern unsigned pthread_cond_t_sz; - extern unsigned pid_t_sz; - extern unsigned timeval_sz; - extern unsigned uid_t_sz; - extern unsigned gid_t_sz; - extern unsigned mbstate_t_sz; - extern unsigned struct_timezone_sz; - extern unsigned struct_tms_sz; - extern unsigned struct_itimerspec_sz; - extern unsigned struct_sigevent_sz; - extern unsigned struct_sched_param_sz; - extern unsigned struct_statfs64_sz; - extern unsigned struct_regex_sz; - extern unsigned struct_regmatch_sz; +extern unsigned struct_stat64_sz; +#endif +extern unsigned struct_rusage_sz; +extern unsigned siginfo_t_sz; +extern unsigned struct_itimerval_sz; +extern unsigned pthread_t_sz; +extern unsigned pthread_mutex_t_sz; +extern unsigned pthread_cond_t_sz; +extern unsigned pid_t_sz; +extern unsigned timeval_sz; +extern unsigned uid_t_sz; +extern unsigned gid_t_sz; +extern unsigned mbstate_t_sz; +extern unsigned struct_timezone_sz; +extern unsigned struct_tms_sz; +extern unsigned struct_itimerspec_sz; +extern unsigned struct_sigevent_sz; +extern unsigned struct_sched_param_sz; +extern unsigned struct_statfs64_sz; +extern unsigned struct_regex_sz; +extern unsigned struct_regmatch_sz; #if !SANITIZER_ANDROID - extern unsigned struct_fstab_sz; - extern unsigned struct_statfs_sz; - extern unsigned struct_sockaddr_sz; - extern unsigned ucontext_t_sz; +extern unsigned struct_fstab_sz; +extern unsigned struct_statfs_sz; +extern unsigned struct_sockaddr_sz; +extern unsigned ucontext_t_sz; #endif // !SANITIZER_ANDROID #if SANITIZER_LINUX #if defined(__x86_64__) - const unsigned struct_kernel_stat_sz = 144; - const unsigned struct_kernel_stat64_sz = 0; +const unsigned struct_kernel_stat_sz = 144; +const unsigned struct_kernel_stat64_sz = 0; #elif defined(__i386__) - const unsigned struct_kernel_stat_sz = 64; - const unsigned struct_kernel_stat64_sz = 96; +const unsigned struct_kernel_stat_sz = 64; +const unsigned struct_kernel_stat64_sz = 96; #elif defined(__arm__) - const unsigned struct_kernel_stat_sz = 64; - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = 64; +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__aarch64__) - const unsigned struct_kernel_stat_sz = 128; - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = 128; +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__powerpc__) && !defined(__powerpc64__) - const unsigned struct_kernel_stat_sz = 72; - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = 72; +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__powerpc64__) - const unsigned struct_kernel_stat_sz = 144; - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = 144; +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__mips__) - const unsigned struct_kernel_stat_sz = - SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) : - FIRST_32_SECOND_64(144, 216); - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = SANITIZER_ANDROID + ? FIRST_32_SECOND_64(104, 128) + : FIRST_32_SECOND_64(160, 216); +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__s390__) && !defined(__s390x__) - const unsigned struct_kernel_stat_sz = 64; - const unsigned struct_kernel_stat64_sz = 104; +const unsigned struct_kernel_stat_sz = 64; +const unsigned struct_kernel_stat64_sz = 104; #elif defined(__s390x__) - const unsigned struct_kernel_stat_sz = 144; - const unsigned struct_kernel_stat64_sz = 0; +const unsigned struct_kernel_stat_sz = 144; +const unsigned struct_kernel_stat64_sz = 0; #elif defined(__sparc__) && defined(__arch64__) - const unsigned struct___old_kernel_stat_sz = 0; - const unsigned struct_kernel_stat_sz = 104; - const unsigned struct_kernel_stat64_sz = 144; +const unsigned struct___old_kernel_stat_sz = 0; +const unsigned struct_kernel_stat_sz = 104; +const unsigned struct_kernel_stat64_sz = 144; #elif defined(__sparc__) && !defined(__arch64__) - const unsigned struct___old_kernel_stat_sz = 0; - const unsigned struct_kernel_stat_sz = 64; - const unsigned struct_kernel_stat64_sz = 104; -#endif - struct __sanitizer_perf_event_attr { - unsigned type; - unsigned size; - // More fields that vary with the kernel version. - }; +const unsigned struct___old_kernel_stat_sz = 0; +const unsigned struct_kernel_stat_sz = 64; +const unsigned struct_kernel_stat64_sz = 104; +#endif +struct __sanitizer_perf_event_attr { + unsigned type; + unsigned size; + // More fields that vary with the kernel version. +}; - extern unsigned struct_epoll_event_sz; - extern unsigned struct_sysinfo_sz; - extern unsigned __user_cap_header_struct_sz; - extern unsigned __user_cap_data_struct_sz; - extern unsigned struct_new_utsname_sz; - extern unsigned struct_old_utsname_sz; - extern unsigned struct_oldold_utsname_sz; +extern unsigned struct_epoll_event_sz; +extern unsigned struct_sysinfo_sz; +extern unsigned __user_cap_header_struct_sz; +extern unsigned __user_cap_data_struct_sz; +extern unsigned struct_new_utsname_sz; +extern unsigned struct_old_utsname_sz; +extern unsigned struct_oldold_utsname_sz; - const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long); +const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long); #endif // SANITIZER_LINUX #if SANITIZER_LINUX #if defined(__powerpc64__) || defined(__s390__) - const unsigned struct___old_kernel_stat_sz = 0; +const unsigned struct___old_kernel_stat_sz = 0; #elif !defined(__sparc__) - const unsigned struct___old_kernel_stat_sz = 32; -#endif - - extern unsigned struct_rlimit_sz; - extern unsigned struct_utimbuf_sz; - extern unsigned struct_timespec_sz; - - struct __sanitizer_iocb { - u64 aio_data; - u32 aio_key_or_aio_reserved1; // Simply crazy. - u32 aio_reserved1_or_aio_key; // Luckily, we don't need these. - u16 aio_lio_opcode; - s16 aio_reqprio; - u32 aio_fildes; - u64 aio_buf; - u64 aio_nbytes; - s64 aio_offset; - u64 aio_reserved2; - u64 aio_reserved3; - }; +const unsigned struct___old_kernel_stat_sz = 32; +#endif - struct __sanitizer_io_event { - u64 data; - u64 obj; - u64 res; - u64 res2; - }; +extern unsigned struct_rlimit_sz; +extern unsigned struct_utimbuf_sz; +extern unsigned struct_timespec_sz; + +struct __sanitizer_iocb { + u64 aio_data; + u32 aio_key_or_aio_reserved1; // Simply crazy. + u32 aio_reserved1_or_aio_key; // Luckily, we don't need these. + u16 aio_lio_opcode; + s16 aio_reqprio; + u32 aio_fildes; + u64 aio_buf; + u64 aio_nbytes; + s64 aio_offset; + u64 aio_reserved2; + u64 aio_reserved3; +}; - const unsigned iocb_cmd_pread = 0; - const unsigned iocb_cmd_pwrite = 1; - const unsigned iocb_cmd_preadv = 7; - const unsigned iocb_cmd_pwritev = 8; - - struct __sanitizer___sysctl_args { - int *name; - int nlen; - void *oldval; - uptr *oldlenp; - void *newval; - uptr newlen; - unsigned long ___unused[4]; - }; +struct __sanitizer_io_event { + u64 data; + u64 obj; + u64 res; + u64 res2; +}; - const unsigned old_sigset_t_sz = sizeof(unsigned long); +const unsigned iocb_cmd_pread = 0; +const unsigned iocb_cmd_pwrite = 1; +const unsigned iocb_cmd_preadv = 7; +const unsigned iocb_cmd_pwritev = 8; + +struct __sanitizer___sysctl_args { + int *name; + int nlen; + void *oldval; + uptr *oldlenp; + void *newval; + uptr newlen; + unsigned long ___unused[4]; +}; - struct __sanitizer_sem_t { +const unsigned old_sigset_t_sz = sizeof(unsigned long); + +struct __sanitizer_sem_t { #if SANITIZER_ANDROID && defined(_LP64) - int data[4]; + int data[4]; #elif SANITIZER_ANDROID && !defined(_LP64) - int data; + int data; #elif SANITIZER_LINUX - uptr data[4]; + uptr data[4]; #endif - }; +}; #endif // SANITIZER_LINUX #if SANITIZER_ANDROID - struct __sanitizer_struct_mallinfo { - uptr v[10]; - }; +struct __sanitizer_struct_mallinfo { + uptr v[10]; +}; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID - struct __sanitizer_struct_mallinfo { - int v[10]; - }; +struct __sanitizer_struct_mallinfo { + int v[10]; +}; - extern unsigned struct_ustat_sz; - extern unsigned struct_rlimit64_sz; - extern unsigned struct_statvfs64_sz; +extern unsigned struct_ustat_sz; +extern unsigned struct_rlimit64_sz; +extern unsigned struct_statvfs64_sz; - struct __sanitizer_ipc_perm { - int __key; - int uid; - int gid; - int cuid; - int cgid; +struct __sanitizer_ipc_perm { + int __key; + int uid; + int gid; + int cuid; + int cgid; #ifdef __powerpc__ - unsigned mode; - unsigned __seq; - u64 __unused1; - u64 __unused2; + unsigned mode; + unsigned __seq; + u64 __unused1; + u64 __unused2; #elif defined(__sparc__) #if defined(__arch64__) - unsigned mode; - unsigned short __pad1; + unsigned mode; + unsigned short __pad1; #else - unsigned short __pad1; - unsigned short mode; - unsigned short __pad2; + unsigned short __pad1; + unsigned short mode; + unsigned short __pad2; #endif - unsigned short __seq; - unsigned long long __unused1; - unsigned long long __unused2; + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; #elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__) - unsigned int mode; - unsigned short __seq; - unsigned short __pad1; - unsigned long __unused1; - unsigned long __unused2; + unsigned int mode; + unsigned short __seq; + unsigned short __pad1; + unsigned long __unused1; + unsigned long __unused2; #else - unsigned short mode; - unsigned short __pad1; - unsigned short __seq; - unsigned short __pad2; + unsigned short mode; + unsigned short __pad1; + unsigned short __seq; + unsigned short __pad2; #if defined(__x86_64__) && !defined(_LP64) - u64 __unused1; - u64 __unused2; + u64 __unused1; + u64 __unused2; #else - unsigned long __unused1; - unsigned long __unused2; + unsigned long __unused1; + unsigned long __unused2; #endif #endif - }; +}; - struct __sanitizer_shmid_ds { - __sanitizer_ipc_perm shm_perm; - #if defined(__sparc__) - #if !defined(__arch64__) - u32 __pad1; - #endif - long shm_atime; - #if !defined(__arch64__) - u32 __pad2; - #endif - long shm_dtime; - #if !defined(__arch64__) - u32 __pad3; - #endif - long shm_ctime; - uptr shm_segsz; - int shm_cpid; - int shm_lpid; - unsigned long shm_nattch; - unsigned long __glibc_reserved1; - unsigned long __glibc_reserved2; - #else - #ifndef __powerpc__ - uptr shm_segsz; - #elif !defined(__powerpc64__) - uptr __unused0; - #endif - #if defined(__x86_64__) && !defined(_LP64) - u64 shm_atime; - u64 shm_dtime; - u64 shm_ctime; - #else - uptr shm_atime; - #if !defined(_LP64) && !defined(__mips__) - uptr __unused1; - #endif - uptr shm_dtime; - #if !defined(_LP64) && !defined(__mips__) - uptr __unused2; - #endif - uptr shm_ctime; - #if !defined(_LP64) && !defined(__mips__) - uptr __unused3; - #endif - #endif - #ifdef __powerpc__ - uptr shm_segsz; - #endif - int shm_cpid; - int shm_lpid; - #if defined(__x86_64__) && !defined(_LP64) - u64 shm_nattch; - u64 __unused4; - u64 __unused5; - #else - uptr shm_nattch; - uptr __unused4; - uptr __unused5; - #endif +struct __sanitizer_shmid_ds { + __sanitizer_ipc_perm shm_perm; +#if defined(__sparc__) +#if !defined(__arch64__) + u32 __pad1; #endif - }; + long shm_atime; +#if !defined(__arch64__) + u32 __pad2; +#endif + long shm_dtime; +#if !defined(__arch64__) + u32 __pad3; +#endif + long shm_ctime; + uptr shm_segsz; + int shm_cpid; + int shm_lpid; + unsigned long shm_nattch; + unsigned long __glibc_reserved1; + unsigned long __glibc_reserved2; +#else +#ifndef __powerpc__ + uptr shm_segsz; +#elif !defined(__powerpc64__) + uptr __unused0; +#endif +#if defined(__x86_64__) && !defined(_LP64) + u64 shm_atime; + u64 shm_dtime; + u64 shm_ctime; +#else + uptr shm_atime; +#if !defined(_LP64) && !defined(__mips__) + uptr __unused1; +#endif + uptr shm_dtime; +#if !defined(_LP64) && !defined(__mips__) + uptr __unused2; +#endif + uptr shm_ctime; +#if !defined(_LP64) && !defined(__mips__) + uptr __unused3; +#endif +#endif +#ifdef __powerpc__ + uptr shm_segsz; +#endif + int shm_cpid; + int shm_lpid; +#if defined(__x86_64__) && !defined(_LP64) + u64 shm_nattch; + u64 __unused4; + u64 __unused5; +#else + uptr shm_nattch; + uptr __unused4; + uptr __unused5; +#endif +#endif +}; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned struct_msqid_ds_sz; - extern unsigned struct_mq_attr_sz; - extern unsigned struct_timex_sz; - extern unsigned struct_statvfs_sz; +extern unsigned struct_msqid_ds_sz; +extern unsigned struct_mq_attr_sz; +extern unsigned struct_timex_sz; +extern unsigned struct_statvfs_sz; +extern unsigned struct_crypt_data_sz; #endif // SANITIZER_LINUX && !SANITIZER_ANDROID - struct __sanitizer_iovec { - void *iov_base; - uptr iov_len; - }; +struct __sanitizer_iovec { + void *iov_base; + uptr iov_len; +}; #if !SANITIZER_ANDROID - struct __sanitizer_ifaddrs { - struct __sanitizer_ifaddrs *ifa_next; - char *ifa_name; - unsigned int ifa_flags; - void *ifa_addr; // (struct sockaddr *) - void *ifa_netmask; // (struct sockaddr *) - // This is a union on Linux. +struct __sanitizer_ifaddrs { + struct __sanitizer_ifaddrs *ifa_next; + char *ifa_name; + unsigned int ifa_flags; + void *ifa_addr; // (struct sockaddr *) + void *ifa_netmask; // (struct sockaddr *) + // This is a union on Linux. # ifdef ifa_dstaddr # undef ifa_dstaddr # endif - void *ifa_dstaddr; // (struct sockaddr *) - void *ifa_data; - }; + void *ifa_dstaddr; // (struct sockaddr *) + void *ifa_data; +}; #endif // !SANITIZER_ANDROID #if SANITIZER_MAC - typedef unsigned long __sanitizer_pthread_key_t; +typedef unsigned long __sanitizer_pthread_key_t; #else - typedef unsigned __sanitizer_pthread_key_t; +typedef unsigned __sanitizer_pthread_key_t; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID - struct __sanitizer_XDR { - int x_op; - void *x_ops; - uptr x_public; - uptr x_private; - uptr x_base; - unsigned x_handy; - }; +struct __sanitizer_XDR { + int x_op; + void *x_ops; + uptr x_public; + uptr x_private; + uptr x_base; + unsigned x_handy; +}; - const int __sanitizer_XDR_ENCODE = 0; - const int __sanitizer_XDR_DECODE = 1; - const int __sanitizer_XDR_FREE = 2; +const int __sanitizer_XDR_ENCODE = 0; +const int __sanitizer_XDR_DECODE = 1; +const int __sanitizer_XDR_FREE = 2; #endif - struct __sanitizer_passwd { - char *pw_name; - char *pw_passwd; - int pw_uid; - int pw_gid; +struct __sanitizer_passwd { + char *pw_name; + char *pw_passwd; + int pw_uid; + int pw_gid; #if SANITIZER_MAC - long pw_change; - char *pw_class; + long pw_change; + char *pw_class; #endif #if !(SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)) - char *pw_gecos; + char *pw_gecos; #endif - char *pw_dir; - char *pw_shell; + char *pw_dir; + char *pw_shell; #if SANITIZER_MAC - long pw_expire; + long pw_expire; #endif - }; +}; - struct __sanitizer_group { - char *gr_name; - char *gr_passwd; - int gr_gid; - char **gr_mem; - }; +struct __sanitizer_group { + char *gr_name; + char *gr_passwd; + int gr_gid; + char **gr_mem; +}; #if defined(__x86_64__) && !defined(_LP64) - typedef long long __sanitizer_time_t; +typedef long long __sanitizer_time_t; #else - typedef long __sanitizer_time_t; +typedef long __sanitizer_time_t; #endif - typedef long __sanitizer_suseconds_t; +typedef long __sanitizer_suseconds_t; - struct __sanitizer_timeval { - __sanitizer_time_t tv_sec; - __sanitizer_suseconds_t tv_usec; - }; +struct __sanitizer_timeval { + __sanitizer_time_t tv_sec; + __sanitizer_suseconds_t tv_usec; +}; - struct __sanitizer_itimerval { - struct __sanitizer_timeval it_interval; - struct __sanitizer_timeval it_value; - }; +struct __sanitizer_itimerval { + struct __sanitizer_timeval it_interval; + struct __sanitizer_timeval it_value; +}; - struct __sanitizer_timeb { - __sanitizer_time_t time; - unsigned short millitm; - short timezone; - short dstflag; - }; +struct __sanitizer_timeb { + __sanitizer_time_t time; + unsigned short millitm; + short timezone; + short dstflag; +}; - struct __sanitizer_ether_addr { - u8 octet[6]; - }; +struct __sanitizer_ether_addr { + u8 octet[6]; +}; - struct __sanitizer_tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - long int tm_gmtoff; - const char *tm_zone; - }; +struct __sanitizer_tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + long int tm_gmtoff; + const char *tm_zone; +}; #if SANITIZER_LINUX - struct __sanitizer_mntent { - char *mnt_fsname; - char *mnt_dir; - char *mnt_type; - char *mnt_opts; - int mnt_freq; - int mnt_passno; - }; +struct __sanitizer_mntent { + char *mnt_fsname; + char *mnt_dir; + char *mnt_type; + char *mnt_opts; + int mnt_freq; + int mnt_passno; +}; - struct __sanitizer_file_handle { - unsigned int handle_bytes; - int handle_type; - unsigned char f_handle[1]; // variable sized - }; +struct __sanitizer_file_handle { + unsigned int handle_bytes; + int handle_type; + unsigned char f_handle[1]; // variable sized +}; #endif #if SANITIZER_MAC - struct __sanitizer_msghdr { - void *msg_name; - unsigned msg_namelen; - struct __sanitizer_iovec *msg_iov; - unsigned msg_iovlen; - void *msg_control; - unsigned msg_controllen; - int msg_flags; - }; - struct __sanitizer_cmsghdr { - unsigned cmsg_len; - int cmsg_level; - int cmsg_type; - }; +struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + unsigned msg_iovlen; + void *msg_control; + unsigned msg_controllen; + int msg_flags; +}; +struct __sanitizer_cmsghdr { + unsigned cmsg_len; + int cmsg_level; + int cmsg_type; +}; #else - struct __sanitizer_msghdr { - void *msg_name; - unsigned msg_namelen; - struct __sanitizer_iovec *msg_iov; - uptr msg_iovlen; - void *msg_control; - uptr msg_controllen; - int msg_flags; - }; - struct __sanitizer_cmsghdr { - uptr cmsg_len; - int cmsg_level; - int cmsg_type; - }; +struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + uptr msg_iovlen; + void *msg_control; + uptr msg_controllen; + int msg_flags; +}; +struct __sanitizer_cmsghdr { + uptr cmsg_len; + int cmsg_level; + int cmsg_type; +}; #endif #if SANITIZER_LINUX - struct __sanitizer_mmsghdr { - __sanitizer_msghdr msg_hdr; - unsigned int msg_len; - }; +struct __sanitizer_mmsghdr { + __sanitizer_msghdr msg_hdr; + unsigned int msg_len; +}; #endif #if SANITIZER_MAC - struct __sanitizer_dirent { - unsigned long long d_ino; - unsigned long long d_seekoff; - unsigned short d_reclen; - // more fields that we don't care about - }; +struct __sanitizer_dirent { + unsigned long long d_ino; + unsigned long long d_seekoff; + unsigned short d_reclen; + // more fields that we don't care about +}; #elif SANITIZER_ANDROID || defined(__x86_64__) - struct __sanitizer_dirent { - unsigned long long d_ino; - unsigned long long d_off; - unsigned short d_reclen; - // more fields that we don't care about - }; +struct __sanitizer_dirent { + unsigned long long d_ino; + unsigned long long d_off; + unsigned short d_reclen; + // more fields that we don't care about +}; #else - struct __sanitizer_dirent { - uptr d_ino; - uptr d_off; - unsigned short d_reclen; - // more fields that we don't care about - }; +struct __sanitizer_dirent { + uptr d_ino; + uptr d_off; + unsigned short d_reclen; + // more fields that we don't care about +}; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID - struct __sanitizer_dirent64 { - unsigned long long d_ino; - unsigned long long d_off; - unsigned short d_reclen; - // more fields that we don't care about - }; +struct __sanitizer_dirent64 { + unsigned long long d_ino; + unsigned long long d_off; + unsigned short d_reclen; + // more fields that we don't care about +}; #endif #if defined(__x86_64__) && !defined(_LP64) - typedef long long __sanitizer_clock_t; +typedef long long __sanitizer_clock_t; #else - typedef long __sanitizer_clock_t; +typedef long __sanitizer_clock_t; #endif #if SANITIZER_LINUX - typedef int __sanitizer_clockid_t; +typedef int __sanitizer_clockid_t; #endif #if SANITIZER_LINUX -#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__)\ - || defined(__mips__) - typedef unsigned __sanitizer___kernel_uid_t; - typedef unsigned __sanitizer___kernel_gid_t; +#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \ + defined(__mips__) +typedef unsigned __sanitizer___kernel_uid_t; +typedef unsigned __sanitizer___kernel_gid_t; #else - typedef unsigned short __sanitizer___kernel_uid_t; - typedef unsigned short __sanitizer___kernel_gid_t; +typedef unsigned short __sanitizer___kernel_uid_t; +typedef unsigned short __sanitizer___kernel_gid_t; #endif #if defined(__x86_64__) && !defined(_LP64) - typedef long long __sanitizer___kernel_off_t; +typedef long long __sanitizer___kernel_off_t; #else - typedef long __sanitizer___kernel_off_t; +typedef long __sanitizer___kernel_off_t; #endif #if defined(__powerpc__) || defined(__mips__) - typedef unsigned int __sanitizer___kernel_old_uid_t; - typedef unsigned int __sanitizer___kernel_old_gid_t; +typedef unsigned int __sanitizer___kernel_old_uid_t; +typedef unsigned int __sanitizer___kernel_old_gid_t; #else - typedef unsigned short __sanitizer___kernel_old_uid_t; - typedef unsigned short __sanitizer___kernel_old_gid_t; +typedef unsigned short __sanitizer___kernel_old_uid_t; +typedef unsigned short __sanitizer___kernel_old_gid_t; #endif - typedef long long __sanitizer___kernel_loff_t; - typedef struct { - unsigned long fds_bits[1024 / (8 * sizeof(long))]; - } __sanitizer___kernel_fd_set; +typedef long long __sanitizer___kernel_loff_t; +typedef struct { + unsigned long fds_bits[1024 / (8 * sizeof(long))]; +} __sanitizer___kernel_fd_set; #endif - // This thing depends on the platform. We are only interested in the upper - // limit. Verified with a compiler assert in .cpp. - const int pthread_attr_t_max_sz = 128; - union __sanitizer_pthread_attr_t { - char size[pthread_attr_t_max_sz]; // NOLINT - void *align; - }; +// This thing depends on the platform. We are only interested in the upper +// limit. Verified with a compiler assert in .cpp. +union __sanitizer_pthread_attr_t { + char size[128]; + void *align; +}; #if SANITIZER_ANDROID # if SANITIZER_MIPS - typedef unsigned long __sanitizer_sigset_t[16/sizeof(unsigned long)]; +typedef unsigned long __sanitizer_sigset_t[16 / sizeof(unsigned long)]; # else - typedef unsigned long __sanitizer_sigset_t; +typedef unsigned long __sanitizer_sigset_t; # endif #elif SANITIZER_MAC - typedef unsigned __sanitizer_sigset_t; +typedef unsigned __sanitizer_sigset_t; #elif SANITIZER_LINUX - struct __sanitizer_sigset_t { - // The size is determined by looking at sizeof of real sigset_t on linux. - uptr val[128 / sizeof(uptr)]; - }; +struct __sanitizer_sigset_t { + // The size is determined by looking at sizeof of real sigset_t on linux. + uptr val[128 / sizeof(uptr)]; +}; #endif - struct __sanitizer_siginfo { - // The size is determined by looking at sizeof of real siginfo_t on linux. - u64 opaque[128 / sizeof(u64)]; - }; +struct __sanitizer_siginfo { + // The size is determined by looking at sizeof of real siginfo_t on linux. + u64 opaque[128 / sizeof(u64)]; +}; - using __sanitizer_sighandler_ptr = void (*)(int sig); - using __sanitizer_sigactionhandler_ptr = - void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx); +using __sanitizer_sighandler_ptr = void (*)(int sig); +using __sanitizer_sigactionhandler_ptr = void (*)(int sig, + __sanitizer_siginfo *siginfo, + void *uctx); - // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros. +// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros. #if SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 64) - struct __sanitizer_sigaction { - unsigned sa_flags; - union { - __sanitizer_sigactionhandler_ptr sigaction; - __sanitizer_sighandler_ptr handler; - }; - __sanitizer_sigset_t sa_mask; - void (*sa_restorer)(); +struct __sanitizer_sigaction { + unsigned sa_flags; + union { + __sanitizer_sigactionhandler_ptr sigaction; + __sanitizer_sighandler_ptr handler; }; + __sanitizer_sigset_t sa_mask; + void (*sa_restorer)(); +}; #elif SANITIZER_ANDROID && SANITIZER_MIPS32 // check this before WORDSIZE == 32 - struct __sanitizer_sigaction { - unsigned sa_flags; - union { - __sanitizer_sigactionhandler_ptr sigaction; - __sanitizer_sighandler_ptr handler; - }; - __sanitizer_sigset_t sa_mask; +struct __sanitizer_sigaction { + unsigned sa_flags; + union { + __sanitizer_sigactionhandler_ptr sigaction; + __sanitizer_sighandler_ptr handler; }; + __sanitizer_sigset_t sa_mask; +}; #elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32) - struct __sanitizer_sigaction { - union { - __sanitizer_sigactionhandler_ptr sigaction; - __sanitizer_sighandler_ptr handler; - }; - __sanitizer_sigset_t sa_mask; - uptr sa_flags; - void (*sa_restorer)(); +struct __sanitizer_sigaction { + union { + __sanitizer_sigactionhandler_ptr sigaction; + __sanitizer_sighandler_ptr handler; }; + __sanitizer_sigset_t sa_mask; + uptr sa_flags; + void (*sa_restorer)(); +}; #else // !SANITIZER_ANDROID - struct __sanitizer_sigaction { +struct __sanitizer_sigaction { #if defined(__mips__) && !SANITIZER_FREEBSD - unsigned int sa_flags; + unsigned int sa_flags; #endif - union { - __sanitizer_sigactionhandler_ptr sigaction; - __sanitizer_sighandler_ptr handler; - }; + union { + __sanitizer_sigactionhandler_ptr sigaction; + __sanitizer_sighandler_ptr handler; + }; #if SANITIZER_FREEBSD - int sa_flags; - __sanitizer_sigset_t sa_mask; + int sa_flags; + __sanitizer_sigset_t sa_mask; #else #if defined(__s390x__) - int sa_resv; + int sa_resv; #else - __sanitizer_sigset_t sa_mask; + __sanitizer_sigset_t sa_mask; #endif #ifndef __mips__ #if defined(__sparc__) #if __GLIBC_PREREQ (2, 20) - // On sparc glibc 2.19 and earlier sa_flags was unsigned long. + // On sparc glibc 2.19 and earlier sa_flags was unsigned long. #if defined(__arch64__) - // To maintain ABI compatibility on sparc64 when switching to an int, - // __glibc_reserved0 was added. - int __glibc_reserved0; + // To maintain ABI compatibility on sparc64 when switching to an int, + // __glibc_reserved0 was added. + int __glibc_reserved0; #endif - int sa_flags; + int sa_flags; #else - unsigned long sa_flags; + unsigned long sa_flags; #endif #else - int sa_flags; + int sa_flags; #endif #endif #endif #if SANITIZER_LINUX - void (*sa_restorer)(); + void (*sa_restorer)(); #endif #if defined(__mips__) && (SANITIZER_WORDSIZE == 32) - int sa_resv[1]; + int sa_resv[1]; #endif #if defined(__s390x__) - __sanitizer_sigset_t sa_mask; + __sanitizer_sigset_t sa_mask; #endif - }; +}; #endif // !SANITIZER_ANDROID #if defined(__mips__) - struct __sanitizer_kernel_sigset_t { - uptr sig[2]; - }; +struct __sanitizer_kernel_sigset_t { + uptr sig[2]; +}; #else - struct __sanitizer_kernel_sigset_t { - u8 sig[8]; - }; +struct __sanitizer_kernel_sigset_t { + u8 sig[8]; +}; #endif - // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros. +// Linux system headers define the 'sa_handler' and 'sa_sigaction' macros. #if SANITIZER_MIPS - struct __sanitizer_kernel_sigaction_t { - unsigned int sa_flags; - union { - void (*handler)(int signo); - void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); - }; - __sanitizer_kernel_sigset_t sa_mask; - void (*sa_restorer)(void); +struct __sanitizer_kernel_sigaction_t { + unsigned int sa_flags; + union { + void (*handler)(int signo); + void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); }; + __sanitizer_kernel_sigset_t sa_mask; + void (*sa_restorer)(void); +}; #else - struct __sanitizer_kernel_sigaction_t { - union { - void (*handler)(int signo); - void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); - }; - unsigned long sa_flags; - void (*sa_restorer)(void); - __sanitizer_kernel_sigset_t sa_mask; +struct __sanitizer_kernel_sigaction_t { + union { + void (*handler)(int signo); + void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); }; + unsigned long sa_flags; + void (*sa_restorer)(void); + __sanitizer_kernel_sigset_t sa_mask; +}; #endif - extern const uptr sig_ign; - extern const uptr sig_dfl; - extern const uptr sig_err; - extern const uptr sa_siginfo; +extern const uptr sig_ign; +extern const uptr sig_dfl; +extern const uptr sig_err; +extern const uptr sa_siginfo; #if SANITIZER_LINUX - extern int e_tabsz; +extern int e_tabsz; #endif - extern int af_inet; - extern int af_inet6; - uptr __sanitizer_in_addr_sz(int af); +extern int af_inet; +extern int af_inet6; +uptr __sanitizer_in_addr_sz(int af); #if SANITIZER_LINUX - struct __sanitizer_dl_phdr_info { - uptr dlpi_addr; - const char *dlpi_name; - const void *dlpi_phdr; - short dlpi_phnum; - }; +struct __sanitizer_dl_phdr_info { + uptr dlpi_addr; + const char *dlpi_name; + const void *dlpi_phdr; + short dlpi_phnum; +}; - extern unsigned struct_ElfW_Phdr_sz; +extern unsigned struct_ElfW_Phdr_sz; #endif - struct __sanitizer_addrinfo { - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; +struct __sanitizer_addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; #if SANITIZER_ANDROID || SANITIZER_MAC - unsigned ai_addrlen; - char *ai_canonname; - void *ai_addr; + unsigned ai_addrlen; + char *ai_canonname; + void *ai_addr; #else // LINUX - unsigned ai_addrlen; - void *ai_addr; - char *ai_canonname; + unsigned ai_addrlen; + void *ai_addr; + char *ai_canonname; #endif - struct __sanitizer_addrinfo *ai_next; - }; + struct __sanitizer_addrinfo *ai_next; +}; - struct __sanitizer_hostent { - char *h_name; - char **h_aliases; - int h_addrtype; - int h_length; - char **h_addr_list; - }; +struct __sanitizer_hostent { + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; +}; - struct __sanitizer_pollfd { - int fd; - short events; - short revents; - }; +struct __sanitizer_pollfd { + int fd; + short events; + short revents; +}; #if SANITIZER_ANDROID || SANITIZER_MAC - typedef unsigned __sanitizer_nfds_t; +typedef unsigned __sanitizer_nfds_t; #else - typedef unsigned long __sanitizer_nfds_t; +typedef unsigned long __sanitizer_nfds_t; #endif #if !SANITIZER_ANDROID # if SANITIZER_LINUX - struct __sanitizer_glob_t { - uptr gl_pathc; - char **gl_pathv; - uptr gl_offs; - int gl_flags; - - void (*gl_closedir)(void *dirp); - void *(*gl_readdir)(void *dirp); - void *(*gl_opendir)(const char *); - int (*gl_lstat)(const char *, void *); - int (*gl_stat)(const char *, void *); - }; +struct __sanitizer_glob_t { + uptr gl_pathc; + char **gl_pathv; + uptr gl_offs; + int gl_flags; + + void (*gl_closedir)(void *dirp); + void *(*gl_readdir)(void *dirp); + void *(*gl_opendir)(const char *); + int (*gl_lstat)(const char *, void *); + int (*gl_stat)(const char *, void *); +}; # endif // SANITIZER_LINUX # if SANITIZER_LINUX - extern int glob_nomatch; - extern int glob_altdirfunc; +extern int glob_nomatch; +extern int glob_altdirfunc; # endif #endif // !SANITIZER_ANDROID - extern unsigned path_max; +extern unsigned path_max; - struct __sanitizer_wordexp_t { - uptr we_wordc; - char **we_wordv; - uptr we_offs; - }; +struct __sanitizer_wordexp_t { + uptr we_wordc; + char **we_wordv; + uptr we_offs; +}; #if SANITIZER_LINUX && !SANITIZER_ANDROID - struct __sanitizer_FILE { - int _flags; - char *_IO_read_ptr; - char *_IO_read_end; - char *_IO_read_base; - char *_IO_write_base; - char *_IO_write_ptr; - char *_IO_write_end; - char *_IO_buf_base; - char *_IO_buf_end; - char *_IO_save_base; - char *_IO_backup_base; - char *_IO_save_end; - void *_markers; - __sanitizer_FILE *_chain; - int _fileno; - }; +struct __sanitizer_FILE { + int _flags; + char *_IO_read_ptr; + char *_IO_read_end; + char *_IO_read_base; + char *_IO_write_base; + char *_IO_write_ptr; + char *_IO_write_end; + char *_IO_buf_base; + char *_IO_buf_end; + char *_IO_save_base; + char *_IO_backup_base; + char *_IO_save_end; + void *_markers; + __sanitizer_FILE *_chain; + int _fileno; +}; # define SANITIZER_HAS_STRUCT_FILE 1 #else - typedef void __sanitizer_FILE; +typedef void __sanitizer_FILE; # define SANITIZER_HAS_STRUCT_FILE 0 #endif -#if SANITIZER_LINUX && !SANITIZER_ANDROID && \ - (defined(__i386) || defined(__x86_64) || defined(__mips64) || \ - defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \ - defined(__s390__)) - extern unsigned struct_user_regs_struct_sz; - extern unsigned struct_user_fpregs_struct_sz; - extern unsigned struct_user_fpxregs_struct_sz; - extern unsigned struct_user_vfpregs_struct_sz; - - extern int ptrace_peektext; - extern int ptrace_peekdata; - extern int ptrace_peekuser; - extern int ptrace_getregs; - extern int ptrace_setregs; - extern int ptrace_getfpregs; - extern int ptrace_setfpregs; - extern int ptrace_getfpxregs; - extern int ptrace_setfpxregs; - extern int ptrace_getvfpregs; - extern int ptrace_setvfpregs; - extern int ptrace_getsiginfo; - extern int ptrace_setsiginfo; - extern int ptrace_getregset; - extern int ptrace_setregset; - extern int ptrace_geteventmsg; +#if SANITIZER_LINUX && !SANITIZER_ANDROID && \ + (defined(__i386) || defined(__x86_64) || defined(__mips64) || \ + defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \ + defined(__s390__)) +extern unsigned struct_user_regs_struct_sz; +extern unsigned struct_user_fpregs_struct_sz; +extern unsigned struct_user_fpxregs_struct_sz; +extern unsigned struct_user_vfpregs_struct_sz; + +extern int ptrace_peektext; +extern int ptrace_peekdata; +extern int ptrace_peekuser; +extern int ptrace_getregs; +extern int ptrace_setregs; +extern int ptrace_getfpregs; +extern int ptrace_setfpregs; +extern int ptrace_getfpxregs; +extern int ptrace_setfpxregs; +extern int ptrace_getvfpregs; +extern int ptrace_setvfpregs; +extern int ptrace_getsiginfo; +extern int ptrace_setsiginfo; +extern int ptrace_getregset; +extern int ptrace_setregset; +extern int ptrace_geteventmsg; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned struct_shminfo_sz; - extern unsigned struct_shm_info_sz; - extern int shmctl_ipc_stat; - extern int shmctl_ipc_info; - extern int shmctl_shm_info; - extern int shmctl_shm_stat; +extern unsigned struct_shminfo_sz; +extern unsigned struct_shm_info_sz; +extern int shmctl_ipc_stat; +extern int shmctl_ipc_info; +extern int shmctl_shm_info; +extern int shmctl_shm_stat; #endif #if !SANITIZER_MAC && !SANITIZER_FREEBSD - extern unsigned struct_utmp_sz; +extern unsigned struct_utmp_sz; #endif #if !SANITIZER_ANDROID - extern unsigned struct_utmpx_sz; +extern unsigned struct_utmpx_sz; #endif - extern int map_fixed; +extern int map_fixed; - // ioctl arguments - struct __sanitizer_ifconf { - int ifc_len; - union { - void *ifcu_req; - } ifc_ifcu; +// ioctl arguments +struct __sanitizer_ifconf { + int ifc_len; + union { + void *ifcu_req; + } ifc_ifcu; #if SANITIZER_MAC - } __attribute__((packed)); +} __attribute__((packed)); #else - }; +}; #endif #if SANITIZER_LINUX && !SANITIZER_ANDROID @@ -932,519 +934,519 @@ struct __sanitizer_cookie_io_functions_t { #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK) #endif - extern unsigned struct_ifreq_sz; - extern unsigned struct_termios_sz; - extern unsigned struct_winsize_sz; +extern unsigned struct_ifreq_sz; +extern unsigned struct_termios_sz; +extern unsigned struct_winsize_sz; #if SANITIZER_LINUX - extern unsigned struct_arpreq_sz; - extern unsigned struct_cdrom_msf_sz; - extern unsigned struct_cdrom_multisession_sz; - extern unsigned struct_cdrom_read_audio_sz; - extern unsigned struct_cdrom_subchnl_sz; - extern unsigned struct_cdrom_ti_sz; - extern unsigned struct_cdrom_tocentry_sz; - extern unsigned struct_cdrom_tochdr_sz; - extern unsigned struct_cdrom_volctrl_sz; - extern unsigned struct_ff_effect_sz; - extern unsigned struct_floppy_drive_params_sz; - extern unsigned struct_floppy_drive_struct_sz; - extern unsigned struct_floppy_fdc_state_sz; - extern unsigned struct_floppy_max_errors_sz; - extern unsigned struct_floppy_raw_cmd_sz; - extern unsigned struct_floppy_struct_sz; - extern unsigned struct_floppy_write_errors_sz; - extern unsigned struct_format_descr_sz; - extern unsigned struct_hd_driveid_sz; - extern unsigned struct_hd_geometry_sz; - extern unsigned struct_input_absinfo_sz; - extern unsigned struct_input_id_sz; - extern unsigned struct_mtpos_sz; - extern unsigned struct_termio_sz; - extern unsigned struct_vt_consize_sz; - extern unsigned struct_vt_sizes_sz; - extern unsigned struct_vt_stat_sz; +extern unsigned struct_arpreq_sz; +extern unsigned struct_cdrom_msf_sz; +extern unsigned struct_cdrom_multisession_sz; +extern unsigned struct_cdrom_read_audio_sz; +extern unsigned struct_cdrom_subchnl_sz; +extern unsigned struct_cdrom_ti_sz; +extern unsigned struct_cdrom_tocentry_sz; +extern unsigned struct_cdrom_tochdr_sz; +extern unsigned struct_cdrom_volctrl_sz; +extern unsigned struct_ff_effect_sz; +extern unsigned struct_floppy_drive_params_sz; +extern unsigned struct_floppy_drive_struct_sz; +extern unsigned struct_floppy_fdc_state_sz; +extern unsigned struct_floppy_max_errors_sz; +extern unsigned struct_floppy_raw_cmd_sz; +extern unsigned struct_floppy_struct_sz; +extern unsigned struct_floppy_write_errors_sz; +extern unsigned struct_format_descr_sz; +extern unsigned struct_hd_driveid_sz; +extern unsigned struct_hd_geometry_sz; +extern unsigned struct_input_absinfo_sz; +extern unsigned struct_input_id_sz; +extern unsigned struct_mtpos_sz; +extern unsigned struct_termio_sz; +extern unsigned struct_vt_consize_sz; +extern unsigned struct_vt_sizes_sz; +extern unsigned struct_vt_stat_sz; #endif // SANITIZER_LINUX #if SANITIZER_LINUX - extern unsigned struct_copr_buffer_sz; - extern unsigned struct_copr_debug_buf_sz; - extern unsigned struct_copr_msg_sz; - extern unsigned struct_midi_info_sz; - extern unsigned struct_mtget_sz; - extern unsigned struct_mtop_sz; - extern unsigned struct_rtentry_sz; - extern unsigned struct_sbi_instrument_sz; - extern unsigned struct_seq_event_rec_sz; - extern unsigned struct_synth_info_sz; - extern unsigned struct_vt_mode_sz; +extern unsigned struct_copr_buffer_sz; +extern unsigned struct_copr_debug_buf_sz; +extern unsigned struct_copr_msg_sz; +extern unsigned struct_midi_info_sz; +extern unsigned struct_mtget_sz; +extern unsigned struct_mtop_sz; +extern unsigned struct_rtentry_sz; +extern unsigned struct_sbi_instrument_sz; +extern unsigned struct_seq_event_rec_sz; +extern unsigned struct_synth_info_sz; +extern unsigned struct_vt_mode_sz; #endif // SANITIZER_LINUX #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned struct_ax25_parms_struct_sz; - extern unsigned struct_cyclades_monitor_sz; - extern unsigned struct_input_keymap_entry_sz; - extern unsigned struct_ipx_config_data_sz; - extern unsigned struct_kbdiacrs_sz; - extern unsigned struct_kbentry_sz; - extern unsigned struct_kbkeycode_sz; - extern unsigned struct_kbsentry_sz; - extern unsigned struct_mtconfiginfo_sz; - extern unsigned struct_nr_parms_struct_sz; - extern unsigned struct_scc_modem_sz; - extern unsigned struct_scc_stat_sz; - extern unsigned struct_serial_multiport_struct_sz; - extern unsigned struct_serial_struct_sz; - extern unsigned struct_sockaddr_ax25_sz; - extern unsigned struct_unimapdesc_sz; - extern unsigned struct_unimapinit_sz; +extern unsigned struct_ax25_parms_struct_sz; +extern unsigned struct_cyclades_monitor_sz; +extern unsigned struct_input_keymap_entry_sz; +extern unsigned struct_ipx_config_data_sz; +extern unsigned struct_kbdiacrs_sz; +extern unsigned struct_kbentry_sz; +extern unsigned struct_kbkeycode_sz; +extern unsigned struct_kbsentry_sz; +extern unsigned struct_mtconfiginfo_sz; +extern unsigned struct_nr_parms_struct_sz; +extern unsigned struct_scc_modem_sz; +extern unsigned struct_scc_stat_sz; +extern unsigned struct_serial_multiport_struct_sz; +extern unsigned struct_serial_struct_sz; +extern unsigned struct_sockaddr_ax25_sz; +extern unsigned struct_unimapdesc_sz; +extern unsigned struct_unimapinit_sz; #endif // SANITIZER_LINUX && !SANITIZER_ANDROID - extern const unsigned long __sanitizer_bufsiz; +extern const unsigned long __sanitizer_bufsiz; #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned struct_audio_buf_info_sz; - extern unsigned struct_ppp_stats_sz; +extern unsigned struct_audio_buf_info_sz; +extern unsigned struct_ppp_stats_sz; #endif // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID #if !SANITIZER_ANDROID && !SANITIZER_MAC - extern unsigned struct_sioc_sg_req_sz; - extern unsigned struct_sioc_vif_req_sz; -#endif - - // ioctl request identifiers - - // A special value to mark ioctls that are not present on the target platform, - // when it can not be determined without including any system headers. - extern const unsigned IOCTL_NOT_PRESENT; - - extern unsigned IOCTL_FIOASYNC; - extern unsigned IOCTL_FIOCLEX; - extern unsigned IOCTL_FIOGETOWN; - extern unsigned IOCTL_FIONBIO; - extern unsigned IOCTL_FIONCLEX; - extern unsigned IOCTL_FIOSETOWN; - extern unsigned IOCTL_SIOCADDMULTI; - extern unsigned IOCTL_SIOCATMARK; - extern unsigned IOCTL_SIOCDELMULTI; - extern unsigned IOCTL_SIOCGIFADDR; - extern unsigned IOCTL_SIOCGIFBRDADDR; - extern unsigned IOCTL_SIOCGIFCONF; - extern unsigned IOCTL_SIOCGIFDSTADDR; - extern unsigned IOCTL_SIOCGIFFLAGS; - extern unsigned IOCTL_SIOCGIFMETRIC; - extern unsigned IOCTL_SIOCGIFMTU; - extern unsigned IOCTL_SIOCGIFNETMASK; - extern unsigned IOCTL_SIOCGPGRP; - extern unsigned IOCTL_SIOCSIFADDR; - extern unsigned IOCTL_SIOCSIFBRDADDR; - extern unsigned IOCTL_SIOCSIFDSTADDR; - extern unsigned IOCTL_SIOCSIFFLAGS; - extern unsigned IOCTL_SIOCSIFMETRIC; - extern unsigned IOCTL_SIOCSIFMTU; - extern unsigned IOCTL_SIOCSIFNETMASK; - extern unsigned IOCTL_SIOCSPGRP; - extern unsigned IOCTL_TIOCCONS; - extern unsigned IOCTL_TIOCEXCL; - extern unsigned IOCTL_TIOCGETD; - extern unsigned IOCTL_TIOCGPGRP; - extern unsigned IOCTL_TIOCGWINSZ; - extern unsigned IOCTL_TIOCMBIC; - extern unsigned IOCTL_TIOCMBIS; - extern unsigned IOCTL_TIOCMGET; - extern unsigned IOCTL_TIOCMSET; - extern unsigned IOCTL_TIOCNOTTY; - extern unsigned IOCTL_TIOCNXCL; - extern unsigned IOCTL_TIOCOUTQ; - extern unsigned IOCTL_TIOCPKT; - extern unsigned IOCTL_TIOCSCTTY; - extern unsigned IOCTL_TIOCSETD; - extern unsigned IOCTL_TIOCSPGRP; - extern unsigned IOCTL_TIOCSTI; - extern unsigned IOCTL_TIOCSWINSZ; +extern unsigned struct_sioc_sg_req_sz; +extern unsigned struct_sioc_vif_req_sz; +#endif + +// ioctl request identifiers + +// A special value to mark ioctls that are not present on the target platform, +// when it can not be determined without including any system headers. +extern const unsigned IOCTL_NOT_PRESENT; + +extern unsigned IOCTL_FIOASYNC; +extern unsigned IOCTL_FIOCLEX; +extern unsigned IOCTL_FIOGETOWN; +extern unsigned IOCTL_FIONBIO; +extern unsigned IOCTL_FIONCLEX; +extern unsigned IOCTL_FIOSETOWN; +extern unsigned IOCTL_SIOCADDMULTI; +extern unsigned IOCTL_SIOCATMARK; +extern unsigned IOCTL_SIOCDELMULTI; +extern unsigned IOCTL_SIOCGIFADDR; +extern unsigned IOCTL_SIOCGIFBRDADDR; +extern unsigned IOCTL_SIOCGIFCONF; +extern unsigned IOCTL_SIOCGIFDSTADDR; +extern unsigned IOCTL_SIOCGIFFLAGS; +extern unsigned IOCTL_SIOCGIFMETRIC; +extern unsigned IOCTL_SIOCGIFMTU; +extern unsigned IOCTL_SIOCGIFNETMASK; +extern unsigned IOCTL_SIOCGPGRP; +extern unsigned IOCTL_SIOCSIFADDR; +extern unsigned IOCTL_SIOCSIFBRDADDR; +extern unsigned IOCTL_SIOCSIFDSTADDR; +extern unsigned IOCTL_SIOCSIFFLAGS; +extern unsigned IOCTL_SIOCSIFMETRIC; +extern unsigned IOCTL_SIOCSIFMTU; +extern unsigned IOCTL_SIOCSIFNETMASK; +extern unsigned IOCTL_SIOCSPGRP; +extern unsigned IOCTL_TIOCCONS; +extern unsigned IOCTL_TIOCEXCL; +extern unsigned IOCTL_TIOCGETD; +extern unsigned IOCTL_TIOCGPGRP; +extern unsigned IOCTL_TIOCGWINSZ; +extern unsigned IOCTL_TIOCMBIC; +extern unsigned IOCTL_TIOCMBIS; +extern unsigned IOCTL_TIOCMGET; +extern unsigned IOCTL_TIOCMSET; +extern unsigned IOCTL_TIOCNOTTY; +extern unsigned IOCTL_TIOCNXCL; +extern unsigned IOCTL_TIOCOUTQ; +extern unsigned IOCTL_TIOCPKT; +extern unsigned IOCTL_TIOCSCTTY; +extern unsigned IOCTL_TIOCSETD; +extern unsigned IOCTL_TIOCSPGRP; +extern unsigned IOCTL_TIOCSTI; +extern unsigned IOCTL_TIOCSWINSZ; #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned IOCTL_SIOCGETSGCNT; - extern unsigned IOCTL_SIOCGETVIFCNT; +extern unsigned IOCTL_SIOCGETSGCNT; +extern unsigned IOCTL_SIOCGETVIFCNT; #endif #if SANITIZER_LINUX - extern unsigned IOCTL_EVIOCGABS; - extern unsigned IOCTL_EVIOCGBIT; - extern unsigned IOCTL_EVIOCGEFFECTS; - extern unsigned IOCTL_EVIOCGID; - extern unsigned IOCTL_EVIOCGKEY; - extern unsigned IOCTL_EVIOCGKEYCODE; - extern unsigned IOCTL_EVIOCGLED; - extern unsigned IOCTL_EVIOCGNAME; - extern unsigned IOCTL_EVIOCGPHYS; - extern unsigned IOCTL_EVIOCGRAB; - extern unsigned IOCTL_EVIOCGREP; - extern unsigned IOCTL_EVIOCGSND; - extern unsigned IOCTL_EVIOCGSW; - extern unsigned IOCTL_EVIOCGUNIQ; - extern unsigned IOCTL_EVIOCGVERSION; - extern unsigned IOCTL_EVIOCRMFF; - extern unsigned IOCTL_EVIOCSABS; - extern unsigned IOCTL_EVIOCSFF; - extern unsigned IOCTL_EVIOCSKEYCODE; - extern unsigned IOCTL_EVIOCSREP; - extern unsigned IOCTL_BLKFLSBUF; - extern unsigned IOCTL_BLKGETSIZE; - extern unsigned IOCTL_BLKRAGET; - extern unsigned IOCTL_BLKRASET; - extern unsigned IOCTL_BLKROGET; - extern unsigned IOCTL_BLKROSET; - extern unsigned IOCTL_BLKRRPART; - extern unsigned IOCTL_CDROMAUDIOBUFSIZ; - extern unsigned IOCTL_CDROMEJECT; - extern unsigned IOCTL_CDROMEJECT_SW; - extern unsigned IOCTL_CDROMMULTISESSION; - extern unsigned IOCTL_CDROMPAUSE; - extern unsigned IOCTL_CDROMPLAYMSF; - extern unsigned IOCTL_CDROMPLAYTRKIND; - extern unsigned IOCTL_CDROMREADAUDIO; - extern unsigned IOCTL_CDROMREADCOOKED; - extern unsigned IOCTL_CDROMREADMODE1; - extern unsigned IOCTL_CDROMREADMODE2; - extern unsigned IOCTL_CDROMREADRAW; - extern unsigned IOCTL_CDROMREADTOCENTRY; - extern unsigned IOCTL_CDROMREADTOCHDR; - extern unsigned IOCTL_CDROMRESET; - extern unsigned IOCTL_CDROMRESUME; - extern unsigned IOCTL_CDROMSEEK; - extern unsigned IOCTL_CDROMSTART; - extern unsigned IOCTL_CDROMSTOP; - extern unsigned IOCTL_CDROMSUBCHNL; - extern unsigned IOCTL_CDROMVOLCTRL; - extern unsigned IOCTL_CDROMVOLREAD; - extern unsigned IOCTL_CDROM_GET_UPC; - extern unsigned IOCTL_FDCLRPRM; - extern unsigned IOCTL_FDDEFPRM; - extern unsigned IOCTL_FDFLUSH; - extern unsigned IOCTL_FDFMTBEG; - extern unsigned IOCTL_FDFMTEND; - extern unsigned IOCTL_FDFMTTRK; - extern unsigned IOCTL_FDGETDRVPRM; - extern unsigned IOCTL_FDGETDRVSTAT; - extern unsigned IOCTL_FDGETDRVTYP; - extern unsigned IOCTL_FDGETFDCSTAT; - extern unsigned IOCTL_FDGETMAXERRS; - extern unsigned IOCTL_FDGETPRM; - extern unsigned IOCTL_FDMSGOFF; - extern unsigned IOCTL_FDMSGON; - extern unsigned IOCTL_FDPOLLDRVSTAT; - extern unsigned IOCTL_FDRAWCMD; - extern unsigned IOCTL_FDRESET; - extern unsigned IOCTL_FDSETDRVPRM; - extern unsigned IOCTL_FDSETEMSGTRESH; - extern unsigned IOCTL_FDSETMAXERRS; - extern unsigned IOCTL_FDSETPRM; - extern unsigned IOCTL_FDTWADDLE; - extern unsigned IOCTL_FDWERRORCLR; - extern unsigned IOCTL_FDWERRORGET; - extern unsigned IOCTL_HDIO_DRIVE_CMD; - extern unsigned IOCTL_HDIO_GETGEO; - extern unsigned IOCTL_HDIO_GET_32BIT; - extern unsigned IOCTL_HDIO_GET_DMA; - extern unsigned IOCTL_HDIO_GET_IDENTITY; - extern unsigned IOCTL_HDIO_GET_KEEPSETTINGS; - extern unsigned IOCTL_HDIO_GET_MULTCOUNT; - extern unsigned IOCTL_HDIO_GET_NOWERR; - extern unsigned IOCTL_HDIO_GET_UNMASKINTR; - extern unsigned IOCTL_HDIO_SET_32BIT; - extern unsigned IOCTL_HDIO_SET_DMA; - extern unsigned IOCTL_HDIO_SET_KEEPSETTINGS; - extern unsigned IOCTL_HDIO_SET_MULTCOUNT; - extern unsigned IOCTL_HDIO_SET_NOWERR; - extern unsigned IOCTL_HDIO_SET_UNMASKINTR; - extern unsigned IOCTL_MTIOCPOS; - extern unsigned IOCTL_PPPIOCGASYNCMAP; - extern unsigned IOCTL_PPPIOCGDEBUG; - extern unsigned IOCTL_PPPIOCGFLAGS; - extern unsigned IOCTL_PPPIOCGUNIT; - extern unsigned IOCTL_PPPIOCGXASYNCMAP; - extern unsigned IOCTL_PPPIOCSASYNCMAP; - extern unsigned IOCTL_PPPIOCSDEBUG; - extern unsigned IOCTL_PPPIOCSFLAGS; - extern unsigned IOCTL_PPPIOCSMAXCID; - extern unsigned IOCTL_PPPIOCSMRU; - extern unsigned IOCTL_PPPIOCSXASYNCMAP; - extern unsigned IOCTL_SIOCDARP; - extern unsigned IOCTL_SIOCDRARP; - extern unsigned IOCTL_SIOCGARP; - extern unsigned IOCTL_SIOCGIFENCAP; - extern unsigned IOCTL_SIOCGIFHWADDR; - extern unsigned IOCTL_SIOCGIFMAP; - extern unsigned IOCTL_SIOCGIFMEM; - extern unsigned IOCTL_SIOCGIFNAME; - extern unsigned IOCTL_SIOCGIFSLAVE; - extern unsigned IOCTL_SIOCGRARP; - extern unsigned IOCTL_SIOCGSTAMP; - extern unsigned IOCTL_SIOCSARP; - extern unsigned IOCTL_SIOCSIFENCAP; - extern unsigned IOCTL_SIOCSIFHWADDR; - extern unsigned IOCTL_SIOCSIFLINK; - extern unsigned IOCTL_SIOCSIFMAP; - extern unsigned IOCTL_SIOCSIFMEM; - extern unsigned IOCTL_SIOCSIFSLAVE; - extern unsigned IOCTL_SIOCSRARP; - extern unsigned IOCTL_SNDCTL_COPR_HALT; - extern unsigned IOCTL_SNDCTL_COPR_LOAD; - extern unsigned IOCTL_SNDCTL_COPR_RCODE; - extern unsigned IOCTL_SNDCTL_COPR_RCVMSG; - extern unsigned IOCTL_SNDCTL_COPR_RDATA; - extern unsigned IOCTL_SNDCTL_COPR_RESET; - extern unsigned IOCTL_SNDCTL_COPR_RUN; - extern unsigned IOCTL_SNDCTL_COPR_SENDMSG; - extern unsigned IOCTL_SNDCTL_COPR_WCODE; - extern unsigned IOCTL_SNDCTL_COPR_WDATA; - extern unsigned IOCTL_TCFLSH; - extern unsigned IOCTL_TCGETA; - extern unsigned IOCTL_TCGETS; - extern unsigned IOCTL_TCSBRK; - extern unsigned IOCTL_TCSBRKP; - extern unsigned IOCTL_TCSETA; - extern unsigned IOCTL_TCSETAF; - extern unsigned IOCTL_TCSETAW; - extern unsigned IOCTL_TCSETS; - extern unsigned IOCTL_TCSETSF; - extern unsigned IOCTL_TCSETSW; - extern unsigned IOCTL_TCXONC; - extern unsigned IOCTL_TIOCGLCKTRMIOS; - extern unsigned IOCTL_TIOCGSOFTCAR; - extern unsigned IOCTL_TIOCINQ; - extern unsigned IOCTL_TIOCLINUX; - extern unsigned IOCTL_TIOCSERCONFIG; - extern unsigned IOCTL_TIOCSERGETLSR; - extern unsigned IOCTL_TIOCSERGWILD; - extern unsigned IOCTL_TIOCSERSWILD; - extern unsigned IOCTL_TIOCSLCKTRMIOS; - extern unsigned IOCTL_TIOCSSOFTCAR; - extern unsigned IOCTL_VT_DISALLOCATE; - extern unsigned IOCTL_VT_GETSTATE; - extern unsigned IOCTL_VT_RESIZE; - extern unsigned IOCTL_VT_RESIZEX; - extern unsigned IOCTL_VT_SENDSIG; - extern unsigned IOCTL_MTIOCGET; - extern unsigned IOCTL_MTIOCTOP; - extern unsigned IOCTL_SIOCADDRT; - extern unsigned IOCTL_SIOCDELRT; - extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE; - extern unsigned IOCTL_SNDCTL_DSP_GETFMTS; - extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK; - extern unsigned IOCTL_SNDCTL_DSP_POST; - extern unsigned IOCTL_SNDCTL_DSP_RESET; - extern unsigned IOCTL_SNDCTL_DSP_SETFMT; - extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT; - extern unsigned IOCTL_SNDCTL_DSP_SPEED; - extern unsigned IOCTL_SNDCTL_DSP_STEREO; - extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE; - extern unsigned IOCTL_SNDCTL_DSP_SYNC; - extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE; - extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR; - extern unsigned IOCTL_SNDCTL_MIDI_INFO; - extern unsigned IOCTL_SNDCTL_MIDI_PRETIME; - extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE; - extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT; - extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT; - extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS; - extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS; - extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND; - extern unsigned IOCTL_SNDCTL_SEQ_PANIC; - extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE; - extern unsigned IOCTL_SNDCTL_SEQ_RESET; - extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES; - extern unsigned IOCTL_SNDCTL_SEQ_SYNC; - extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI; - extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD; - extern unsigned IOCTL_SNDCTL_SYNTH_INFO; - extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL; - extern unsigned IOCTL_SNDCTL_TMR_CONTINUE; - extern unsigned IOCTL_SNDCTL_TMR_METRONOME; - extern unsigned IOCTL_SNDCTL_TMR_SELECT; - extern unsigned IOCTL_SNDCTL_TMR_SOURCE; - extern unsigned IOCTL_SNDCTL_TMR_START; - extern unsigned IOCTL_SNDCTL_TMR_STOP; - extern unsigned IOCTL_SNDCTL_TMR_TEMPO; - extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE; - extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM; - extern unsigned IOCTL_SOUND_MIXER_READ_BASS; - extern unsigned IOCTL_SOUND_MIXER_READ_CAPS; - extern unsigned IOCTL_SOUND_MIXER_READ_CD; - extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK; - extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE; - extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN; - extern unsigned IOCTL_SOUND_MIXER_READ_IMIX; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE1; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE2; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE3; - extern unsigned IOCTL_SOUND_MIXER_READ_LINE; - extern unsigned IOCTL_SOUND_MIXER_READ_LOUD; - extern unsigned IOCTL_SOUND_MIXER_READ_MIC; - extern unsigned IOCTL_SOUND_MIXER_READ_MUTE; - extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN; - extern unsigned IOCTL_SOUND_MIXER_READ_PCM; - extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV; - extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK; - extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC; - extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER; - extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS; - extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH; - extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE; - extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME; - extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM; - extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS; - extern unsigned IOCTL_SOUND_MIXER_WRITE_CD; - extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN; - extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD; - extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC; - extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN; - extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM; - extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV; - extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC; - extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER; - extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH; - extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE; - extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME; - extern unsigned IOCTL_SOUND_PCM_READ_BITS; - extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS; - extern unsigned IOCTL_SOUND_PCM_READ_FILTER; - extern unsigned IOCTL_SOUND_PCM_READ_RATE; - extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS; - extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER; - extern unsigned IOCTL_VT_ACTIVATE; - extern unsigned IOCTL_VT_GETMODE; - extern unsigned IOCTL_VT_OPENQRY; - extern unsigned IOCTL_VT_RELDISP; - extern unsigned IOCTL_VT_SETMODE; - extern unsigned IOCTL_VT_WAITACTIVE; +extern unsigned IOCTL_EVIOCGABS; +extern unsigned IOCTL_EVIOCGBIT; +extern unsigned IOCTL_EVIOCGEFFECTS; +extern unsigned IOCTL_EVIOCGID; +extern unsigned IOCTL_EVIOCGKEY; +extern unsigned IOCTL_EVIOCGKEYCODE; +extern unsigned IOCTL_EVIOCGLED; +extern unsigned IOCTL_EVIOCGNAME; +extern unsigned IOCTL_EVIOCGPHYS; +extern unsigned IOCTL_EVIOCGRAB; +extern unsigned IOCTL_EVIOCGREP; +extern unsigned IOCTL_EVIOCGSND; +extern unsigned IOCTL_EVIOCGSW; +extern unsigned IOCTL_EVIOCGUNIQ; +extern unsigned IOCTL_EVIOCGVERSION; +extern unsigned IOCTL_EVIOCRMFF; +extern unsigned IOCTL_EVIOCSABS; +extern unsigned IOCTL_EVIOCSFF; +extern unsigned IOCTL_EVIOCSKEYCODE; +extern unsigned IOCTL_EVIOCSREP; +extern unsigned IOCTL_BLKFLSBUF; +extern unsigned IOCTL_BLKGETSIZE; +extern unsigned IOCTL_BLKRAGET; +extern unsigned IOCTL_BLKRASET; +extern unsigned IOCTL_BLKROGET; +extern unsigned IOCTL_BLKROSET; +extern unsigned IOCTL_BLKRRPART; +extern unsigned IOCTL_CDROMAUDIOBUFSIZ; +extern unsigned IOCTL_CDROMEJECT; +extern unsigned IOCTL_CDROMEJECT_SW; +extern unsigned IOCTL_CDROMMULTISESSION; +extern unsigned IOCTL_CDROMPAUSE; +extern unsigned IOCTL_CDROMPLAYMSF; +extern unsigned IOCTL_CDROMPLAYTRKIND; +extern unsigned IOCTL_CDROMREADAUDIO; +extern unsigned IOCTL_CDROMREADCOOKED; +extern unsigned IOCTL_CDROMREADMODE1; +extern unsigned IOCTL_CDROMREADMODE2; +extern unsigned IOCTL_CDROMREADRAW; +extern unsigned IOCTL_CDROMREADTOCENTRY; +extern unsigned IOCTL_CDROMREADTOCHDR; +extern unsigned IOCTL_CDROMRESET; +extern unsigned IOCTL_CDROMRESUME; +extern unsigned IOCTL_CDROMSEEK; +extern unsigned IOCTL_CDROMSTART; +extern unsigned IOCTL_CDROMSTOP; +extern unsigned IOCTL_CDROMSUBCHNL; +extern unsigned IOCTL_CDROMVOLCTRL; +extern unsigned IOCTL_CDROMVOLREAD; +extern unsigned IOCTL_CDROM_GET_UPC; +extern unsigned IOCTL_FDCLRPRM; +extern unsigned IOCTL_FDDEFPRM; +extern unsigned IOCTL_FDFLUSH; +extern unsigned IOCTL_FDFMTBEG; +extern unsigned IOCTL_FDFMTEND; +extern unsigned IOCTL_FDFMTTRK; +extern unsigned IOCTL_FDGETDRVPRM; +extern unsigned IOCTL_FDGETDRVSTAT; +extern unsigned IOCTL_FDGETDRVTYP; +extern unsigned IOCTL_FDGETFDCSTAT; +extern unsigned IOCTL_FDGETMAXERRS; +extern unsigned IOCTL_FDGETPRM; +extern unsigned IOCTL_FDMSGOFF; +extern unsigned IOCTL_FDMSGON; +extern unsigned IOCTL_FDPOLLDRVSTAT; +extern unsigned IOCTL_FDRAWCMD; +extern unsigned IOCTL_FDRESET; +extern unsigned IOCTL_FDSETDRVPRM; +extern unsigned IOCTL_FDSETEMSGTRESH; +extern unsigned IOCTL_FDSETMAXERRS; +extern unsigned IOCTL_FDSETPRM; +extern unsigned IOCTL_FDTWADDLE; +extern unsigned IOCTL_FDWERRORCLR; +extern unsigned IOCTL_FDWERRORGET; +extern unsigned IOCTL_HDIO_DRIVE_CMD; +extern unsigned IOCTL_HDIO_GETGEO; +extern unsigned IOCTL_HDIO_GET_32BIT; +extern unsigned IOCTL_HDIO_GET_DMA; +extern unsigned IOCTL_HDIO_GET_IDENTITY; +extern unsigned IOCTL_HDIO_GET_KEEPSETTINGS; +extern unsigned IOCTL_HDIO_GET_MULTCOUNT; +extern unsigned IOCTL_HDIO_GET_NOWERR; +extern unsigned IOCTL_HDIO_GET_UNMASKINTR; +extern unsigned IOCTL_HDIO_SET_32BIT; +extern unsigned IOCTL_HDIO_SET_DMA; +extern unsigned IOCTL_HDIO_SET_KEEPSETTINGS; +extern unsigned IOCTL_HDIO_SET_MULTCOUNT; +extern unsigned IOCTL_HDIO_SET_NOWERR; +extern unsigned IOCTL_HDIO_SET_UNMASKINTR; +extern unsigned IOCTL_MTIOCPOS; +extern unsigned IOCTL_PPPIOCGASYNCMAP; +extern unsigned IOCTL_PPPIOCGDEBUG; +extern unsigned IOCTL_PPPIOCGFLAGS; +extern unsigned IOCTL_PPPIOCGUNIT; +extern unsigned IOCTL_PPPIOCGXASYNCMAP; +extern unsigned IOCTL_PPPIOCSASYNCMAP; +extern unsigned IOCTL_PPPIOCSDEBUG; +extern unsigned IOCTL_PPPIOCSFLAGS; +extern unsigned IOCTL_PPPIOCSMAXCID; +extern unsigned IOCTL_PPPIOCSMRU; +extern unsigned IOCTL_PPPIOCSXASYNCMAP; +extern unsigned IOCTL_SIOCDARP; +extern unsigned IOCTL_SIOCDRARP; +extern unsigned IOCTL_SIOCGARP; +extern unsigned IOCTL_SIOCGIFENCAP; +extern unsigned IOCTL_SIOCGIFHWADDR; +extern unsigned IOCTL_SIOCGIFMAP; +extern unsigned IOCTL_SIOCGIFMEM; +extern unsigned IOCTL_SIOCGIFNAME; +extern unsigned IOCTL_SIOCGIFSLAVE; +extern unsigned IOCTL_SIOCGRARP; +extern unsigned IOCTL_SIOCGSTAMP; +extern unsigned IOCTL_SIOCSARP; +extern unsigned IOCTL_SIOCSIFENCAP; +extern unsigned IOCTL_SIOCSIFHWADDR; +extern unsigned IOCTL_SIOCSIFLINK; +extern unsigned IOCTL_SIOCSIFMAP; +extern unsigned IOCTL_SIOCSIFMEM; +extern unsigned IOCTL_SIOCSIFSLAVE; +extern unsigned IOCTL_SIOCSRARP; +extern unsigned IOCTL_SNDCTL_COPR_HALT; +extern unsigned IOCTL_SNDCTL_COPR_LOAD; +extern unsigned IOCTL_SNDCTL_COPR_RCODE; +extern unsigned IOCTL_SNDCTL_COPR_RCVMSG; +extern unsigned IOCTL_SNDCTL_COPR_RDATA; +extern unsigned IOCTL_SNDCTL_COPR_RESET; +extern unsigned IOCTL_SNDCTL_COPR_RUN; +extern unsigned IOCTL_SNDCTL_COPR_SENDMSG; +extern unsigned IOCTL_SNDCTL_COPR_WCODE; +extern unsigned IOCTL_SNDCTL_COPR_WDATA; +extern unsigned IOCTL_TCFLSH; +extern unsigned IOCTL_TCGETA; +extern unsigned IOCTL_TCGETS; +extern unsigned IOCTL_TCSBRK; +extern unsigned IOCTL_TCSBRKP; +extern unsigned IOCTL_TCSETA; +extern unsigned IOCTL_TCSETAF; +extern unsigned IOCTL_TCSETAW; +extern unsigned IOCTL_TCSETS; +extern unsigned IOCTL_TCSETSF; +extern unsigned IOCTL_TCSETSW; +extern unsigned IOCTL_TCXONC; +extern unsigned IOCTL_TIOCGLCKTRMIOS; +extern unsigned IOCTL_TIOCGSOFTCAR; +extern unsigned IOCTL_TIOCINQ; +extern unsigned IOCTL_TIOCLINUX; +extern unsigned IOCTL_TIOCSERCONFIG; +extern unsigned IOCTL_TIOCSERGETLSR; +extern unsigned IOCTL_TIOCSERGWILD; +extern unsigned IOCTL_TIOCSERSWILD; +extern unsigned IOCTL_TIOCSLCKTRMIOS; +extern unsigned IOCTL_TIOCSSOFTCAR; +extern unsigned IOCTL_VT_DISALLOCATE; +extern unsigned IOCTL_VT_GETSTATE; +extern unsigned IOCTL_VT_RESIZE; +extern unsigned IOCTL_VT_RESIZEX; +extern unsigned IOCTL_VT_SENDSIG; +extern unsigned IOCTL_MTIOCGET; +extern unsigned IOCTL_MTIOCTOP; +extern unsigned IOCTL_SIOCADDRT; +extern unsigned IOCTL_SIOCDELRT; +extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE; +extern unsigned IOCTL_SNDCTL_DSP_GETFMTS; +extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK; +extern unsigned IOCTL_SNDCTL_DSP_POST; +extern unsigned IOCTL_SNDCTL_DSP_RESET; +extern unsigned IOCTL_SNDCTL_DSP_SETFMT; +extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT; +extern unsigned IOCTL_SNDCTL_DSP_SPEED; +extern unsigned IOCTL_SNDCTL_DSP_STEREO; +extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE; +extern unsigned IOCTL_SNDCTL_DSP_SYNC; +extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE; +extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR; +extern unsigned IOCTL_SNDCTL_MIDI_INFO; +extern unsigned IOCTL_SNDCTL_MIDI_PRETIME; +extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE; +extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT; +extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT; +extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS; +extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS; +extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND; +extern unsigned IOCTL_SNDCTL_SEQ_PANIC; +extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE; +extern unsigned IOCTL_SNDCTL_SEQ_RESET; +extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES; +extern unsigned IOCTL_SNDCTL_SEQ_SYNC; +extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI; +extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD; +extern unsigned IOCTL_SNDCTL_SYNTH_INFO; +extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL; +extern unsigned IOCTL_SNDCTL_TMR_CONTINUE; +extern unsigned IOCTL_SNDCTL_TMR_METRONOME; +extern unsigned IOCTL_SNDCTL_TMR_SELECT; +extern unsigned IOCTL_SNDCTL_TMR_SOURCE; +extern unsigned IOCTL_SNDCTL_TMR_START; +extern unsigned IOCTL_SNDCTL_TMR_STOP; +extern unsigned IOCTL_SNDCTL_TMR_TEMPO; +extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE; +extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM; +extern unsigned IOCTL_SOUND_MIXER_READ_BASS; +extern unsigned IOCTL_SOUND_MIXER_READ_CAPS; +extern unsigned IOCTL_SOUND_MIXER_READ_CD; +extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK; +extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE; +extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN; +extern unsigned IOCTL_SOUND_MIXER_READ_IMIX; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE1; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE2; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE3; +extern unsigned IOCTL_SOUND_MIXER_READ_LINE; +extern unsigned IOCTL_SOUND_MIXER_READ_LOUD; +extern unsigned IOCTL_SOUND_MIXER_READ_MIC; +extern unsigned IOCTL_SOUND_MIXER_READ_MUTE; +extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN; +extern unsigned IOCTL_SOUND_MIXER_READ_PCM; +extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV; +extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK; +extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC; +extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER; +extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS; +extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH; +extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE; +extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME; +extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM; +extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS; +extern unsigned IOCTL_SOUND_MIXER_WRITE_CD; +extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN; +extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD; +extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC; +extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN; +extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM; +extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV; +extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC; +extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER; +extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH; +extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE; +extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME; +extern unsigned IOCTL_SOUND_PCM_READ_BITS; +extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS; +extern unsigned IOCTL_SOUND_PCM_READ_FILTER; +extern unsigned IOCTL_SOUND_PCM_READ_RATE; +extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS; +extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER; +extern unsigned IOCTL_VT_ACTIVATE; +extern unsigned IOCTL_VT_GETMODE; +extern unsigned IOCTL_VT_OPENQRY; +extern unsigned IOCTL_VT_RELDISP; +extern unsigned IOCTL_VT_SETMODE; +extern unsigned IOCTL_VT_WAITACTIVE; #endif // SANITIZER_LINUX #if SANITIZER_LINUX && !SANITIZER_ANDROID - extern unsigned IOCTL_CYGETDEFTHRESH; - extern unsigned IOCTL_CYGETDEFTIMEOUT; - extern unsigned IOCTL_CYGETMON; - extern unsigned IOCTL_CYGETTHRESH; - extern unsigned IOCTL_CYGETTIMEOUT; - extern unsigned IOCTL_CYSETDEFTHRESH; - extern unsigned IOCTL_CYSETDEFTIMEOUT; - extern unsigned IOCTL_CYSETTHRESH; - extern unsigned IOCTL_CYSETTIMEOUT; - extern unsigned IOCTL_EQL_EMANCIPATE; - extern unsigned IOCTL_EQL_ENSLAVE; - extern unsigned IOCTL_EQL_GETMASTRCFG; - extern unsigned IOCTL_EQL_GETSLAVECFG; - extern unsigned IOCTL_EQL_SETMASTRCFG; - extern unsigned IOCTL_EQL_SETSLAVECFG; - extern unsigned IOCTL_EVIOCGKEYCODE_V2; - extern unsigned IOCTL_EVIOCGPROP; - extern unsigned IOCTL_EVIOCSKEYCODE_V2; - extern unsigned IOCTL_FS_IOC_GETFLAGS; - extern unsigned IOCTL_FS_IOC_GETVERSION; - extern unsigned IOCTL_FS_IOC_SETFLAGS; - extern unsigned IOCTL_FS_IOC_SETVERSION; - extern unsigned IOCTL_GIO_CMAP; - extern unsigned IOCTL_GIO_FONT; - extern unsigned IOCTL_GIO_UNIMAP; - extern unsigned IOCTL_GIO_UNISCRNMAP; - extern unsigned IOCTL_KDADDIO; - extern unsigned IOCTL_KDDELIO; - extern unsigned IOCTL_KDGETKEYCODE; - extern unsigned IOCTL_KDGKBDIACR; - extern unsigned IOCTL_KDGKBENT; - extern unsigned IOCTL_KDGKBLED; - extern unsigned IOCTL_KDGKBMETA; - extern unsigned IOCTL_KDGKBSENT; - extern unsigned IOCTL_KDMAPDISP; - extern unsigned IOCTL_KDSETKEYCODE; - extern unsigned IOCTL_KDSIGACCEPT; - extern unsigned IOCTL_KDSKBDIACR; - extern unsigned IOCTL_KDSKBENT; - extern unsigned IOCTL_KDSKBLED; - extern unsigned IOCTL_KDSKBMETA; - extern unsigned IOCTL_KDSKBSENT; - extern unsigned IOCTL_KDUNMAPDISP; - extern unsigned IOCTL_LPABORT; - extern unsigned IOCTL_LPABORTOPEN; - extern unsigned IOCTL_LPCAREFUL; - extern unsigned IOCTL_LPCHAR; - extern unsigned IOCTL_LPGETIRQ; - extern unsigned IOCTL_LPGETSTATUS; - extern unsigned IOCTL_LPRESET; - extern unsigned IOCTL_LPSETIRQ; - extern unsigned IOCTL_LPTIME; - extern unsigned IOCTL_LPWAIT; - extern unsigned IOCTL_MTIOCGETCONFIG; - extern unsigned IOCTL_MTIOCSETCONFIG; - extern unsigned IOCTL_PIO_CMAP; - extern unsigned IOCTL_PIO_FONT; - extern unsigned IOCTL_PIO_UNIMAP; - extern unsigned IOCTL_PIO_UNIMAPCLR; - extern unsigned IOCTL_PIO_UNISCRNMAP; - extern unsigned IOCTL_SCSI_IOCTL_GET_IDLUN; - extern unsigned IOCTL_SCSI_IOCTL_PROBE_HOST; - extern unsigned IOCTL_SCSI_IOCTL_TAGGED_DISABLE; - extern unsigned IOCTL_SCSI_IOCTL_TAGGED_ENABLE; - extern unsigned IOCTL_SIOCAIPXITFCRT; - extern unsigned IOCTL_SIOCAIPXPRISLT; - extern unsigned IOCTL_SIOCAX25ADDUID; - extern unsigned IOCTL_SIOCAX25DELUID; - extern unsigned IOCTL_SIOCAX25GETPARMS; - extern unsigned IOCTL_SIOCAX25GETUID; - extern unsigned IOCTL_SIOCAX25NOUID; - extern unsigned IOCTL_SIOCAX25SETPARMS; - extern unsigned IOCTL_SIOCDEVPLIP; - extern unsigned IOCTL_SIOCIPXCFGDATA; - extern unsigned IOCTL_SIOCNRDECOBS; - extern unsigned IOCTL_SIOCNRGETPARMS; - extern unsigned IOCTL_SIOCNRRTCTL; - extern unsigned IOCTL_SIOCNRSETPARMS; - extern unsigned IOCTL_SNDCTL_DSP_GETISPACE; - extern unsigned IOCTL_SNDCTL_DSP_GETOSPACE; - extern unsigned IOCTL_TIOCGSERIAL; - extern unsigned IOCTL_TIOCSERGETMULTI; - extern unsigned IOCTL_TIOCSERSETMULTI; - extern unsigned IOCTL_TIOCSSERIAL; - extern unsigned IOCTL_GIO_SCRNMAP; - extern unsigned IOCTL_KDDISABIO; - extern unsigned IOCTL_KDENABIO; - extern unsigned IOCTL_KDGETLED; - extern unsigned IOCTL_KDGETMODE; - extern unsigned IOCTL_KDGKBMODE; - extern unsigned IOCTL_KDGKBTYPE; - extern unsigned IOCTL_KDMKTONE; - extern unsigned IOCTL_KDSETLED; - extern unsigned IOCTL_KDSETMODE; - extern unsigned IOCTL_KDSKBMODE; - extern unsigned IOCTL_KIOCSOUND; - extern unsigned IOCTL_PIO_SCRNMAP; -#endif - - extern const int si_SEGV_MAPERR; - extern const int si_SEGV_ACCERR; +extern unsigned IOCTL_CYGETDEFTHRESH; +extern unsigned IOCTL_CYGETDEFTIMEOUT; +extern unsigned IOCTL_CYGETMON; +extern unsigned IOCTL_CYGETTHRESH; +extern unsigned IOCTL_CYGETTIMEOUT; +extern unsigned IOCTL_CYSETDEFTHRESH; +extern unsigned IOCTL_CYSETDEFTIMEOUT; +extern unsigned IOCTL_CYSETTHRESH; +extern unsigned IOCTL_CYSETTIMEOUT; +extern unsigned IOCTL_EQL_EMANCIPATE; +extern unsigned IOCTL_EQL_ENSLAVE; +extern unsigned IOCTL_EQL_GETMASTRCFG; +extern unsigned IOCTL_EQL_GETSLAVECFG; +extern unsigned IOCTL_EQL_SETMASTRCFG; +extern unsigned IOCTL_EQL_SETSLAVECFG; +extern unsigned IOCTL_EVIOCGKEYCODE_V2; +extern unsigned IOCTL_EVIOCGPROP; +extern unsigned IOCTL_EVIOCSKEYCODE_V2; +extern unsigned IOCTL_FS_IOC_GETFLAGS; +extern unsigned IOCTL_FS_IOC_GETVERSION; +extern unsigned IOCTL_FS_IOC_SETFLAGS; +extern unsigned IOCTL_FS_IOC_SETVERSION; +extern unsigned IOCTL_GIO_CMAP; +extern unsigned IOCTL_GIO_FONT; +extern unsigned IOCTL_GIO_UNIMAP; +extern unsigned IOCTL_GIO_UNISCRNMAP; +extern unsigned IOCTL_KDADDIO; +extern unsigned IOCTL_KDDELIO; +extern unsigned IOCTL_KDGETKEYCODE; +extern unsigned IOCTL_KDGKBDIACR; +extern unsigned IOCTL_KDGKBENT; +extern unsigned IOCTL_KDGKBLED; +extern unsigned IOCTL_KDGKBMETA; +extern unsigned IOCTL_KDGKBSENT; +extern unsigned IOCTL_KDMAPDISP; +extern unsigned IOCTL_KDSETKEYCODE; +extern unsigned IOCTL_KDSIGACCEPT; +extern unsigned IOCTL_KDSKBDIACR; +extern unsigned IOCTL_KDSKBENT; +extern unsigned IOCTL_KDSKBLED; +extern unsigned IOCTL_KDSKBMETA; +extern unsigned IOCTL_KDSKBSENT; +extern unsigned IOCTL_KDUNMAPDISP; +extern unsigned IOCTL_LPABORT; +extern unsigned IOCTL_LPABORTOPEN; +extern unsigned IOCTL_LPCAREFUL; +extern unsigned IOCTL_LPCHAR; +extern unsigned IOCTL_LPGETIRQ; +extern unsigned IOCTL_LPGETSTATUS; +extern unsigned IOCTL_LPRESET; +extern unsigned IOCTL_LPSETIRQ; +extern unsigned IOCTL_LPTIME; +extern unsigned IOCTL_LPWAIT; +extern unsigned IOCTL_MTIOCGETCONFIG; +extern unsigned IOCTL_MTIOCSETCONFIG; +extern unsigned IOCTL_PIO_CMAP; +extern unsigned IOCTL_PIO_FONT; +extern unsigned IOCTL_PIO_UNIMAP; +extern unsigned IOCTL_PIO_UNIMAPCLR; +extern unsigned IOCTL_PIO_UNISCRNMAP; +extern unsigned IOCTL_SCSI_IOCTL_GET_IDLUN; +extern unsigned IOCTL_SCSI_IOCTL_PROBE_HOST; +extern unsigned IOCTL_SCSI_IOCTL_TAGGED_DISABLE; +extern unsigned IOCTL_SCSI_IOCTL_TAGGED_ENABLE; +extern unsigned IOCTL_SIOCAIPXITFCRT; +extern unsigned IOCTL_SIOCAIPXPRISLT; +extern unsigned IOCTL_SIOCAX25ADDUID; +extern unsigned IOCTL_SIOCAX25DELUID; +extern unsigned IOCTL_SIOCAX25GETPARMS; +extern unsigned IOCTL_SIOCAX25GETUID; +extern unsigned IOCTL_SIOCAX25NOUID; +extern unsigned IOCTL_SIOCAX25SETPARMS; +extern unsigned IOCTL_SIOCDEVPLIP; +extern unsigned IOCTL_SIOCIPXCFGDATA; +extern unsigned IOCTL_SIOCNRDECOBS; +extern unsigned IOCTL_SIOCNRGETPARMS; +extern unsigned IOCTL_SIOCNRRTCTL; +extern unsigned IOCTL_SIOCNRSETPARMS; +extern unsigned IOCTL_SNDCTL_DSP_GETISPACE; +extern unsigned IOCTL_SNDCTL_DSP_GETOSPACE; +extern unsigned IOCTL_TIOCGSERIAL; +extern unsigned IOCTL_TIOCSERGETMULTI; +extern unsigned IOCTL_TIOCSERSETMULTI; +extern unsigned IOCTL_TIOCSSERIAL; +extern unsigned IOCTL_GIO_SCRNMAP; +extern unsigned IOCTL_KDDISABIO; +extern unsigned IOCTL_KDENABIO; +extern unsigned IOCTL_KDGETLED; +extern unsigned IOCTL_KDGETMODE; +extern unsigned IOCTL_KDGKBMODE; +extern unsigned IOCTL_KDGKBTYPE; +extern unsigned IOCTL_KDMKTONE; +extern unsigned IOCTL_KDSETLED; +extern unsigned IOCTL_KDSETMODE; +extern unsigned IOCTL_KDSKBMODE; +extern unsigned IOCTL_KIOCSOUND; +extern unsigned IOCTL_PIO_SCRNMAP; +#endif + +extern const int si_SEGV_MAPERR; +extern const int si_SEGV_ACCERR; } // namespace __sanitizer #define CHECK_TYPE_SIZE(TYPE) \ COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE)) -#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \ - COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \ - sizeof(((CLASS *) NULL)->MEMBER)); \ - COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \ +#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \ + COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *)NULL)->MEMBER) == \ + sizeof(((CLASS *)NULL)->MEMBER)); \ + COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \ offsetof(CLASS, MEMBER)) // For sigaction, which is a function and struct at the same time, // and thus requires explicit "struct" in sizeof() expression. -#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \ - COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \ - sizeof(((struct CLASS *) NULL)->MEMBER)); \ - COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \ +#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \ + COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *)NULL)->MEMBER) == \ + sizeof(((struct CLASS *)NULL)->MEMBER)); \ + COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \ offsetof(struct CLASS, MEMBER)) #define SIGACTION_SYMNAME sigaction diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h index ed3b7a04dff..77ae6e6a44d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h @@ -68,7 +68,7 @@ struct __sanitizer_ipc_perm { #if !defined(_LP64) int pad[4]; #endif - }; +}; struct __sanitizer_shmid_ds { __sanitizer_ipc_perm shm_perm; @@ -237,9 +237,8 @@ typedef int __sanitizer_clockid_t; // This thing depends on the platform. We are only interested in the upper // limit. Verified with a compiler assert in .cpp. -const int pthread_attr_t_max_sz = 128; union __sanitizer_pthread_attr_t { - char size[pthread_attr_t_max_sz]; // NOLINT + char size[128]; void *align; }; diff --git a/libsanitizer/sanitizer_common/sanitizer_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_posix.cpp index 002bcb1eda4..d890a3a3177 100644 --- a/libsanitizer/sanitizer_common/sanitizer_posix.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_posix.cpp @@ -312,6 +312,8 @@ const char *SignalContext::Describe() const { return "SEGV"; case SIGBUS: return "BUS"; + case SIGTRAP: + return "TRAP"; } return "UNKNOWN SIGNAL"; } diff --git a/libsanitizer/sanitizer_common/sanitizer_posix.h b/libsanitizer/sanitizer_common/sanitizer_posix.h index 6cf5ce75b12..05fb0f63020 100644 --- a/libsanitizer/sanitizer_common/sanitizer_posix.h +++ b/libsanitizer/sanitizer_common/sanitizer_posix.h @@ -63,7 +63,7 @@ uptr internal_ptrace(int request, int pid, void *addr, void *data); uptr internal_waitpid(int pid, int *status, int options); int internal_fork(); -int internal_forkpty(int *amaster); +fd_t internal_spawn(const char *argv[], pid_t *pid); int internal_sysctl(const int *name, unsigned int namelen, void *oldp, uptr *oldlenp, const void *newp, uptr newlen); diff --git a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp index 1bbbf8a675f..304b3a01a08 100644 --- a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp @@ -304,11 +304,13 @@ void PlatformPrepareForSandboxing(__sanitizer_sandbox_arguments *args) { MemoryMappingLayout::CacheMemoryMappings(); } -bool MmapFixedNoReserve(uptr fixed_addr, uptr size, const char *name) { +static bool MmapFixed(uptr fixed_addr, uptr size, int additional_flags, + const char *name) { size = RoundUpTo(size, GetPageSizeCached()); fixed_addr = RoundDownTo(fixed_addr, GetPageSizeCached()); - uptr p = MmapNamed((void *)fixed_addr, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE | MAP_ANON, name); + uptr p = + MmapNamed((void *)fixed_addr, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED | additional_flags | MAP_ANON, name); int reserrno; if (internal_iserror(p, &reserrno)) { Report("ERROR: %s failed to " @@ -320,6 +322,24 @@ bool MmapFixedNoReserve(uptr fixed_addr, uptr size, const char *name) { return true; } +bool MmapFixedNoReserve(uptr fixed_addr, uptr size, const char *name) { + return MmapFixed(fixed_addr, size, MAP_NORESERVE, name); +} + +bool MmapFixedSuperNoReserve(uptr fixed_addr, uptr size, const char *name) { +#if SANITIZER_FREEBSD + if (common_flags()->no_huge_pages_for_shadow) + return MmapFixedNoReserve(fixed_addr, size, name); + // MAP_NORESERVE is implicit with FreeBSD + return MmapFixed(fixed_addr, size, MAP_ALIGNED_SUPER, name); +#else + bool r = MmapFixedNoReserve(fixed_addr, size, name); + if (r) + SetShadowRegionHugePageMode(fixed_addr, size); + return r; +#endif +} + uptr ReservedAddressRange::Init(uptr size, const char *name, uptr fixed_addr) { base_ = fixed_addr ? MmapFixedNoAccess(fixed_addr, size, name) : MmapNoAccess(size); diff --git a/libsanitizer/sanitizer_common/sanitizer_printf.cpp b/libsanitizer/sanitizer_common/sanitizer_printf.cpp index 9d1c544786d..a032787114b 100644 --- a/libsanitizer/sanitizer_common/sanitizer_printf.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_printf.cpp @@ -229,15 +229,15 @@ void SetPrintfAndReportCallback(void (*callback)(const char *)) { // Can be overriden in frontend. #if SANITIZER_GO && defined(TSAN_EXTERNAL_HOOKS) // Implementation must be defined in frontend. -extern "C" void OnPrint(const char *str); +extern "C" void __sanitizer_on_print(const char *str); #else -SANITIZER_INTERFACE_WEAK_DEF(void, OnPrint, const char *str) { +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_on_print, const char *str) { (void)str; } #endif static void CallPrintfAndReportCallback(const char *str) { - OnPrint(str); + __sanitizer_on_print(str); if (PrintfAndReportCallback) PrintfAndReportCallback(str); } diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps.h b/libsanitizer/sanitizer_common/sanitizer_procmaps.h index 052027111ce..d0e5245f84d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_procmaps.h +++ b/libsanitizer/sanitizer_common/sanitizer_procmaps.h @@ -37,7 +37,7 @@ struct MemoryMappedSegmentData; class MemoryMappedSegment { public: - MemoryMappedSegment(char *buff = nullptr, uptr size = 0) + explicit MemoryMappedSegment(char *buff = nullptr, uptr size = 0) : filename(buff), filename_size(size), data_(nullptr) {} ~MemoryMappedSegment() {} diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp b/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp index ea72a57bf3c..d02afcfe87a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp @@ -181,13 +181,14 @@ const mach_header *get_dyld_hdr() { // Note that the segment addresses are not necessarily sorted. template static bool NextSegmentLoad(MemoryMappedSegment *segment, -MemoryMappedSegmentData *seg_data, MemoryMappingLayoutData &layout_data) { - const char *lc = layout_data.current_load_cmd_addr; - layout_data.current_load_cmd_addr += ((const load_command *)lc)->cmdsize; + MemoryMappedSegmentData *seg_data, + MemoryMappingLayoutData *layout_data) { + const char *lc = layout_data->current_load_cmd_addr; + layout_data->current_load_cmd_addr += ((const load_command *)lc)->cmdsize; if (((const load_command *)lc)->cmd == kLCSegment) { const SegmentCommand* sc = (const SegmentCommand *)lc; uptr base_virt_addr, addr_mask; - if (layout_data.current_image == kDyldImageIdx) { + if (layout_data->current_image == kDyldImageIdx) { base_virt_addr = (uptr)get_dyld_hdr(); // vmaddr is masked with 0xfffff because on macOS versions < 10.12, // it contains an absolute address rather than an offset for dyld. @@ -198,7 +199,7 @@ MemoryMappedSegmentData *seg_data, MemoryMappingLayoutData &layout_data) { addr_mask = 0xfffff; } else { base_virt_addr = - (uptr)_dyld_get_image_vmaddr_slide(layout_data.current_image); + (uptr)_dyld_get_image_vmaddr_slide(layout_data->current_image); addr_mask = ~0; } @@ -219,18 +220,18 @@ MemoryMappedSegmentData *seg_data, MemoryMappingLayoutData &layout_data) { // Return the initial protection. segment->protection = sc->initprot; - segment->offset = (layout_data.current_filetype == + segment->offset = (layout_data->current_filetype == /*MH_EXECUTE*/ 0x2) ? sc->vmaddr : sc->fileoff; if (segment->filename) { - const char *src = (layout_data.current_image == kDyldImageIdx) + const char *src = (layout_data->current_image == kDyldImageIdx) ? kDyldPath - : _dyld_get_image_name(layout_data.current_image); + : _dyld_get_image_name(layout_data->current_image); internal_strncpy(segment->filename, src, segment->filename_size); } - segment->arch = layout_data.current_arch; - internal_memcpy(segment->uuid, layout_data.current_uuid, kModuleUUIDSize); + segment->arch = layout_data->current_arch; + internal_memcpy(segment->uuid, layout_data->current_uuid, kModuleUUIDSize); return true; } return false; @@ -331,14 +332,14 @@ bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) { #ifdef MH_MAGIC_64 case MH_MAGIC_64: { if (NextSegmentLoad( - segment, segment->data_, data_)) + segment, segment->data_, &data_)) return true; break; } #endif case MH_MAGIC: { if (NextSegmentLoad( - segment, segment->data_, data_)) + segment, segment->data_, &data_)) return true; break; } diff --git a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cpp b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cpp index ce75cbe5d26..ef14fb704ee 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cpp @@ -60,8 +60,8 @@ static inline uhwptr *GetCanonicFrame(uptr bp, // Nope, this does not look right either. This means the frame after next does // not have a valid frame pointer, but we can still extract the caller PC. // Unfortunately, there is no way to decide between GCC and LLVM frame - // layouts. Assume GCC. - return bp_prev - 1; + // layouts. Assume LLVM. + return bp_prev; #else return (uhwptr*)bp; #endif @@ -84,21 +84,14 @@ void BufferedStackTrace::UnwindFast(uptr pc, uptr bp, uptr stack_top, IsAligned((uptr)frame, sizeof(*frame)) && size < max_depth) { #ifdef __powerpc__ - // PowerPC ABIs specify that the return address is saved on the - // *caller's* stack frame. Thus we must dereference the back chain - // to find the caller frame before extracting it. + // PowerPC ABIs specify that the return address is saved at offset + // 16 of the *caller's* stack frame. Thus we must dereference the + // back chain to find the caller frame before extracting it. uhwptr *caller_frame = (uhwptr*)frame[0]; if (!IsValidFrame((uptr)caller_frame, stack_top, bottom) || !IsAligned((uptr)caller_frame, sizeof(uhwptr))) break; - // For most ABIs the offset where the return address is saved is two - // register sizes. The exception is the SVR4 ABI, which uses an - // offset of only one register size. -#ifdef _CALL_SYSV - uhwptr pc1 = caller_frame[1]; -#else uhwptr pc1 = caller_frame[2]; -#endif #elif defined(__s390__) uhwptr pc1 = frame[14]; #else diff --git a/libsanitizer/sanitizer_common/sanitizer_stacktrace_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_stacktrace_libcdep.cpp index 2c08274f35c..4ef305cf179 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stacktrace_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_stacktrace_libcdep.cpp @@ -150,8 +150,9 @@ void __sanitizer_symbolize_global(uptr data_addr, const char *fmt, } SANITIZER_INTERFACE_ATTRIBUTE -int __sanitizer_get_module_and_offset_for_pc( // NOLINT - uptr pc, char *module_name, uptr module_name_len, uptr *pc_offset) { +int __sanitizer_get_module_and_offset_for_pc(uptr pc, char *module_name, + uptr module_name_len, + uptr *pc_offset) { return __sanitizer::GetModuleAndOffsetForPc(pc, module_name, module_name_len, pc_offset); } diff --git a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp index b520dc8daca..651d5056dd9 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp @@ -223,10 +223,11 @@ bool ThreadSuspender::SuspendAllThreads() { case ThreadLister::Ok: break; } - for (tid_t tid : threads) + for (tid_t tid : threads) { if (SuspendThread(tid)) retry = true; - }; + } + } return suspended_threads_list_.ThreadCount(); } diff --git a/libsanitizer/sanitizer_common/sanitizer_suppressions.h b/libsanitizer/sanitizer_common/sanitizer_suppressions.h index f9da7af7e6a..2d88b1f72fa 100644 --- a/libsanitizer/sanitizer_common/sanitizer_suppressions.h +++ b/libsanitizer/sanitizer_common/sanitizer_suppressions.h @@ -42,7 +42,7 @@ class SuppressionContext { void GetMatched(InternalMmapVector *matched); private: - static const int kMaxSuppressionTypes = 32; + static const int kMaxSuppressionTypes = 64; const char **const suppression_types_; const int suppression_types_num_; diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_internal.h b/libsanitizer/sanitizer_common/sanitizer_symbolizer_internal.h index 3031f28a20e..c04797dd61b 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_internal.h +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_internal.h @@ -76,7 +76,7 @@ class SymbolizerTool { // SymbolizerProcess may not be used from two threads simultaneously. class SymbolizerProcess { public: - explicit SymbolizerProcess(const char *path, bool use_forkpty = false); + explicit SymbolizerProcess(const char *path, bool use_posix_spawn = false); const char *SendCommand(const char *command); protected: @@ -114,7 +114,7 @@ class SymbolizerProcess { uptr times_restarted_; bool failed_to_start_; bool reported_invalid_path_; - bool use_forkpty_; + bool use_posix_spawn_; }; class LLVMSymbolizerProcess; diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp index 742b9748c98..3b19a6836ec 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp @@ -238,7 +238,8 @@ const LoadedModule *Symbolizer::FindModuleForAddress(uptr address) { // class LLVMSymbolizerProcess : public SymbolizerProcess { public: - explicit LLVMSymbolizerProcess(const char *path) : SymbolizerProcess(path) {} + explicit LLVMSymbolizerProcess(const char *path) + : SymbolizerProcess(path, /*use_posix_spawn=*/SANITIZER_MAC) {} private: bool ReachedEndOfOutput(const char *buffer, uptr length) const override { @@ -452,14 +453,14 @@ const char *LLVMSymbolizer::FormatAndSendCommand(const char *command_prefix, return symbolizer_process_->SendCommand(buffer_); } -SymbolizerProcess::SymbolizerProcess(const char *path, bool use_forkpty) +SymbolizerProcess::SymbolizerProcess(const char *path, bool use_posix_spawn) : path_(path), input_fd_(kInvalidFd), output_fd_(kInvalidFd), times_restarted_(0), failed_to_start_(false), reported_invalid_path_(false), - use_forkpty_(use_forkpty) { + use_posix_spawn_(use_posix_spawn) { CHECK(path_); CHECK_NE(path_[0], '\0'); } diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_mac.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_mac.cpp index 7bc4b0ce025..a619ed092f0 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_mac.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_mac.cpp @@ -50,14 +50,14 @@ bool DlAddrSymbolizer::SymbolizeData(uptr addr, DataInfo *datainfo) { class AtosSymbolizerProcess : public SymbolizerProcess { public: explicit AtosSymbolizerProcess(const char *path, pid_t parent_pid) - : SymbolizerProcess(path, /*use_forkpty*/ true) { + : SymbolizerProcess(path, /*use_posix_spawn*/ true) { // Put the string command line argument in the object so that it outlives // the call to GetArgV. internal_snprintf(pid_str_, sizeof(pid_str_), "%d", parent_pid); } private: - virtual bool StartSymbolizerSubprocess() override { + bool StartSymbolizerSubprocess() override { // Configure sandbox before starting atos process. return SymbolizerProcess::StartSymbolizerSubprocess(); } diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp index 43e6a6d2dbf..c123ecb1120 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp @@ -33,10 +33,6 @@ #include #include -#if SANITIZER_MAC -#include // for forkpty() -#endif // SANITIZER_MAC - // C++ demangling function, as required by Itanium C++ ABI. This is weak, // because we do not require a C++ ABI library to be linked to a program // using sanitizers; if it's not present, we'll just use the mangled name. @@ -151,80 +147,32 @@ bool SymbolizerProcess::StartSymbolizerSubprocess() { return false; } - int pid = -1; - - int infd[2]; - internal_memset(&infd, 0, sizeof(infd)); - int outfd[2]; - internal_memset(&outfd, 0, sizeof(outfd)); - if (!CreateTwoHighNumberedPipes(infd, outfd)) { - Report("WARNING: Can't create a socket pair to start " - "external symbolizer (errno: %d)\n", errno); - return false; - } + const char *argv[kArgVMax]; + GetArgV(path_, argv); + pid_t pid; - if (use_forkpty_) { + if (use_posix_spawn_) { #if SANITIZER_MAC - fd_t fd = kInvalidFd; - - // forkpty redirects stdout and stderr into a single stream, so we would - // receive error messages as standard replies. To avoid that, let's dup - // stderr and restore it in the child. - int saved_stderr = dup(STDERR_FILENO); - CHECK_GE(saved_stderr, 0); - - // We only need one pipe, for stdin of the child. - close(outfd[0]); - close(outfd[1]); - - // Use forkpty to disable buffering in the new terminal. - pid = internal_forkpty(&fd); - if (pid == -1) { - // forkpty() failed. - Report("WARNING: failed to fork external symbolizer (errno: %d)\n", + fd_t fd = internal_spawn(argv, &pid); + if (fd == kInvalidFd) { + Report("WARNING: failed to spawn external symbolizer (errno: %d)\n", errno); return false; - } else if (pid == 0) { - // Child subprocess. - - // infd[0] is the child's reading end. - close(infd[1]); - - // Set up stdin to read from the pipe. - CHECK_GE(dup2(infd[0], STDIN_FILENO), 0); - close(infd[0]); - - // Restore stderr. - CHECK_GE(dup2(saved_stderr, STDERR_FILENO), 0); - close(saved_stderr); - - const char *argv[kArgVMax]; - GetArgV(path_, argv); - execv(path_, const_cast(&argv[0])); - internal__exit(1); } - // Input for the child, infd[1] is our writing end. - output_fd_ = infd[1]; - close(infd[0]); - - // Continue execution in parent process. input_fd_ = fd; - - close(saved_stderr); - - // Disable echo in the new terminal, disable CR. - struct termios termflags; - tcgetattr(fd, &termflags); - termflags.c_oflag &= ~ONLCR; - termflags.c_lflag &= ~ECHO; - tcsetattr(fd, TCSANOW, &termflags); + output_fd_ = fd; #else // SANITIZER_MAC UNIMPLEMENTED(); #endif // SANITIZER_MAC } else { - const char *argv[kArgVMax]; - GetArgV(path_, argv); + fd_t infd[2] = {}, outfd[2] = {}; + if (!CreateTwoHighNumberedPipes(infd, outfd)) { + Report("WARNING: Can't create a socket pair to start " + "external symbolizer (errno: %d)\n", errno); + return false; + } + pid = StartSubprocess(path_, argv, /* stdin */ outfd[0], /* stdout */ infd[1]); if (pid < 0) { diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_report.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_report.cpp index a8b449b030e..c26724ceb7a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_report.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_report.cpp @@ -106,8 +106,9 @@ void ReportMmapWriteExec(int prot) { if (StackTrace::WillUseFastUnwind(fast)) { GetThreadStackTopAndBottom(false, &top, &bottom); stack->Unwind(kStackTraceMax, pc, bp, nullptr, top, bottom, true); - } else + } else { stack->Unwind(kStackTraceMax, pc, 0, nullptr, 0, 0, false); + } Printf("%s", d.Warning()); Report("WARNING: %s: writable-executable page usage\n", SanitizerToolName); @@ -190,9 +191,14 @@ static void ReportDeadlySignalImpl(const SignalContext &sig, u32 tid, SanitizerCommonDecorator d; Printf("%s", d.Warning()); const char *description = sig.Describe(); - Report("ERROR: %s: %s on unknown address %p (pc %p bp %p sp %p T%d)\n", - SanitizerToolName, description, (void *)sig.addr, (void *)sig.pc, - (void *)sig.bp, (void *)sig.sp, tid); + if (sig.is_memory_access && !sig.is_true_faulting_addr) + Report("ERROR: %s: %s on unknown address (pc %p bp %p sp %p T%d)\n", + SanitizerToolName, description, (void *)sig.pc, (void *)sig.bp, + (void *)sig.sp, tid); + else + Report("ERROR: %s: %s on unknown address %p (pc %p bp %p sp %p T%d)\n", + SanitizerToolName, description, (void *)sig.addr, (void *)sig.pc, + (void *)sig.bp, (void *)sig.sp, tid); Printf("%s", d.Default()); if (sig.pc < GetPageSizeCached()) Report("Hint: pc points to the zero page.\n"); @@ -202,7 +208,11 @@ static void ReportDeadlySignalImpl(const SignalContext &sig, u32 tid, ? "WRITE" : (sig.write_flag == SignalContext::READ ? "READ" : "UNKNOWN"); Report("The signal is caused by a %s memory access.\n", access_type); - if (sig.addr < GetPageSizeCached()) + if (!sig.is_true_faulting_addr) + Report("Hint: this fault was caused by a dereference of a high value " + "address (see register values below). Dissassemble the provided " + "pc to learn which register was used.\n"); + else if (sig.addr < GetPageSizeCached()) Report("Hint: address points to the zero page.\n"); } MaybeReportNonExecRegion(sig.pc); diff --git a/libsanitizer/sanitizer_common/sanitizer_termination.cpp b/libsanitizer/sanitizer_common/sanitizer_termination.cpp index e588c93b994..84be6fc3234 100644 --- a/libsanitizer/sanitizer_common/sanitizer_termination.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_termination.cpp @@ -84,7 +84,7 @@ void NORETURN CheckFailed(const char *file, int line, const char *cond, } // namespace __sanitizer -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; extern "C" { SANITIZER_INTERFACE_ATTRIBUTE diff --git a/libsanitizer/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp index 1a43759e38a..b2628dcc4dc 100644 --- a/libsanitizer/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp @@ -27,6 +27,8 @@ namespace __sanitizer { +namespace { + //---------------------------- UnwindSlow -------------------------------------- typedef struct { @@ -46,38 +48,6 @@ release_my_map_info_list_func release_my_map_info_list; unwind_backtrace_signal_arch_func unwind_backtrace_signal_arch; } // extern "C" -#if SANITIZER_ANDROID -void SanitizerInitializeUnwinder() { - if (AndroidGetApiLevel() >= ANDROID_LOLLIPOP_MR1) return; - - // Pre-lollipop Android can not unwind through signal handler frames with - // libgcc unwinder, but it has a libcorkscrew.so library with the necessary - // workarounds. - void *p = dlopen("libcorkscrew.so", RTLD_LAZY); - if (!p) { - VReport(1, - "Failed to open libcorkscrew.so. You may see broken stack traces " - "in SEGV reports."); - return; - } - acquire_my_map_info_list = - (acquire_my_map_info_list_func)(uptr)dlsym(p, "acquire_my_map_info_list"); - release_my_map_info_list = - (release_my_map_info_list_func)(uptr)dlsym(p, "release_my_map_info_list"); - unwind_backtrace_signal_arch = (unwind_backtrace_signal_arch_func)(uptr)dlsym( - p, "unwind_backtrace_signal_arch"); - if (!acquire_my_map_info_list || !release_my_map_info_list || - !unwind_backtrace_signal_arch) { - VReport(1, - "Failed to find one of the required symbols in libcorkscrew.so. " - "You may see broken stack traces in SEGV reports."); - acquire_my_map_info_list = 0; - unwind_backtrace_signal_arch = 0; - release_my_map_info_list = 0; - } -} -#endif - #if defined(__arm__) && !SANITIZER_NETBSD // NetBSD uses dwarf EH #define UNWIND_STOP _URC_END_OF_STACK @@ -119,6 +89,40 @@ _Unwind_Reason_Code Unwind_Trace(struct _Unwind_Context *ctx, void *param) { return UNWIND_CONTINUE; } +} // namespace + +#if SANITIZER_ANDROID +void SanitizerInitializeUnwinder() { + if (AndroidGetApiLevel() >= ANDROID_LOLLIPOP_MR1) return; + + // Pre-lollipop Android can not unwind through signal handler frames with + // libgcc unwinder, but it has a libcorkscrew.so library with the necessary + // workarounds. + void *p = dlopen("libcorkscrew.so", RTLD_LAZY); + if (!p) { + VReport(1, + "Failed to open libcorkscrew.so. You may see broken stack traces " + "in SEGV reports."); + return; + } + acquire_my_map_info_list = + (acquire_my_map_info_list_func)(uptr)dlsym(p, "acquire_my_map_info_list"); + release_my_map_info_list = + (release_my_map_info_list_func)(uptr)dlsym(p, "release_my_map_info_list"); + unwind_backtrace_signal_arch = (unwind_backtrace_signal_arch_func)(uptr)dlsym( + p, "unwind_backtrace_signal_arch"); + if (!acquire_my_map_info_list || !release_my_map_info_list || + !unwind_backtrace_signal_arch) { + VReport(1, + "Failed to find one of the required symbols in libcorkscrew.so. " + "You may see broken stack traces in SEGV reports."); + acquire_my_map_info_list = 0; + unwind_backtrace_signal_arch = 0; + release_my_map_info_list = 0; + } +} +#endif + void BufferedStackTrace::UnwindSlow(uptr pc, u32 max_depth) { CHECK_GE(max_depth, 2); size = 0; diff --git a/libsanitizer/sanitizer_common/sanitizer_vector.h b/libsanitizer/sanitizer_common/sanitizer_vector.h index 4b9ae7db4c1..31216f3ec3a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_vector.h +++ b/libsanitizer/sanitizer_common/sanitizer_vector.h @@ -23,11 +23,7 @@ namespace __sanitizer { template class Vector { public: - explicit Vector() - : begin_() - , end_() - , last_() { - } + Vector() : begin_(), end_(), last_() {} ~Vector() { if (begin_) diff --git a/libsanitizer/sanitizer_common/sanitizer_win.cpp b/libsanitizer/sanitizer_common/sanitizer_win.cpp index c98e3d42f43..36dde49d870 100644 --- a/libsanitizer/sanitizer_common/sanitizer_win.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_win.cpp @@ -239,6 +239,11 @@ bool MmapFixedNoReserve(uptr fixed_addr, uptr size, const char *name) { return true; } +bool MmapFixedSuperNoReserve(uptr fixed_addr, uptr size, const char *name) { + // FIXME: Windows support large pages too. Might be worth checking + return MmapFixedNoReserve(fixed_addr, size, name); +} + // Memory space mapped by 'MmapFixedOrDie' must have been reserved by // 'MmapFixedNoAccess'. void *MmapFixedOrDie(uptr fixed_addr, uptr size, const char *name) { @@ -671,7 +676,7 @@ static int RunAtexit() { return ret; } -#pragma section(".CRT$XID", long, read) // NOLINT +#pragma section(".CRT$XID", long, read) __declspec(allocate(".CRT$XID")) int (*__run_atexit)() = RunAtexit; #endif @@ -940,6 +945,11 @@ bool SignalContext::IsMemoryAccess() const { return GetWriteFlag() != SignalContext::UNKNOWN; } +bool SignalContext::IsTrueFaultingAddress() const { + // FIXME: Provide real implementation for this. See Linux and Mac variants. + return IsMemoryAccess(); +} + SignalContext::WriteFlag SignalContext::GetWriteFlag() const { EXCEPTION_RECORD *exception_record = (EXCEPTION_RECORD *)siginfo; // The contents of this array are documented at diff --git a/libsanitizer/sanitizer_common/sanitizer_win_defs.h b/libsanitizer/sanitizer_common/sanitizer_win_defs.h index bcd94a08dc4..bfe38a33236 100644 --- a/libsanitizer/sanitizer_common/sanitizer_win_defs.h +++ b/libsanitizer/sanitizer_common/sanitizer_win_defs.h @@ -43,6 +43,8 @@ #define STRINGIFY_(A) #A #define STRINGIFY(A) STRINGIFY_(A) +#if !SANITIZER_GO + // ----------------- A workaround for the absence of weak symbols -------------- // We don't have a direct equivalent of weak symbols when using MSVC, but we can // use the /alternatename directive to tell the linker to default a specific @@ -158,5 +160,15 @@ // return a >= b; // } // + +#else // SANITIZER_GO + +// Go neither needs nor wants weak references. +// The shenanigans above don't work for gcc. +# define WIN_WEAK_EXPORT_DEF(ReturnType, Name, ...) \ + extern "C" ReturnType Name(__VA_ARGS__) + +#endif // SANITIZER_GO + #endif // SANITIZER_WINDOWS #endif // SANITIZER_WIN_DEFS_H diff --git a/libsanitizer/sanitizer_common/sanitizer_win_dll_thunk.cpp b/libsanitizer/sanitizer_common/sanitizer_win_dll_thunk.cpp index aa0eb4d43a4..1562c161a76 100644 --- a/libsanitizer/sanitizer_common/sanitizer_win_dll_thunk.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_win_dll_thunk.cpp @@ -54,8 +54,8 @@ int dllThunkInterceptWhenPossible(const char* main_function, #define INTERFACE_WEAK_FUNCTION(Name) INTERCEPT_SANITIZER_WEAK_FUNCTION(Name) #include "sanitizer_common_interface.inc" -#pragma section(".DLLTH$A", read) // NOLINT -#pragma section(".DLLTH$Z", read) // NOLINT +#pragma section(".DLLTH$A", read) +#pragma section(".DLLTH$Z", read) typedef void (*DllThunkCB)(); extern "C" { @@ -85,7 +85,7 @@ extern "C" int __dll_thunk_init() { // We want to call dll_thunk_init before C/C++ initializers / constructors are // executed, otherwise functions like memset might be invoked. -#pragma section(".CRT$XIB", long, read) // NOLINT +#pragma section(".CRT$XIB", long, read) __declspec(allocate(".CRT$XIB")) int (*__dll_thunk_preinit)() = __dll_thunk_init; @@ -94,7 +94,7 @@ static void WINAPI dll_thunk_thread_init(void *mod, unsigned long reason, if (reason == /*DLL_PROCESS_ATTACH=*/1) __dll_thunk_init(); } -#pragma section(".CRT$XLAB", long, read) // NOLINT +#pragma section(".CRT$XLAB", long, read) __declspec(allocate(".CRT$XLAB")) void (WINAPI *__dll_thunk_tls_init)(void *, unsigned long, void *) = dll_thunk_thread_init; diff --git a/libsanitizer/sanitizer_common/sanitizer_win_weak_interception.cpp b/libsanitizer/sanitizer_common/sanitizer_win_weak_interception.cpp index a6f34c27788..b14bbf76d9a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_win_weak_interception.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_win_weak_interception.cpp @@ -38,6 +38,7 @@ int interceptWhenPossible(uptr dll_function, const char *real_function) { // Declare weak hooks. extern "C" { +void __sanitizer_on_print(const char *str); void __sanitizer_weak_hook_memcmp(uptr called_pc, const void *s1, const void *s2, uptr n, int result); void __sanitizer_weak_hook_strcmp(uptr called_pc, const char *s1, @@ -53,8 +54,8 @@ void __sanitizer_weak_hook_strstr(uptr called_pc, const char *s1, #define INTERFACE_WEAK_FUNCTION(Name) INTERCEPT_SANITIZER_WEAK_FUNCTION(Name) #include "sanitizer_common_interface.inc" -#pragma section(".WEAK$A", read) // NOLINT -#pragma section(".WEAK$Z", read) // NOLINT +#pragma section(".WEAK$A", read) +#pragma section(".WEAK$Z", read) typedef void (*InterceptCB)(); extern "C" { @@ -77,7 +78,7 @@ static int weak_intercept_init() { return 0; } -#pragma section(".CRT$XIB", long, read) // NOLINT +#pragma section(".CRT$XIB", long, read) __declspec(allocate(".CRT$XIB")) int (*__weak_intercept_preinit)() = weak_intercept_init; @@ -86,7 +87,7 @@ static void WINAPI weak_intercept_thread_init(void *mod, unsigned long reason, if (reason == /*DLL_PROCESS_ATTACH=*/1) weak_intercept_init(); } -#pragma section(".CRT$XLAB", long, read) // NOLINT +#pragma section(".CRT$XLAB", long, read) __declspec(allocate(".CRT$XLAB")) void(WINAPI *__weak_intercept_tls_init)( void *, unsigned long, void *) = weak_intercept_thread_init; diff --git a/libsanitizer/tsan/tsan_dispatch_defs.h b/libsanitizer/tsan/tsan_dispatch_defs.h index 6f1d1f75f60..298297af31e 100644 --- a/libsanitizer/tsan/tsan_dispatch_defs.h +++ b/libsanitizer/tsan/tsan_dispatch_defs.h @@ -31,11 +31,11 @@ typedef void (^dispatch_block_t)(void); typedef void (^dispatch_io_handler_t)(bool done, dispatch_data_t data, int error); -typedef long dispatch_once_t; // NOLINT +typedef long dispatch_once_t; typedef __sanitizer::u64 dispatch_time_t; -typedef int dispatch_fd_t; // NOLINT -typedef unsigned long dispatch_io_type_t; // NOLINT -typedef unsigned long dispatch_io_close_flags_t; // NOLINT +typedef int dispatch_fd_t; +typedef unsigned long dispatch_io_type_t; +typedef unsigned long dispatch_io_close_flags_t; extern "C" { void *dispatch_get_context(dispatch_object_t object); @@ -57,10 +57,10 @@ extern const dispatch_block_t _dispatch_data_destructor_munmap; #endif // Data types used in dispatch APIs -typedef unsigned long size_t; // NOLINT -typedef unsigned long uintptr_t; // NOLINT +typedef unsigned long size_t; +typedef unsigned long uintptr_t; typedef __sanitizer::s64 off_t; typedef __sanitizer::u16 mode_t; -typedef long long_t; // NOLINT +typedef long long_t; #endif // TSAN_DISPATCH_DEFS_H diff --git a/libsanitizer/tsan/tsan_external.cpp b/libsanitizer/tsan/tsan_external.cpp index efc1013087c..0faa1ee93a1 100644 --- a/libsanitizer/tsan/tsan_external.cpp +++ b/libsanitizer/tsan/tsan_external.cpp @@ -25,7 +25,7 @@ static TagData registered_tags[kExternalTagMax] = { {}, {"Swift variable", "Swift access race"}, }; -static atomic_uint32_t used_tags{kExternalTagFirstUserAvailable}; // NOLINT. +static atomic_uint32_t used_tags{kExternalTagFirstUserAvailable}; static TagData *GetTagData(uptr tag) { // Invalid/corrupted tag? Better return NULL and let the caller deal with it. if (tag >= atomic_load(&used_tags, memory_order_relaxed)) return nullptr; diff --git a/libsanitizer/tsan/tsan_fd.cpp b/libsanitizer/tsan/tsan_fd.cpp index db01d809531..50a6b56916a 100644 --- a/libsanitizer/tsan/tsan_fd.cpp +++ b/libsanitizer/tsan/tsan_fd.cpp @@ -86,7 +86,8 @@ static FdDesc *fddesc(ThreadState *thr, uptr pc, int fd) { else user_free(thr, pc, p, false); } - return &((FdDesc*)l1)[fd % kTableSizeL2]; // NOLINT + FdDesc *fds = reinterpret_cast(l1); + return &fds[fd % kTableSizeL2]; } // pd must be already ref'ed. diff --git a/libsanitizer/tsan/tsan_libdispatch.cpp b/libsanitizer/tsan/tsan_interceptors_libdispatch.cpp similarity index 99% rename from libsanitizer/tsan/tsan_libdispatch.cpp rename to libsanitizer/tsan/tsan_interceptors_libdispatch.cpp index 5e86ddc4e12..5dacd3256ab 100644 --- a/libsanitizer/tsan/tsan_libdispatch.cpp +++ b/libsanitizer/tsan/tsan_interceptors_libdispatch.cpp @@ -1,4 +1,4 @@ -//===-- tsan_libdispatch.cpp ----------------------------------------------===// +//===-- tsan_interceptors_libdispatch.cpp ---------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -16,6 +16,7 @@ #include "tsan_interceptors.h" #include "tsan_rtl.h" +#include "BlocksRuntime/Block.h" #include "tsan_dispatch_defs.h" namespace __tsan { diff --git a/libsanitizer/tsan/tsan_interceptors_mac.cpp b/libsanitizer/tsan/tsan_interceptors_mac.cpp index c2083f8cde9..aa29536d861 100644 --- a/libsanitizer/tsan/tsan_interceptors_mac.cpp +++ b/libsanitizer/tsan/tsan_interceptors_mac.cpp @@ -23,13 +23,14 @@ #include #include #include +#include #include #if defined(__has_include) && __has_include() #include #endif // #if defined(__has_include) && __has_include() -typedef long long_t; // NOLINT +typedef long long_t; extern "C" { int getcontext(ucontext_t *ucp) __attribute__((returns_twice)); @@ -246,6 +247,45 @@ TSAN_INTERCEPTOR(void, os_lock_unlock, void *lock) { REAL(os_lock_unlock)(lock); } +TSAN_INTERCEPTOR(void, os_unfair_lock_lock, os_unfair_lock_t lock) { + if (!cur_thread()->is_inited || cur_thread()->is_dead) { + return REAL(os_unfair_lock_lock)(lock); + } + SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_lock, lock); + REAL(os_unfair_lock_lock)(lock); + Acquire(thr, pc, (uptr)lock); +} + +TSAN_INTERCEPTOR(void, os_unfair_lock_lock_with_options, os_unfair_lock_t lock, + u32 options) { + if (!cur_thread()->is_inited || cur_thread()->is_dead) { + return REAL(os_unfair_lock_lock_with_options)(lock, options); + } + SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_lock_with_options, lock, options); + REAL(os_unfair_lock_lock_with_options)(lock, options); + Acquire(thr, pc, (uptr)lock); +} + +TSAN_INTERCEPTOR(bool, os_unfair_lock_trylock, os_unfair_lock_t lock) { + if (!cur_thread()->is_inited || cur_thread()->is_dead) { + return REAL(os_unfair_lock_trylock)(lock); + } + SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_trylock, lock); + bool result = REAL(os_unfair_lock_trylock)(lock); + if (result) + Acquire(thr, pc, (uptr)lock); + return result; +} + +TSAN_INTERCEPTOR(void, os_unfair_lock_unlock, os_unfair_lock_t lock) { + if (!cur_thread()->is_inited || cur_thread()->is_dead) { + return REAL(os_unfair_lock_unlock)(lock); + } + SCOPED_TSAN_INTERCEPTOR(os_unfair_lock_unlock, lock); + Release(thr, pc, (uptr)lock); + REAL(os_unfair_lock_unlock)(lock); +} + #if defined(__has_include) && __has_include() TSAN_INTERCEPTOR(void, xpc_connection_set_event_handler, diff --git a/libsanitizer/tsan/tsan_interceptors_mach_vm.cpp b/libsanitizer/tsan/tsan_interceptors_mach_vm.cpp new file mode 100644 index 00000000000..cd318f8af93 --- /dev/null +++ b/libsanitizer/tsan/tsan_interceptors_mach_vm.cpp @@ -0,0 +1,52 @@ +//===-- tsan_interceptors_mach_vm.cpp -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of ThreadSanitizer (TSan), a race detector. +// +// Interceptors for mach_vm_* user space memory routines on Darwin. +//===----------------------------------------------------------------------===// + +#include "interception/interception.h" +#include "tsan_interceptors.h" +#include "tsan_platform.h" + +#include + +namespace __tsan { + +static bool intersects_with_shadow(mach_vm_address_t *address, + mach_vm_size_t size, int flags) { + // VM_FLAGS_FIXED is 0x0, so we have to test for VM_FLAGS_ANYWHERE. + if (flags & VM_FLAGS_ANYWHERE) return false; + uptr ptr = *address; + return !IsAppMem(ptr) || !IsAppMem(ptr + size - 1); +} + +TSAN_INTERCEPTOR(kern_return_t, mach_vm_allocate, vm_map_t target, + mach_vm_address_t *address, mach_vm_size_t size, int flags) { + SCOPED_TSAN_INTERCEPTOR(mach_vm_allocate, target, address, size, flags); + if (target != mach_task_self()) + return REAL(mach_vm_allocate)(target, address, size, flags); + if (intersects_with_shadow(address, size, flags)) + return KERN_NO_SPACE; + kern_return_t res = REAL(mach_vm_allocate)(target, address, size, flags); + if (res == KERN_SUCCESS) + MemoryRangeImitateWriteOrResetRange(thr, pc, *address, size); + return res; +} + +TSAN_INTERCEPTOR(kern_return_t, mach_vm_deallocate, vm_map_t target, + mach_vm_address_t address, mach_vm_size_t size) { + SCOPED_TSAN_INTERCEPTOR(mach_vm_deallocate, target, address, size); + if (target != mach_task_self()) + return REAL(mach_vm_deallocate)(target, address, size); + UnmapShadow(thr, address, size); + return REAL(mach_vm_deallocate)(target, address, size); +} + +} // namespace __tsan diff --git a/libsanitizer/tsan/tsan_interceptors.cpp b/libsanitizer/tsan/tsan_interceptors_posix.cpp similarity index 98% rename from libsanitizer/tsan/tsan_interceptors.cpp rename to libsanitizer/tsan/tsan_interceptors_posix.cpp index 9e1b9ed77be..8aea1e4ec05 100644 --- a/libsanitizer/tsan/tsan_interceptors.cpp +++ b/libsanitizer/tsan/tsan_interceptors_posix.cpp @@ -1,4 +1,4 @@ -//===-- tsan_interceptors.cpp ---------------------------------------------===// +//===-- tsan_interceptors_posix.cpp ---------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -31,8 +31,7 @@ #include "tsan_mman.h" #include "tsan_fd.h" - -using namespace __tsan; // NOLINT +using namespace __tsan; #if SANITIZER_FREEBSD || SANITIZER_MAC #define stdout __stdoutp @@ -41,9 +40,10 @@ using namespace __tsan; // NOLINT #if SANITIZER_NETBSD #define dirfd(dirp) (*(int *)(dirp)) -#define fileno_unlocked(fp) \ - (((__sanitizer_FILE*)fp)->_file == -1 ? -1 : \ - (int)(unsigned short)(((__sanitizer_FILE*)fp)->_file)) // NOLINT +#define fileno_unlocked(fp) \ + (((__sanitizer_FILE *)fp)->_file == -1 \ + ? -1 \ + : (int)(unsigned short)(((__sanitizer_FILE *)fp)->_file)) #define stdout ((__sanitizer_FILE*)&__sF[1]) #define stderr ((__sanitizer_FILE*)&__sF[2]) @@ -114,6 +114,7 @@ const int PTHREAD_MUTEX_RECURSIVE_NP = 2; const int EPOLL_CTL_ADD = 1; #endif const int SIGILL = 4; +const int SIGTRAP = 5; const int SIGABRT = 6; const int SIGFPE = 8; const int SIGSEGV = 11; @@ -133,7 +134,7 @@ const int PTHREAD_BARRIER_SERIAL_THREAD = 1234567; const int PTHREAD_BARRIER_SERIAL_THREAD = -1; #endif const int MAP_FIXED = 0x10; -typedef long long_t; // NOLINT +typedef long long_t; // From /usr/include/unistd.h # define F_ULOCK 0 /* Unlock a previously locked region. */ @@ -723,12 +724,12 @@ TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) { } #endif -TSAN_INTERCEPTOR(char*, strcpy, char *dst, const char *src) { // NOLINT - SCOPED_TSAN_INTERCEPTOR(strcpy, dst, src); // NOLINT +TSAN_INTERCEPTOR(char *, strcpy, char *dst, const char *src) { + SCOPED_TSAN_INTERCEPTOR(strcpy, dst, src); uptr srclen = internal_strlen(src); MemoryAccessRange(thr, pc, (uptr)dst, srclen + 1, true); MemoryAccessRange(thr, pc, (uptr)src, srclen + 1, false); - return REAL(strcpy)(dst, src); // NOLINT + return REAL(strcpy)(dst, src); } TSAN_INTERCEPTOR(char*, strncpy, char *dst, char *src, uptr n) { @@ -745,6 +746,8 @@ TSAN_INTERCEPTOR(char*, strdup, const char *str) { return REAL(strdup)(str); } +// Zero out addr if it points into shadow memory and was provided as a hint +// only, i.e., MAP_FIXED is not set. static bool fix_mmap_addr(void **addr, long_t sz, int flags) { if (*addr) { if (!IsAppMem((uptr)*addr) || !IsAppMem((uptr)*addr + sz - 1)) { @@ -767,22 +770,14 @@ static void *mmap_interceptor(ThreadState *thr, uptr pc, Mmap real_mmap, void *res = real_mmap(addr, sz, prot, flags, fd, off); if (res != MAP_FAILED) { if (fd > 0) FdAccess(thr, pc, fd); - if (thr->ignore_reads_and_writes == 0) - MemoryRangeImitateWrite(thr, pc, (uptr)res, sz); - else - MemoryResetRange(thr, pc, (uptr)res, sz); + MemoryRangeImitateWriteOrResetRange(thr, pc, (uptr)res, sz); } return res; } TSAN_INTERCEPTOR(int, munmap, void *addr, long_t sz) { SCOPED_TSAN_INTERCEPTOR(munmap, addr, sz); - if (sz != 0) { - // If sz == 0, munmap will return EINVAL and don't unmap any memory. - DontNeedShadowFor((uptr)addr, sz); - ScopedGlobalProcessor sgp; - ctx->metamap.ResetRange(thr->proc(), (uptr)addr, (uptr)sz); - } + UnmapShadow(thr, (uptr)addr, sz); int res = REAL(munmap)(addr, sz); return res; } @@ -1968,10 +1963,10 @@ void ProcessPendingSignals(ThreadState *thr) { } // namespace __tsan static bool is_sync_signal(ThreadSignalContext *sctx, int sig) { - return sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || - sig == SIGABRT || sig == SIGFPE || sig == SIGPIPE || sig == SIGSYS || - // If we are sending signal to ourselves, we must process it now. - (sctx && sig == sctx->int_signal_send); + return sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || sig == SIGTRAP || + sig == SIGABRT || sig == SIGFPE || sig == SIGPIPE || sig == SIGSYS || + // If we are sending signal to ourselves, we must process it now. + (sctx && sig == sctx->int_signal_send); } void ALWAYS_INLINE rtl_generic_sighandler(bool sigact, int sig, @@ -2666,7 +2661,7 @@ void InitializeInterceptors() { TSAN_MAYBE_INTERCEPT_PVALLOC; TSAN_INTERCEPT(posix_memalign); - TSAN_INTERCEPT(strcpy); // NOLINT + TSAN_INTERCEPT(strcpy); TSAN_INTERCEPT(strncpy); TSAN_INTERCEPT(strdup); diff --git a/libsanitizer/tsan/tsan_interface.cpp b/libsanitizer/tsan/tsan_interface.cpp index 845d8c8520c..2b3a0889b70 100644 --- a/libsanitizer/tsan/tsan_interface.cpp +++ b/libsanitizer/tsan/tsan_interface.cpp @@ -17,7 +17,7 @@ #define CALLERPC ((uptr)__builtin_return_address(0)) -using namespace __tsan; // NOLINT +using namespace __tsan; typedef u16 uint16_t; typedef u32 uint32_t; diff --git a/libsanitizer/tsan/tsan_interface.h b/libsanitizer/tsan/tsan_interface.h index fac57809aa2..6d7286ca5b8 100644 --- a/libsanitizer/tsan/tsan_interface.h +++ b/libsanitizer/tsan/tsan_interface.h @@ -90,9 +90,14 @@ SANITIZER_INTERFACE_ATTRIBUTE void __tsan_external_write(void *addr, void *caller_pc, void *tag); SANITIZER_INTERFACE_ATTRIBUTE -void __tsan_read_range(void *addr, unsigned long size); // NOLINT +void __tsan_read_range(void *addr, unsigned long size); SANITIZER_INTERFACE_ATTRIBUTE -void __tsan_write_range(void *addr, unsigned long size); // NOLINT +void __tsan_write_range(void *addr, unsigned long size); + +SANITIZER_INTERFACE_ATTRIBUTE +void __tsan_read_range_pc(void *addr, unsigned long size, void *pc); // NOLINT +SANITIZER_INTERFACE_ATTRIBUTE +void __tsan_write_range_pc(void *addr, unsigned long size, void *pc); // NOLINT // User may provide function that would be called right when TSan detects // an error. The argument 'report' is an opaque pointer that can be used to @@ -187,9 +192,9 @@ namespace __tsan { // These should match declarations from public tsan_interface_atomic.h header. typedef unsigned char a8; -typedef unsigned short a16; // NOLINT +typedef unsigned short a16; typedef unsigned int a32; -typedef unsigned long long a64; // NOLINT +typedef unsigned long long a64; #if !SANITIZER_GO && (defined(__SIZEOF_INT128__) \ || (__clang_major__ * 100 + __clang_minor__ >= 302)) && !defined(__mips64) __extension__ typedef __int128 a128; diff --git a/libsanitizer/tsan/tsan_interface_ann.cpp b/libsanitizer/tsan/tsan_interface_ann.cpp index 288485c17fa..99516d94bba 100644 --- a/libsanitizer/tsan/tsan_interface_ann.cpp +++ b/libsanitizer/tsan/tsan_interface_ann.cpp @@ -24,7 +24,7 @@ #define CALLERPC ((uptr)__builtin_return_address(0)) -using namespace __tsan; // NOLINT +using namespace __tsan; namespace __tsan { @@ -220,7 +220,7 @@ static void ReportMissedExpectedRace(ExpectRace *race) { } } // namespace __tsan -using namespace __tsan; // NOLINT +using namespace __tsan; extern "C" { void INTERFACE_ATTRIBUTE AnnotateHappensBefore(char *f, int l, uptr addr) { diff --git a/libsanitizer/tsan/tsan_interface_atomic.cpp b/libsanitizer/tsan/tsan_interface_atomic.cpp index 730a8e63f74..3f459aff532 100644 --- a/libsanitizer/tsan/tsan_interface_atomic.cpp +++ b/libsanitizer/tsan/tsan_interface_atomic.cpp @@ -25,7 +25,7 @@ #include "tsan_interface.h" #include "tsan_rtl.h" -using namespace __tsan; // NOLINT +using namespace __tsan; #if !SANITIZER_GO && __TSAN_HAS_INT128 // Protects emulation of 128-bit atomic operations. diff --git a/libsanitizer/tsan/tsan_interface_inl.h b/libsanitizer/tsan/tsan_interface_inl.h index bf4a1658625..f955ddf9924 100644 --- a/libsanitizer/tsan/tsan_interface_inl.h +++ b/libsanitizer/tsan/tsan_interface_inl.h @@ -15,7 +15,7 @@ #define CALLERPC ((uptr)__builtin_return_address(0)) -using namespace __tsan; // NOLINT +using namespace __tsan; void __tsan_read1(void *addr) { MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog1); @@ -122,3 +122,11 @@ void __tsan_read_range(void *addr, uptr size) { void __tsan_write_range(void *addr, uptr size) { MemoryAccessRange(cur_thread(), CALLERPC, (uptr)addr, size, true); } + +void __tsan_read_range_pc(void *addr, uptr size, void *pc) { + MemoryAccessRange(cur_thread(), (uptr)pc, (uptr)addr, size, false); +} + +void __tsan_write_range_pc(void *addr, uptr size, void *pc) { + MemoryAccessRange(cur_thread(), (uptr)pc, (uptr)addr, size, true); +} diff --git a/libsanitizer/tsan/tsan_interface_java.cpp b/libsanitizer/tsan/tsan_interface_java.cpp index 7d3d32fdbe0..081c6ff1022 100644 --- a/libsanitizer/tsan/tsan_interface_java.cpp +++ b/libsanitizer/tsan/tsan_interface_java.cpp @@ -19,7 +19,7 @@ #include "sanitizer_common/sanitizer_stacktrace.h" #include "sanitizer_common/sanitizer_procmaps.h" -using namespace __tsan; // NOLINT +using namespace __tsan; const jptr kHeapAlignment = 8; diff --git a/libsanitizer/tsan/tsan_interface_java.h b/libsanitizer/tsan/tsan_interface_java.h index 93e67bd10b1..51b445251e0 100644 --- a/libsanitizer/tsan/tsan_interface_java.h +++ b/libsanitizer/tsan/tsan_interface_java.h @@ -31,7 +31,7 @@ extern "C" { #endif -typedef unsigned long jptr; // NOLINT +typedef unsigned long jptr; // Must be called before any other callback from Java. void __tsan_java_init(jptr heap_begin, jptr heap_size) INTERFACE_ATTRIBUTE; diff --git a/libsanitizer/tsan/tsan_md5.cpp b/libsanitizer/tsan/tsan_md5.cpp index d146e1cc35f..72857b773fe 100644 --- a/libsanitizer/tsan/tsan_md5.cpp +++ b/libsanitizer/tsan/tsan_md5.cpp @@ -29,7 +29,7 @@ namespace __tsan { SET(n) typedef unsigned int MD5_u32plus; -typedef unsigned long ulong_t; // NOLINT +typedef unsigned long ulong_t; typedef struct { MD5_u32plus lo, hi; diff --git a/libsanitizer/tsan/tsan_mman.h b/libsanitizer/tsan/tsan_mman.h index 467aabdf2b9..a5280d4472c 100644 --- a/libsanitizer/tsan/tsan_mman.h +++ b/libsanitizer/tsan/tsan_mman.h @@ -79,11 +79,10 @@ enum MBlockType { void *internal_alloc(MBlockType typ, uptr sz); void internal_free(void *p); -template -void DestroyAndFree(T *&p) { +template +void DestroyAndFree(T *p) { p->~T(); internal_free(p); - p = 0; } } // namespace __tsan diff --git a/libsanitizer/tsan/tsan_new_delete.cpp b/libsanitizer/tsan/tsan_new_delete.cpp index 3ed3c847a9a..fc44a5221b5 100644 --- a/libsanitizer/tsan/tsan_new_delete.cpp +++ b/libsanitizer/tsan/tsan_new_delete.cpp @@ -17,7 +17,7 @@ #include "tsan_interceptors.h" #include "tsan_rtl.h" -using namespace __tsan; // NOLINT +using namespace __tsan; namespace std { struct nothrow_t {}; diff --git a/libsanitizer/tsan/tsan_platform.h b/libsanitizer/tsan/tsan_platform.h index 0d106c4147c..63eb14fcd34 100644 --- a/libsanitizer/tsan/tsan_platform.h +++ b/libsanitizer/tsan/tsan_platform.h @@ -457,6 +457,8 @@ struct Mapping47 { static const uptr kAppMemEnd = 0x00e000000000ull; }; +#define TSAN_RUNTIME_VMA 1 + #elif SANITIZER_GO && defined(__aarch64__) /* Go on linux/aarch64 (48-bit VMA) diff --git a/libsanitizer/tsan/tsan_report.cpp b/libsanitizer/tsan/tsan_report.cpp index 655aa5f9123..368f1ca8adf 100644 --- a/libsanitizer/tsan/tsan_report.cpp +++ b/libsanitizer/tsan/tsan_report.cpp @@ -298,7 +298,7 @@ static bool FrameIsInternal(const SymbolizedStack *frame) { const char *file = frame->info.file; const char *module = frame->info.module; if (file != 0 && - (internal_strstr(file, "tsan_interceptors.cpp") || + (internal_strstr(file, "tsan_interceptors_posix.cpp") || internal_strstr(file, "sanitizer_common_interceptors.inc") || internal_strstr(file, "tsan_interface_"))) return true; diff --git a/libsanitizer/tsan/tsan_rtl.cpp b/libsanitizer/tsan/tsan_rtl.cpp index 1ac3907094b..3f3c0cce119 100644 --- a/libsanitizer/tsan/tsan_rtl.cpp +++ b/libsanitizer/tsan/tsan_rtl.cpp @@ -239,6 +239,15 @@ void DontNeedShadowFor(uptr addr, uptr size) { ReleaseMemoryPagesToOS(MemToShadow(addr), MemToShadow(addr + size)); } +#if !SANITIZER_GO +void UnmapShadow(ThreadState *thr, uptr addr, uptr size) { + if (size == 0) return; + DontNeedShadowFor(addr, size); + ScopedGlobalProcessor sgp; + ctx->metamap.ResetRange(thr->proc(), addr, size); +} +#endif + void MapShadow(uptr addr, uptr size) { // Global data is not 64K aligned, but there are no adjacent mappings, // so we can get away with unaligned mapping. @@ -329,7 +338,7 @@ static void CheckShadowMapping() { #if !SANITIZER_GO static void OnStackUnwind(const SignalContext &sig, const void *, BufferedStackTrace *stack) { - stack->Unwind(sig.pc, sig.bp, sig.context, + stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context, common_flags()->fast_unwind_on_fatal); } @@ -987,6 +996,14 @@ void MemoryRangeImitateWrite(ThreadState *thr, uptr pc, uptr addr, uptr size) { MemoryRangeSet(thr, pc, addr, size, s.raw()); } +void MemoryRangeImitateWriteOrResetRange(ThreadState *thr, uptr pc, uptr addr, + uptr size) { + if (thr->ignore_reads_and_writes == 0) + MemoryRangeImitateWrite(thr, pc, addr, size); + else + MemoryResetRange(thr, pc, addr, size); +} + ALWAYS_INLINE USED void FuncEntry(ThreadState *thr, uptr pc) { StatInc(thr, StatFuncEnter); diff --git a/libsanitizer/tsan/tsan_rtl.h b/libsanitizer/tsan/tsan_rtl.h index 3a8231bda9a..c38fc43a9f8 100644 --- a/libsanitizer/tsan/tsan_rtl.h +++ b/libsanitizer/tsan/tsan_rtl.h @@ -238,7 +238,7 @@ class Shadow : public FastState { unsigned kS2AccessSize) { bool res = false; u64 diff = s1.addr0() - s2.addr0(); - if ((s64)diff < 0) { // s1.addr0 < s2.addr0 // NOLINT + if ((s64)diff < 0) { // s1.addr0 < s2.addr0 // if (s1.addr0() + size1) > s2.addr0()) return true; if (s1.size() > -diff) res = true; @@ -680,6 +680,7 @@ void ALWAYS_INLINE StatSet(ThreadState *thr, StatType typ, u64 n) { void MapShadow(uptr addr, uptr size); void MapThreadTrace(uptr addr, uptr size, const char *name); void DontNeedShadowFor(uptr addr, uptr size); +void UnmapShadow(ThreadState *thr, uptr addr, uptr size); void InitializeShadowMemory(); void InitializeInterceptors(); void InitializeLibIgnore(); @@ -759,6 +760,8 @@ void ALWAYS_INLINE MemoryWriteAtomic(ThreadState *thr, uptr pc, void MemoryResetRange(ThreadState *thr, uptr pc, uptr addr, uptr size); void MemoryRangeFreed(ThreadState *thr, uptr pc, uptr addr, uptr size); void MemoryRangeImitateWrite(ThreadState *thr, uptr pc, uptr addr, uptr size); +void MemoryRangeImitateWriteOrResetRange(ThreadState *thr, uptr pc, uptr addr, + uptr size); void ThreadIgnoreBegin(ThreadState *thr, uptr pc, bool save_stack = true); void ThreadIgnoreEnd(ThreadState *thr, uptr pc); diff --git a/libsanitizer/tsan/tsan_rtl_ppc64.S b/libsanitizer/tsan/tsan_rtl_ppc64.S index 9e533a71a9c..8285e21aa1e 100644 --- a/libsanitizer/tsan/tsan_rtl_ppc64.S +++ b/libsanitizer/tsan/tsan_rtl_ppc64.S @@ -1,6 +1,5 @@ #include "tsan_ppc_regs.h" - .machine altivec .section .text .hidden __tsan_setjmp .globl _setjmp diff --git a/libsanitizer/tsan/tsan_rtl_report.cpp b/libsanitizer/tsan/tsan_rtl_report.cpp index 47b8bf77dca..949beac1c55 100644 --- a/libsanitizer/tsan/tsan_rtl_report.cpp +++ b/libsanitizer/tsan/tsan_rtl_report.cpp @@ -27,7 +27,7 @@ namespace __tsan { -using namespace __sanitizer; // NOLINT +using namespace __sanitizer; static ReportStack *SymbolizeStack(StackTrace trace); @@ -154,6 +154,7 @@ ScopedReportBase::ScopedReportBase(ReportType typ, uptr tag) { ScopedReportBase::~ScopedReportBase() { ctx->report_mtx.Unlock(); DestroyAndFree(rep_); + rep_ = nullptr; } void ScopedReportBase::AddStack(StackTrace stack, bool suppressable) { @@ -700,7 +701,7 @@ void ReportRace(ThreadState *thr) { rep.AddLocation(addr_min, addr_max - addr_min); #if !SANITIZER_GO - { // NOLINT + { Shadow s(thr->racy_state[1]); if (s.epoch() <= thr->last_sleep_clock.get(s.tid())) rep.AddSleep(thr->last_sleep_stack_id); diff --git a/libsanitizer/tsan/tsan_suppressions.cpp b/libsanitizer/tsan/tsan_suppressions.cpp index 6bf6720210a..a1c1bf81bf6 100644 --- a/libsanitizer/tsan/tsan_suppressions.cpp +++ b/libsanitizer/tsan/tsan_suppressions.cpp @@ -50,7 +50,7 @@ static const char *kSuppressionTypes[] = { void InitializeSuppressions() { CHECK_EQ(nullptr, suppression_ctx); - suppression_ctx = new (suppression_placeholder) // NOLINT + suppression_ctx = new (suppression_placeholder) SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes)); suppression_ctx->ParseFromFile(flags()->suppressions); #if !SANITIZER_GO diff --git a/libsanitizer/ubsan/ubsan_checks.inc b/libsanitizer/ubsan/ubsan_checks.inc index 7e7216c5b4a..33a8dfcde02 100644 --- a/libsanitizer/ubsan/ubsan_checks.inc +++ b/libsanitizer/ubsan/ubsan_checks.inc @@ -18,6 +18,11 @@ UBSAN_CHECK(GenericUB, "undefined-behavior", "undefined") UBSAN_CHECK(NullPointerUse, "null-pointer-use", "null") +UBSAN_CHECK(NullptrWithOffset, "nullptr-with-offset", "pointer-overflow") +UBSAN_CHECK(NullptrWithNonZeroOffset, "nullptr-with-nonzero-offset", + "pointer-overflow") +UBSAN_CHECK(NullptrAfterNonZeroOffset, "nullptr-after-nonzero-offset", + "pointer-overflow") UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow") UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment") UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment") diff --git a/libsanitizer/ubsan/ubsan_diag.cpp b/libsanitizer/ubsan/ubsan_diag.cpp index c8f7960db42..1b2828d236d 100644 --- a/libsanitizer/ubsan/ubsan_diag.cpp +++ b/libsanitizer/ubsan/ubsan_diag.cpp @@ -404,7 +404,7 @@ static const char *kSuppressionTypes[] = { void __ubsan::InitializeSuppressions() { CHECK_EQ(nullptr, suppression_ctx); - suppression_ctx = new (suppression_placeholder) // NOLINT + suppression_ctx = new (suppression_placeholder) SuppressionContext(kSuppressionTypes, ARRAY_SIZE(kSuppressionTypes)); suppression_ctx->ParseFromFile(flags()->suppressions); } diff --git a/libsanitizer/ubsan/ubsan_flags.cpp b/libsanitizer/ubsan/ubsan_flags.cpp index 80de2a6d101..721c2273f13 100644 --- a/libsanitizer/ubsan/ubsan_flags.cpp +++ b/libsanitizer/ubsan/ubsan_flags.cpp @@ -54,7 +54,6 @@ void InitializeFlags() { { CommonFlags cf; cf.CopyFrom(*common_flags()); - cf.print_summary = false; cf.external_symbolizer_path = GetFlag("UBSAN_SYMBOLIZER_PATH"); OverrideCommonFlags(cf); } diff --git a/libsanitizer/ubsan/ubsan_handlers.cpp b/libsanitizer/ubsan/ubsan_handlers.cpp index 6099e3631e7..3f9da75a12a 100644 --- a/libsanitizer/ubsan/ubsan_handlers.cpp +++ b/libsanitizer/ubsan/ubsan_handlers.cpp @@ -691,14 +691,33 @@ static void handlePointerOverflowImpl(PointerOverflowData *Data, ValueHandle Result, ReportOptions Opts) { SourceLocation Loc = Data->Loc.acquire(); - ErrorType ET = ErrorType::PointerOverflow; + ErrorType ET; + + if (Base == 0 && Result == 0) + ET = ErrorType::NullptrWithOffset; + else if (Base == 0 && Result != 0) + ET = ErrorType::NullptrWithNonZeroOffset; + else if (Base != 0 && Result == 0) + ET = ErrorType::NullptrAfterNonZeroOffset; + else + ET = ErrorType::PointerOverflow; if (ignoreReport(Loc, Opts, ET)) return; ScopedReport R(Opts, Loc, ET); - if ((sptr(Base) >= 0) == (sptr(Result) >= 0)) { + if (ET == ErrorType::NullptrWithOffset) { + Diag(Loc, DL_Error, ET, "applying zero offset to null pointer"); + } else if (ET == ErrorType::NullptrWithNonZeroOffset) { + Diag(Loc, DL_Error, ET, "applying non-zero offset %0 to null pointer") + << Result; + } else if (ET == ErrorType::NullptrAfterNonZeroOffset) { + Diag( + Loc, DL_Error, ET, + "applying non-zero offset to non-null pointer %0 produced null pointer") + << (void *)Base; + } else if ((sptr(Base) >= 0) == (sptr(Result) >= 0)) { if (Base > Result) Diag(Loc, DL_Error, ET, "addition of unsigned offset to %0 overflowed to %1") @@ -800,21 +819,6 @@ void __ubsan_handle_cfi_bad_type(CFICheckFailData *Data, ValueHandle Vtable, } // namespace __ubsan -void __ubsan::__ubsan_handle_cfi_bad_icall(CFIBadIcallData *CallData, - ValueHandle Function) { - GET_REPORT_OPTIONS(false); - CFICheckFailData Data = {CFITCK_ICall, CallData->Loc, CallData->Type}; - handleCFIBadIcall(&Data, Function, Opts); -} - -void __ubsan::__ubsan_handle_cfi_bad_icall_abort(CFIBadIcallData *CallData, - ValueHandle Function) { - GET_REPORT_OPTIONS(true); - CFICheckFailData Data = {CFITCK_ICall, CallData->Loc, CallData->Type}; - handleCFIBadIcall(&Data, Function, Opts); - Die(); -} - void __ubsan::__ubsan_handle_cfi_check_fail(CFICheckFailData *Data, ValueHandle Value, uptr ValidVtable) { diff --git a/libsanitizer/ubsan/ubsan_handlers.h b/libsanitizer/ubsan/ubsan_handlers.h index eba1cf918fc..22ca9642238 100644 --- a/libsanitizer/ubsan/ubsan_handlers.h +++ b/libsanitizer/ubsan/ubsan_handlers.h @@ -207,20 +207,12 @@ enum CFITypeCheckKind : unsigned char { CFITCK_VMFCall, }; -struct CFIBadIcallData { - SourceLocation Loc; - const TypeDescriptor &Type; -}; - struct CFICheckFailData { CFITypeCheckKind CheckKind; SourceLocation Loc; const TypeDescriptor &Type; }; -/// \brief Handle control flow integrity failure for indirect function calls. -RECOVERABLE(cfi_bad_icall, CFIBadIcallData *Data, ValueHandle Function) - /// \brief Handle control flow integrity failures. RECOVERABLE(cfi_check_fail, CFICheckFailData *Data, ValueHandle Function, uptr VtableIsValid) diff --git a/libsanitizer/ubsan/ubsan_platform.h b/libsanitizer/ubsan/ubsan_platform.h index 58aabbe67b5..71d7fb18c9b 100644 --- a/libsanitizer/ubsan/ubsan_platform.h +++ b/libsanitizer/ubsan/ubsan_platform.h @@ -12,7 +12,6 @@ #ifndef UBSAN_PLATFORM_H #define UBSAN_PLATFORM_H -#ifndef CAN_SANITIZE_UB // Other platforms should be easy to add, and probably work as-is. #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || \ defined(__NetBSD__) || defined(__OpenBSD__) || \ @@ -22,6 +21,5 @@ #else # define CAN_SANITIZE_UB 0 #endif -#endif //CAN_SANITIZE_UB #endif diff --git a/libsanitizer/ubsan/ubsan_signals_standalone.cpp b/libsanitizer/ubsan/ubsan_signals_standalone.cpp index 627b3c4d89b..2c91db8ca39 100644 --- a/libsanitizer/ubsan/ubsan_signals_standalone.cpp +++ b/libsanitizer/ubsan/ubsan_signals_standalone.cpp @@ -45,8 +45,9 @@ namespace __ubsan { static void OnStackUnwind(const SignalContext &sig, const void *, BufferedStackTrace *stack) { - ubsan_GetStackTrace(stack, kStackTraceMax, sig.pc, sig.bp, sig.context, - common_flags()->fast_unwind_on_fatal); + ubsan_GetStackTrace(stack, kStackTraceMax, + StackTrace::GetNextInstructionPc(sig.pc), sig.bp, + sig.context, common_flags()->fast_unwind_on_fatal); } static void UBsanOnDeadlySignal(int signo, void *siginfo, void *context) { -- 2.30.2