diff options
Diffstat (limited to 'lib/asan')
-rw-r--r-- | lib/asan/asan_flags.inc | 2 | ||||
-rw-r--r-- | lib/asan/asan_interface_internal.h | 4 | ||||
-rw-r--r-- | lib/asan/asan_poisoning.cc | 2 | ||||
-rw-r--r-- | lib/asan/asan_rtl.cc | 5 | ||||
-rw-r--r-- | lib/asan/asan_win.cc | 6 | ||||
-rw-r--r-- | lib/asan/asan_win_dll_thunk.cc | 4 | ||||
-rw-r--r-- | lib/asan/asan_win_dynamic_runtime_thunk.cc | 18 |
7 files changed, 40 insertions, 1 deletions
diff --git a/lib/asan/asan_flags.inc b/lib/asan/asan_flags.inc index 9496a4749..805002a61 100644 --- a/lib/asan/asan_flags.inc +++ b/lib/asan/asan_flags.inc @@ -46,6 +46,8 @@ ASAN_FLAG(bool, replace_intrin, true, "If set, uses custom wrappers for memset/memcpy/memmove intrinsics.") ASAN_FLAG(bool, detect_stack_use_after_return, false, "Enables stack-use-after-return checking at run-time.") +ASAN_FLAG(bool, detect_stack_use_after_scope, true, + "Enables stack-use-after-scope checking at run-time.") ASAN_FLAG(int, min_uar_stack_size_log, 16, // We can't do smaller anyway. "Minimum fake stack size log.") ASAN_FLAG(int, max_uar_stack_size_log, diff --git a/lib/asan/asan_interface_internal.h b/lib/asan/asan_interface_internal.h index 3cf3413dc..e6aede0cb 100644 --- a/lib/asan/asan_interface_internal.h +++ b/lib/asan/asan_interface_internal.h @@ -160,6 +160,10 @@ extern "C" { SANITIZER_INTERFACE_ATTRIBUTE extern int __asan_option_detect_stack_use_after_return; +// Global flag, copy of ASAN_OPTIONS=detect_stack_use_after_scope + SANITIZER_INTERFACE_ATTRIBUTE + extern int __asan_option_detect_stack_use_after_scope; + SANITIZER_INTERFACE_ATTRIBUTE extern uptr *__asan_test_only_reported_buggy_pointer; diff --git a/lib/asan/asan_poisoning.cc b/lib/asan/asan_poisoning.cc index 50877ae59..e6a22e257 100644 --- a/lib/asan/asan_poisoning.cc +++ b/lib/asan/asan_poisoning.cc @@ -315,11 +315,13 @@ static void PoisonAlignedStackMemory(uptr addr, uptr size, bool do_poison) { } void __asan_poison_stack_memory(uptr addr, uptr size) { + if (!__asan_option_detect_stack_use_after_scope) return; VReport(1, "poisoning: %p %zx\n", (void *)addr, size); PoisonAlignedStackMemory(addr, size, true); } void __asan_unpoison_stack_memory(uptr addr, uptr size) { + if (!__asan_option_detect_stack_use_after_scope) return; VReport(1, "unpoisoning: %p %zx\n", (void *)addr, size); PoisonAlignedStackMemory(addr, size, false); } diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc index 4962b9ee1..b6297daf9 100644 --- a/lib/asan/asan_rtl.cc +++ b/lib/asan/asan_rtl.cc @@ -33,6 +33,7 @@ #include "ubsan/ubsan_platform.h" int __asan_option_detect_stack_use_after_return; // Global interface symbol. +int __asan_option_detect_stack_use_after_scope; // Global interface symbol. uptr *__asan_test_only_reported_buggy_pointer; // Used only for testing asan. namespace __asan { @@ -434,10 +435,12 @@ static void AsanInitInternal() { __sanitizer_set_report_path(common_flags()->log_path); - // Enable UAR detection, if required. __asan_option_detect_stack_use_after_return = flags()->detect_stack_use_after_return; + __asan_option_detect_stack_use_after_scope = + flags()->detect_stack_use_after_scope; + // Re-exec ourselves if we need to set additional env or command line args. MaybeReexec(); diff --git a/lib/asan/asan_win.cc b/lib/asan/asan_win.cc index 2ef78cd15..87b36d9fc 100644 --- a/lib/asan/asan_win.cc +++ b/lib/asan/asan_win.cc @@ -37,6 +37,12 @@ int __asan_should_detect_stack_use_after_return() { return __asan_option_detect_stack_use_after_return; } +SANITIZER_INTERFACE_ATTRIBUTE +int __asan_should_detect_stack_use_after_scope() { + __asan_init(); + return __asan_option_detect_stack_use_after_scope; +} + // -------------------- A workaround for the abscence 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 diff --git a/lib/asan/asan_win_dll_thunk.cc b/lib/asan/asan_win_dll_thunk.cc index f55588613..912144b69 100644 --- a/lib/asan/asan_win_dll_thunk.cc +++ b/lib/asan/asan_win_dll_thunk.cc @@ -198,9 +198,11 @@ static void InterceptHooks(); // Don't use the INTERFACE_FUNCTION machinery for this function as we actually // want to call it in the __asan_init interceptor. WRAP_W_V(__asan_should_detect_stack_use_after_return) +WRAP_W_V(__asan_should_detect_stack_use_after_scope) extern "C" { int __asan_option_detect_stack_use_after_return; + int __asan_option_detect_stack_use_after_scope; // Manually wrap __asan_init as we need to initialize // __asan_option_detect_stack_use_after_return afterwards. @@ -214,6 +216,8 @@ extern "C" { fn(); __asan_option_detect_stack_use_after_return = (__asan_should_detect_stack_use_after_return() != 0); + __asan_option_detect_stack_use_after_scope = + (__asan_should_detect_stack_use_after_scope() != 0); InterceptHooks(); } diff --git a/lib/asan/asan_win_dynamic_runtime_thunk.cc b/lib/asan/asan_win_dynamic_runtime_thunk.cc index 1175522e7..6dd65b1b5 100644 --- a/lib/asan/asan_win_dynamic_runtime_thunk.cc +++ b/lib/asan/asan_win_dynamic_runtime_thunk.cc @@ -15,6 +15,7 @@ // // This includes: // - forwarding the detect_stack_use_after_return runtime option +// - forwarding the detect_stack_use_after_scope runtime option // - working around deficiencies of the MD runtime // - installing a custom SEH handlerx // @@ -51,6 +52,23 @@ int __asan_option_detect_stack_use_after_return = } //////////////////////////////////////////////////////////////////////////////// +// Define a copy of __asan_option_detect_stack_use_after_scope that should be +// used when linking an MD runtime with a set of object files on Windows. +// +// The ASan MD runtime dllexports '__asan_option_detect_stack_use_after_scope', +// so normally we would just dllimport it. Unfortunately, the dllimport +// attribute adds __imp_ prefix to the symbol name of a variable. +// Since in general we don't know if a given TU is going to be used +// with a MT or MD runtime and we don't want to use ugly __imp_ names on Windows +// just to work around this issue, let's clone the a variable that is +// constant after initialization anyways. +extern "C" { +__declspec(dllimport) int __asan_should_detect_stack_use_after_scope(); +int __asan_option_detect_stack_use_after_scope = + __asan_should_detect_stack_use_after_scope(); +} + +//////////////////////////////////////////////////////////////////////////////// // For some reason, the MD CRT doesn't call the C/C++ terminators during on DLL // unload or on exit. ASan relies on LLVM global_dtors to call // __asan_unregister_globals on these events, which unfortunately doesn't work |