Changeset 205694 in webkit
- Timestamp:
- Sep 8, 2016 10:11:25 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r205683 r205694 1 2016-09-08 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] HashTable's rehash is not compatible to Ref<T> and ASan 4 https://bugs.webkit.org/show_bug.cgi?id=161763 5 6 Reviewed by Mark Lam. 7 8 If we move an object, the location which the moved object used should not be touched anymore. 9 HashTable::rehash performs WTFMove for the object that resides in the old table. 10 However, after moving it, we accidentally touch this location by using `!isEmptyOrDeletedBucket(table[i])` 11 in HashTable::deallocateTable. And it causes ASan crashing if we use Ref<> for HashTable's key or value. 12 13 In this patch, we call the destructor right after moving the object. And HashTable::rehash just calls 14 fastFree since all the objects in the old table are already moved and destructed. 15 And we also change HashTable::deallocate to destruct only live objects. Calling destructors for empty objects 16 is meaningless. And according to the Ref<>'s comment, empty object is not designed to be destructed. 17 18 * wtf/HashTable.h: 19 (WTF::KeyTraits>::deallocateTable): 20 1 21 2016-09-08 Filip Pizlo <fpizlo@apple.com> 2 22 -
trunk/Source/WTF/wtf/HashTable.h
r204519 r205694 1154 1154 { 1155 1155 for (unsigned i = 0; i < size; ++i) { 1156 if (!is DeletedBucket(table[i]))1156 if (!isEmptyOrDeletedBucket(table[i])) 1157 1157 table[i].~ValueType(); 1158 1158 } … … 1204 1204 1205 1205 Value* reinsertedEntry = reinsert(WTFMove(oldTable[i])); 1206 oldTable[i].~ValueType(); 1206 1207 if (std::addressof(oldTable[i]) == entry) { 1207 1208 ASSERT(!newEntry); … … 1212 1213 m_deletedCount = 0; 1213 1214 1214 deallocateTable(oldTable, oldTableSize);1215 fastFree(oldTable); 1215 1216 1216 1217 internalCheckTableConsistency(); -
trunk/Source/WebCore/ChangeLog
r205691 r205694 1 2016-09-08 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] HashTable's rehash is not compatible to Ref<T> and ASan 4 https://bugs.webkit.org/show_bug.cgi?id=161763 5 6 Reviewed by Mark Lam. 7 8 Include wtf/text/StringHash.h to avoid linking errors in EFL port. 9 10 * loader/ResourceLoadStatistics.h: 11 1 12 2016-09-08 Chris Dumez <cdumez@apple.com> 2 13 -
trunk/Source/WebCore/loader/ResourceLoadStatistics.h
r198055 r205694 28 28 29 29 #include <wtf/HashCountedSet.h> 30 #include <wtf/text/StringHash.h> 30 31 #include <wtf/text/WTFString.h> 31 32 -
trunk/Tools/ChangeLog
r205684 r205694 1 2016-09-08 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] HashTable's rehash is not compatible to Ref<T> and ASan 4 https://bugs.webkit.org/show_bug.cgi?id=161763 5 6 Reviewed by Mark Lam. 7 8 Add tests that inserts many Ref<>s. It incurs HashTable::rehash, and we can ensure 9 that ASan crash does not occur with this patch. 10 11 * TestWebKitAPI/Tests/WTF/HashMap.cpp: 12 (TestWebKitAPI::TEST): 13 * TestWebKitAPI/Tests/WTF/HashSet.cpp: 14 (TestWebKitAPI::TEST): 15 1 16 2016-09-08 Alex Christensen <achristensen@webkit.org> 2 17 -
trunk/Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp
r204519 r205694 790 790 791 791 ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str()); 792 793 { 794 HashMap<Ref<RefLogger>, int> map; 795 for (int i = 0; i < 64; ++i) { 796 Ref<RefLogger> ref = adoptRef(*new RefLogger("a")); 797 auto* pointer = ref.ptr(); 798 map.add(WTFMove(ref), i + 1); 799 ASSERT_TRUE(map.contains(pointer)); 800 } 801 } 802 803 ASSERT_STREQ("deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) ", takeLogStr().c_str()); 792 804 } 793 805 … … 891 903 892 904 ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str()); 905 906 { 907 HashMap<int, Ref<RefLogger>> map; 908 for (int i = 0; i < 64; ++i) { 909 Ref<RefLogger> ref = adoptRef(*new RefLogger("a")); 910 map.add(i + 1, WTFMove(ref)); 911 ASSERT_TRUE(map.contains(i + 1)); 912 } 913 } 914 915 ASSERT_STREQ("deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) ", takeLogStr().c_str()); 893 916 } 894 917 -
trunk/Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp
r204519 r205694 429 429 430 430 ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str()); 431 432 { 433 HashSet<Ref<RefLogger>> set; 434 for (int i = 0; i < 64; ++i) { 435 Ref<RefLogger> ref = adoptRef(*new RefLogger("a")); 436 auto* pointer = ref.ptr(); 437 set.add(WTFMove(ref)); 438 ASSERT_TRUE(set.contains(pointer)); 439 } 440 } 441 ASSERT_STREQ("deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) deref(a) ", takeLogStr().c_str()); 431 442 } 432 443
Note: See TracChangeset
for help on using the changeset viewer.