Changeset 211091 in webkit
- Timestamp:
- Jan 24, 2017, 10:57:36 AM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
-
ChangeLog (modified) (1 diff)
-
runtime/InferredTypeTable.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r211075 r211091 1 2017-01-23 Michael Saboff <msaboff@apple.com> 2 3 InferredTypeTable entry manipulation is not TOCTOU race safe 4 https://bugs.webkit.org/show_bug.cgi?id=167344 5 6 Reviewed by Filip Pizlo. 7 8 Made the accesses to table values safe from Time of Check, 9 Time of Use races with local temporary values. 10 11 * runtime/InferredTypeTable.cpp: 12 (JSC::InferredTypeTable::visitChildren): 13 (JSC::InferredTypeTable::get): 14 (JSC::InferredTypeTable::willStoreValue): 15 (JSC::InferredTypeTable::makeTop): 16 1 17 2017-01-23 Joseph Pecoraro <pecoraro@apple.com> 2 18 -
trunk/Source/JavaScriptCore/runtime/InferredTypeTable.cpp
r209897 r211091 58 58 59 59 for (auto& entry : inferredTypeTable->m_table) { 60 if (!entry.value) 60 auto entryValue = entry.value; 61 62 if (!entryValue) 61 63 continue; 62 if (entry .value->isRelevant())63 visitor.append(entry .value);64 if (entryValue->isRelevant()) 65 visitor.append(entryValue); 64 66 else 65 67 entry.value.clear(); … … 70 72 { 71 73 auto iter = m_table.find(uid); 72 if (iter == m_table.end() || !iter->value) 74 if (iter == m_table.end()) 75 return nullptr; 76 77 auto entryValue = iter->value; 78 if (!entryValue) 73 79 return nullptr; 74 80 75 81 // Take this opportunity to prune invalidated types. 76 if (! iter->value->isRelevant()) {82 if (!entryValue->isRelevant()) { 77 83 iter->value.clear(); 78 84 return nullptr; 79 85 } 80 86 81 return iter->value.get();87 return entryValue.get(); 82 88 } 83 89 … … 100 106 if (age == OldProperty) { 101 107 TableType::iterator iter = m_table.find(propertyName.uid()); 102 if (iter == m_table.end() || !iter->value)108 if (iter == m_table.end()) 103 109 return false; // Absence on replace => top. 110 111 auto entryValue = iter->value; 112 if (!entryValue) 113 return false; 104 114 105 if ( iter->value->willStoreValue(vm, propertyName, value))115 if (entryValue->willStoreValue(vm, propertyName, value)) 106 116 return true; 107 117 … … 115 125 result = m_table.add(propertyName.uid(), WriteBarrier<InferredType>()); 116 126 } 127 auto entryValue = result.iterator->value; 128 117 129 if (result.isNewEntry) { 118 130 InferredType* inferredType = InferredType::create(vm); 119 131 WTF::storeStoreFence(); 120 result.iterator->value.set(vm, this, inferredType);121 } else if (! result.iterator->value)132 entryValue.set(vm, this, inferredType); 133 } else if (!entryValue) 122 134 return false; 123 135 124 if ( result.iterator->value->willStoreValue(vm, propertyName, value))136 if (entryValue->willStoreValue(vm, propertyName, value)) 125 137 return true; 126 138 … … 134 146 if (age == OldProperty) { 135 147 TableType::iterator iter = m_table.find(propertyName.uid()); 136 if (iter == m_table.end() || !iter->value)148 if (iter == m_table.end()) 137 149 return; // Absence on replace => top. 138 150 139 iter->value->makeTop(vm, propertyName); 151 auto entryValue = iter->value; 152 153 if (!entryValue) 154 return; 155 156 entryValue->makeTop(vm, propertyName); 140 157 iter->value.clear(); 141 158 return;
Note:
See TracChangeset
for help on using the changeset viewer.