summaryrefslogtreecommitdiff
path: root/packaging/0002-Fix-asan-false-positive-errors-15563.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/0002-Fix-asan-false-positive-errors-15563.patch')
-rw-r--r--packaging/0002-Fix-asan-false-positive-errors-15563.patch232
1 files changed, 232 insertions, 0 deletions
diff --git a/packaging/0002-Fix-asan-false-positive-errors-15563.patch b/packaging/0002-Fix-asan-false-positive-errors-15563.patch
new file mode 100644
index 0000000000..05b649c55f
--- /dev/null
+++ b/packaging/0002-Fix-asan-false-positive-errors-15563.patch
@@ -0,0 +1,232 @@
+From 99bc9451f0dff634101734c53358f2bea88b2d83 Mon Sep 17 00:00:00 2001
+From: Konstantin Baladurin <k.baladurin@partner.samsung.com>
+Date: Fri, 26 Jan 2018 01:19:19 +0300
+Subject: [PATCH 2/4] Fix asan false-positive errors: (#15563)
+
+- Call __asan_handle_no_return in RtlRestoreContext if it doesn't return
+ and in ThrowExceptionFromContextInternal function;
+
+- Increase alternate signal stack size and use it also for asan.
+---
+ CMakeLists.txt | 1 +
+ enablesanitizers.sh | 7 ++++---
+ src/pal/src/arch/amd64/context2.S | 13 ++++++++++++-
+ src/pal/src/arch/amd64/exceptionhelper.S | 6 ++++++
+ src/pal/src/arch/arm/context2.S | 13 ++++++++++++-
+ src/pal/src/arch/arm/exceptionhelper.S | 6 ++++++
+ src/pal/src/arch/arm64/context2.S | 11 +++++++++++
+ src/pal/src/arch/arm64/exceptionhelper.S | 6 ++++++
+ src/pal/src/arch/i386/context2.S | 5 ++++-
+ src/pal/src/arch/i386/exceptionhelper.S | 6 ++++++
+ src/pal/src/exception/signal.cpp | 5 +++++
+ 11 files changed, 73 insertions(+), 6 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 45dd65b..1a3ad16 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -408,6 +408,7 @@ elseif (CLR_CMAKE_PLATFORM_UNIX)
+ if (${__ASAN_POS} GREATER -1)
+ set(CLR_SANITIZE_CXX_FLAGS "${CLR_SANITIZE_CXX_FLAGS}address,")
+ set(CLR_SANITIZE_LINK_FLAGS "${CLR_SANITIZE_LINK_FLAGS}address,")
++ add_definitions(-DHAS_ASAN)
+ message("Address Sanitizer (asan) enabled")
+ endif ()
+ if (${__UBSAN_POS} GREATER -1)
+diff --git a/enablesanitizers.sh b/enablesanitizers.sh
+index 2937b0b..aedb95d 100755
+--- a/enablesanitizers.sh
++++ b/enablesanitizers.sh
+@@ -83,8 +83,9 @@ else
+ unset DEBUG_SANITIZERS
+ echo "Setting DEBUG_SANITIZERS="
+ else
+- # for now, specify alloc_dealloc_mismatch=0 as there are too many error reports that are not an issue
+- ASAN_OPTIONS="symbolize=1 alloc_dealloc_mismatch=0"
++ # for now, specify alloc_dealloc_mismatch=0 as there are too many error reports that are not an issue.
++ # Also specify use_sigaltstack=0 as coreclr uses own alternate stack for signal handlers
++ ASAN_OPTIONS="symbolize=1 alloc_dealloc_mismatch=0 use_sigaltstack=0"
+ # when Clang 3.8 available, add: suppressions=$(readlink -f sanitizersuppressions.txt)
+ UBSAN_OPTIONS="print_stacktrace=1"
+
+@@ -132,4 +133,4 @@ else
+ unset __EnableLSan
+ unset __TurnOff
+ unset __Options
+-fi
+\ No newline at end of file
++fi
+diff --git a/src/pal/src/arch/amd64/context2.S b/src/pal/src/arch/amd64/context2.S
+index 0e93e81..46c941f 100644
+--- a/src/pal/src/arch/amd64/context2.S
++++ b/src/pal/src/arch/amd64/context2.S
+@@ -104,7 +104,18 @@ LEAF_END RtlCaptureContext, _TEXT
+ LEAF_ENTRY RtlRestoreContext, _TEXT
+ push_nonvol_reg rbp
+ alloc_stack (IRetFrameLengthAligned)
+-
++
++#ifdef HAS_ASAN
++ test BYTE PTR [rdi + CONTEXT_ContextFlags], CONTEXT_CONTROL
++ je LOCAL_LABEL(Restore_CONTEXT_DEBUG_REGISTERS)
++
++ push_nonvol_reg rdi
++ push_nonvol_reg rsi
++ call EXTERNAL_C_FUNC(__asan_handle_no_return)
++ pop_nonvol_reg rsi
++ pop_nonvol_reg rdi
++LOCAL_LABEL(Restore_CONTEXT_DEBUG_REGISTERS):
++#endif
+ test BYTE PTR [rdi + CONTEXT_ContextFlags], CONTEXT_DEBUG_REGISTERS
+ je LOCAL_LABEL(Done_Restore_CONTEXT_DEBUG_REGISTERS)
+ mov rdx, [rdi + CONTEXT_Dr0]
+diff --git a/src/pal/src/arch/amd64/exceptionhelper.S b/src/pal/src/arch/amd64/exceptionhelper.S
+index b7b34ac..72a1393 100644
+--- a/src/pal/src/arch/amd64/exceptionhelper.S
++++ b/src/pal/src/arch/amd64/exceptionhelper.S
+@@ -14,6 +14,12 @@
+ // Then it uses the ThrowExceptionHelper to throw the passed in exception from that context.
+ // EXTERN_C void ThrowExceptionFromContextInternal(CONTEXT* context, PAL_SEHException* ex);
+ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
++#ifdef HAS_ASAN
++ // Need to call __asan_handle_no_return explicitly here because we re-intialize RSP before
++ // throwing exception in ThrowExceptionHelper
++ call EXTERNAL_C_FUNC(__asan_handle_no_return)
++#endif
++
+ // Save the RBP to the stack so that the unwind can work at the instruction after
+ // loading the RBP from the context, but before loading the RSP from the context.
+ push_nonvol_reg rbp
+diff --git a/src/pal/src/arch/arm/context2.S b/src/pal/src/arch/arm/context2.S
+index 61e9ab8..42f50c9 100644
+--- a/src/pal/src/arch/arm/context2.S
++++ b/src/pal/src/arch/arm/context2.S
+@@ -112,7 +112,18 @@ LEAF_END RtlCaptureContext, _TEXT
+ //
+ LEAF_ENTRY RtlRestoreContext, _TEXT
+ END_PROLOGUE
+-
++
++#ifdef HAS_ASAN
++ ldr r2, [r0, #(CONTEXT_ContextFlags)]
++ tst r2, #(CONTEXT_CONTROL)
++ beq LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT)
++
++ push {r0, r1}
++ bl EXTERNAL_C_FUNC(__asan_handle_no_return)
++ pop {r0, r1}
++
++LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT):
++#endif
+ ldr r2, [r0, #(CONTEXT_ContextFlags)]
+ tst r2, #(CONTEXT_FLOATING_POINT)
+
+diff --git a/src/pal/src/arch/arm/exceptionhelper.S b/src/pal/src/arch/arm/exceptionhelper.S
+index 76cdcba..dad48de 100644
+--- a/src/pal/src/arch/arm/exceptionhelper.S
++++ b/src/pal/src/arch/arm/exceptionhelper.S
+@@ -11,6 +11,12 @@
+ // EXTERN_C void ThrowExceptionFromContextInternal(CONTEXT* context, PAL_SEHException* ex);
+ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
+ // Ported from src/pal/src/arch/amd64/exceptionhelper.S
++#ifdef HAS_ASAN
++ // Need to call __asan_handle_no_return explicitly here because we re-intialize SP before
++ // throwing exception in ThrowExceptionHelper
++ bl EXTERNAL_C_FUNC(__asan_handle_no_return)
++#endif
++
+ push_nonvol_reg {r7} /* FP. x64-RBP */
+
+ ldr r4, [r0, #(CONTEXT_R4)]
+diff --git a/src/pal/src/arch/arm64/context2.S b/src/pal/src/arch/arm64/context2.S
+index e62a9ac..ac3661a 100644
+--- a/src/pal/src/arch/arm64/context2.S
++++ b/src/pal/src/arch/arm64/context2.S
+@@ -133,6 +133,17 @@ LEAF_END RtlCaptureContext, _TEXT
+ // x1: Exception*
+ //
+ LEAF_ENTRY RtlRestoreContext, _TEXT
++
++#ifdef HAS_ASAN
++ ldr w17, [x0, #(CONTEXT_ContextFlags)]
++ tbz w17, #CONTEXT_CONTROL_BIT, LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT)
++
++ stp x0, x1, [sp]
++ bl EXTERNAL_C_FUNC(__asan_handle_no_return)
++ ldp x0, x1, [sp]
++
++LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT):
++#endif
+ // aarch64 specifies:
+ // IP0 and IP1, the Intra-Procedure Call temporary registers,
+ // are available for use by e.g. veneers or branch islands during a procedure call.
+diff --git a/src/pal/src/arch/arm64/exceptionhelper.S b/src/pal/src/arch/arm64/exceptionhelper.S
+index 480846e..7deeee6 100644
+--- a/src/pal/src/arch/arm64/exceptionhelper.S
++++ b/src/pal/src/arch/arm64/exceptionhelper.S
+@@ -12,6 +12,12 @@
+ // Then it uses the ThrowExceptionHelper to throw the passed in exception from that context.
+ // EXTERN_C void ThrowExceptionFromContextInternal(CONTEXT* context, PAL_SEHException* ex);
+ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
++#ifdef HAS_ASAN
++ // Need to call __asan_handle_no_return explicitly here because we re-intialize SP before
++ // throwing exception in ThrowExceptionHelper
++ bl EXTERNAL_C_FUNC(__asan_handle_no_return)
++#endif
++
+ // Save the FP & LR to the stack so that the unwind can work at the instruction after
+ // loading the FP from the context, but before loading the SP from the context.
+ stp fp, lr, [sp, -16]!
+diff --git a/src/pal/src/arch/i386/context2.S b/src/pal/src/arch/i386/context2.S
+index cf7581d..8c5db20 100644
+--- a/src/pal/src/arch/i386/context2.S
++++ b/src/pal/src/arch/i386/context2.S
+@@ -94,8 +94,11 @@ LEAF_ENTRY RtlCaptureContext, _TEXT
+ LEAF_END RtlCaptureContext, _TEXT
+
+ LEAF_ENTRY RtlRestoreContext, _TEXT
+- mov eax, [esp + 4]
+
++#ifdef HAS_ASAN
++ call EXTERNAL_C_FUNC(__asan_handle_no_return)
++#endif
++ mov eax, [esp + 4]
+ test BYTE PTR [eax + CONTEXT_ContextFlags], CONTEXT_FLOATING_POINT
+ je LOCAL_LABEL(Done_Restore_CONTEXT_FLOATING_POINT)
+ frstor [eax + CONTEXT_FloatSave]
+diff --git a/src/pal/src/arch/i386/exceptionhelper.S b/src/pal/src/arch/i386/exceptionhelper.S
+index b9ceffc..609efcf 100644
+--- a/src/pal/src/arch/i386/exceptionhelper.S
++++ b/src/pal/src/arch/i386/exceptionhelper.S
+@@ -18,6 +18,12 @@
+ //////////////////////////////////////////////////////////////////////////
+
+ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
++#ifdef HAS_ASAN
++ // Need to call __asan_handle_no_return explicitly here because we re-intialize ESP before
++ // throwing exception in ThrowExceptionHelper
++ call EXTERNAL_C_FUNC(__asan_handle_no_return)
++#endif
++
+ push ebp
+ mov ecx, [esp + 12] // ecx: PAL_SEHException * (first argument for ThrowExceptionHelper)
+ mov eax, [esp + 8] // ebx: CONTEXT *
+diff --git a/src/pal/src/exception/signal.cpp b/src/pal/src/exception/signal.cpp
+index 10eecf7..f795b81 100644
+--- a/src/pal/src/exception/signal.cpp
++++ b/src/pal/src/exception/signal.cpp
+@@ -153,6 +153,11 @@ BOOL EnsureSignalAlternateStack()
+ // We include the size of the SignalHandlerWorkerReturnPoint in the alternate stack size since the
+ // context contained in it is large and the SIGSTKSZ was not sufficient on ARM64 during testing.
+ int altStackSize = SIGSTKSZ + ALIGN_UP(sizeof(SignalHandlerWorkerReturnPoint), 16) + VIRTUAL_PAGE_SIZE;
++#ifdef HAS_ASAN
++ // Asan also uses alternate stack so we increase its size on the SIGSTKSZ * 4 that enough for asan
++ // (see kAltStackSize in compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc)
++ altStackSize += SIGSTKSZ * 4;
++#endif
+ void* altStack;
+ int st = posix_memalign(&altStack, VIRTUAL_PAGE_SIZE, altStackSize);
+ if (st == 0)
+--
+2.7.4
+