[ASan] Allow Ref<> to be swapped
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2018 20:16:48 +0000 (20:16 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2018 20:16:48 +0000 (20:16 +0000)
https://bugs.webkit.org/show_bug.cgi?id=184017
<rdar://problem/36336787>

Reviewed by JF Bastien.

Unpoison a Ref in various calls just like in ~Ref so that sorting a Vector<Ref<>> works with ASan on.

* wtf/Ref.h:
(WTF::Ref::assignToHashTableEmptyValue):
(WTF::=):
(WTF::U>::replace):

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

Source/WTF/ChangeLog
Source/WTF/wtf/Ref.h

index 0af61314cf50ed62c17953c3d6d316e4ede91a84..f4295f082bd76776ad4d5ab9c229e6799e4b36ca 100644 (file)
@@ -1,3 +1,18 @@
+2018-03-26  Antoine Quint  <graouts@apple.com>
+
+        [ASan] Allow Ref<> to be swapped
+        https://bugs.webkit.org/show_bug.cgi?id=184017
+        <rdar://problem/36336787>
+
+        Reviewed by JF Bastien.
+
+        Unpoison a Ref in various calls just like in ~Ref so that sorting a Vector<Ref<>> works with ASan on.
+
+        * wtf/Ref.h:
+        (WTF::Ref::assignToHashTableEmptyValue):
+        (WTF::=):
+        (WTF::U>::replace):
+
 2018-03-26  Brent Fulgham  <bfulgham@apple.com>
 
         Warn against cookie access in the WebContent process using ProcessPrivilege assertions
index 2ed4d2868f89995c19653533d69394960ecc4f49..1aad76f640b1e86691f6568bc6771271788dd506 100644 (file)
@@ -108,6 +108,10 @@ public:
 
     void assignToHashTableEmptyValue(Ref&& reference)
     {
+#if ASAN_ENABLED
+        if (__asan_address_is_poisoned(this))
+            __asan_unpoison_memory_region(this, sizeof(*this));
+#endif
         ASSERT(m_ptr == hashTableEmptyValue());
         m_ptr = &reference.leakRef();
         ASSERT(m_ptr);
@@ -166,6 +170,10 @@ inline Ref<T, U>& Ref<T, U>::operator=(T& reference)
 template<typename T, typename U>
 inline Ref<T, U>& Ref<T, U>::operator=(Ref&& reference)
 {
+#if ASAN_ENABLED
+    if (__asan_address_is_poisoned(this))
+        __asan_unpoison_memory_region(this, sizeof(*this));
+#endif
     Ref movedReference = WTFMove(reference);
     swap(movedReference);
     return *this;
@@ -175,6 +183,10 @@ template<typename T, typename U>
 template<typename X, typename Y>
 inline Ref<T, U>& Ref<T, U>::operator=(Ref<X, Y>&& reference)
 {
+#if ASAN_ENABLED
+    if (__asan_address_is_poisoned(this))
+        __asan_unpoison_memory_region(this, sizeof(*this));
+#endif
     Ref movedReference = WTFMove(reference);
     swap(movedReference);
     return *this;
@@ -197,6 +209,10 @@ template<typename T, typename U>
 template<typename X, typename Y>
 inline Ref<T, U> Ref<T, U>::replace(Ref<X, Y>&& reference)
 {
+#if ASAN_ENABLED
+    if (__asan_address_is_poisoned(this))
+        __asan_unpoison_memory_region(this, sizeof(*this));
+#endif
     auto oldReference = adoptRef(*m_ptr);
     m_ptr = &reference.leakRef();
     return oldReference;