ASan does not like JSC::MachineThreads::tryCopyOtherThreadStack.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Feb 2015 00:24:25 +0000 (00:24 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Feb 2015 00:24:25 +0000 (00:24 +0000)
<https://webkit.org/b/141672>

Reviewed by Alexey Proskuryakov.

ASan does not like the fact that we memcpy the stack for GC scans.  So,
we're working around this by using our own memcpy (asanUnsafeMemcpy)
implementation that we can tell ASan to ignore.

Source/JavaScriptCore:

* heap/MachineStackMarker.cpp:
(JSC::asanUnsafeMemcpy):

Tools:

Also removed the previous added directive to ignore *tryCopyOtherThreadStack*
which isn't effective for working around this issue.

* asan/webkit-asan-ignore.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@180649 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/MachineStackMarker.cpp
Tools/ChangeLog
Tools/asan/webkit-asan-ignore.txt

index a3e6bd9..ebcfa31 100644 (file)
@@ -1,3 +1,17 @@
+2015-02-25  Mark Lam  <mark.lam@apple.com>
+
+        ASan does not like JSC::MachineThreads::tryCopyOtherThreadStack.
+        <https://webkit.org/b/141672>
+
+        Reviewed by Alexey Proskuryakov.
+
+        ASan does not like the fact that we memcpy the stack for GC scans.  So,
+        we're working around this by using our own memcpy (asanUnsafeMemcpy)
+        implementation that we can tell ASan to ignore.
+
+        * heap/MachineStackMarker.cpp:
+        (JSC::asanUnsafeMemcpy):
+
 2015-02-25  Benjamin Poulain  <bpoulain@apple.com>
 
         CodeBlock crashes when dumping op_push_name_scope
index 0022d1d..0042293 100644 (file)
@@ -410,6 +410,26 @@ static std::pair<void*, size_t> otherThreadStack(void* stackBase, const Platform
     return std::make_pair(begin, static_cast<char*>(end) - static_cast<char*>(begin));
 }
 
+#if ASAN_ENABLED
+void asanUnsafeMemcpy(void* dst, const void* src, size_t);
+void asanUnsafeMemcpy(void* dst, const void* src, size_t size)
+{
+    size_t dstAsSize = reinterpret_cast<size_t>(dst);
+    size_t srcAsSize = reinterpret_cast<size_t>(src);
+    RELEASE_ASSERT(dstAsSize == WTF::roundUpToMultipleOf<sizeof(intptr_t)>(dstAsSize));
+    RELEASE_ASSERT(srcAsSize == WTF::roundUpToMultipleOf<sizeof(intptr_t)>(srcAsSize));
+    RELEASE_ASSERT(size == WTF::roundUpToMultipleOf<sizeof(intptr_t)>(size));
+
+    intptr_t* dstPtr = reinterpret_cast<intptr_t*>(dst);
+    const intptr_t* srcPtr = reinterpret_cast<const intptr_t*>(src);
+    size /= sizeof(intptr_t);
+    while (size--)
+        *dstPtr++ = *srcPtr++;
+}
+    
+#define memcpy asanUnsafeMemcpy
+#endif
+
 // This function must not call malloc(), free(), or any other function that might
 // acquire a lock. Since 'thread' is suspended, trying to acquire a lock
 // will deadlock if 'thread' holds that lock.
index dcb316f..730d536 100644 (file)
@@ -1,3 +1,19 @@
+2015-02-25  Mark Lam  <mark.lam@apple.com>
+
+        ASan does not like JSC::MachineThreads::tryCopyOtherThreadStack.
+        <https://webkit.org/b/141672>
+
+        Reviewed by Alexey Proskuryakov.
+
+        ASan does not like the fact that we memcpy the stack for GC scans.  So,
+        we're working around this by using our own memcpy (asanUnsafeMemcpy)
+        implementation that we can tell ASan to ignore.
+
+        Also removed the previous added directive to ignore *tryCopyOtherThreadStack*
+        which isn't effective for working around this issue. 
+
+        * asan/webkit-asan-ignore.txt:
+
 2015-02-25  Benjamin Poulain  <bpoulain@apple.com>
 
         CodeBlock crashes when dumping op_push_name_scope
index 55e7a85..963b724 100644 (file)
@@ -4,4 +4,4 @@ fun:*DFG*prepareOSREntry*
 # FIXME (rdar://problem/19379214): Register::jsValue() only needs to be blacklisted when
 # called from prepareOSREntry(), but there is currently no way to express this in a blacklist.
 fun:*JSC*Register*jsValue*
-fun:*JSC*MachineThreads*tryCopyOtherThreadStack*
+fun:*asanUnsafeMemcpy*