diff options
Diffstat (limited to 'libsanitizer/sanitizer_common/sanitizer_common.cc')
-rw-r--r-- | libsanitizer/sanitizer_common/sanitizer_common.cc | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_common.cc b/libsanitizer/sanitizer_common/sanitizer_common.cc index 0d93527aa5e..e76d4d558a1 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.cc +++ b/libsanitizer/sanitizer_common/sanitizer_common.cc @@ -91,7 +91,7 @@ uptr ReadFileToBuffer(const char *file_name, char **buff, if (internal_iserror(openrv)) return 0; fd_t fd = openrv; UnmapOrDie(*buff, *buff_size); - *buff = (char*)MmapOrDie(size, __FUNCTION__); + *buff = (char*)MmapOrDie(size, __func__); *buff_size = size; // Read up to one page at a time. read_len = 0; @@ -200,11 +200,11 @@ void ReportErrorSummary(const char *error_type, StackTrace *stack) { return; AddressInfo ai; #if !SANITIZER_GO - if (stack->size > 0 && Symbolizer::Get()->IsAvailable()) { + if (stack->size > 0 && Symbolizer::Get()->CanReturnFileLineInfo()) { // Currently, we include the first stack frame into the report summary. // Maybe sometimes we need to choose another frame (e.g. skip memcpy/etc). uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]); - Symbolizer::Get()->SymbolizeCode(pc, &ai, 1); + Symbolizer::Get()->SymbolizePC(pc, &ai, 1); } #endif ReportErrorSummary(error_type, ai.file, ai.line, ai.function); @@ -242,6 +242,30 @@ char *StripModuleName(const char *module) { return internal_strdup(short_module_name); } +static atomic_uintptr_t g_total_mmaped; + +void IncreaseTotalMmap(uptr size) { + if (!common_flags()->mmap_limit_mb) return; + uptr total_mmaped = + atomic_fetch_add(&g_total_mmaped, size, memory_order_relaxed) + size; + if ((total_mmaped >> 20) > common_flags()->mmap_limit_mb) { + // Since for now mmap_limit_mb is not a user-facing flag, just CHECK. + uptr mmap_limit_mb = common_flags()->mmap_limit_mb; + common_flags()->mmap_limit_mb = 0; // Allow mmap in CHECK. + RAW_CHECK(total_mmaped >> 20 < mmap_limit_mb); + } +} + +void DecreaseTotalMmap(uptr size) { + if (!common_flags()->mmap_limit_mb) return; + atomic_fetch_sub(&g_total_mmaped, size, memory_order_relaxed); +} + +static void (*sandboxing_callback)(); +void SetSandboxingCallback(void (*f)()) { + sandboxing_callback = f; +} + } // namespace __sanitizer using namespace __sanitizer; // NOLINT @@ -274,9 +298,11 @@ void __sanitizer_set_report_path(const char *path) { } } -void NOINLINE __sanitizer_sandbox_on_notify(void *reserved) { - (void)reserved; - PrepareForSandboxing(); +void NOINLINE +__sanitizer_sandbox_on_notify(__sanitizer_sandbox_arguments *args) { + PrepareForSandboxing(args); + if (sandboxing_callback) + sandboxing_callback(); } void __sanitizer_report_error_summary(const char *error_summary) { |