Changeset 275049 in webkit
- Timestamp:
- Mar 25, 2021, 11:47:17 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
contentextensions/DFABytecodeCompiler.cpp (modified) (1 diff)
-
contentextensions/NFAToDFA.cpp (modified) (2 diffs)
-
contentextensions/SerializedNFA.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r275048 r275049 1 2021-03-25 Chris Dumez <cdumez@apple.com> 2 3 Address some alignment issues found by UBSan in contentextensions code 4 https://bugs.webkit.org/show_bug.cgi?id=223748 5 6 Reviewed by Darin Adler. 7 8 Address some alignment issues found by UBSan in contentextensions code: 9 - contentextensions/SerializedNFA.h:55:20: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment 10 - contentextensions/NFAToDFA.cpp:254:29: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment 11 - contentextensions/DFABytecodeCompiler.cpp:43:5: runtime error: store to misaligned address 0xnnnnnnnnn for type 'unsigned short', which requires 2 byte alignment 12 13 Use memcpy() to store/load to/from misaligned address. 14 15 * contentextensions/DFABytecodeCompiler.cpp: 16 (WebCore::ContentExtensions::append): 17 * contentextensions/NFAToDFA.cpp: 18 (WebCore::ContentExtensions::epsilonClosureExcludingSelf): 19 (WebCore::ContentExtensions::NodeIdSetToUniqueNodeIdSetTranslator::translate): 20 * contentextensions/SerializedNFA.h: 21 (WebCore::ContentExtensions::SerializedNFA::Range::pointerAt const): 22 (WebCore::ContentExtensions::SerializedNFA::Range::valueAt const): 23 (WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator* const): 24 (WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator-> const): 25 (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::first const): 26 (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::last const): 27 (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::data const): 28 (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::range const): 29 (WebCore::ContentExtensions::SerializedNFA::transitionsForNode const): 30 (WebCore::ContentExtensions::SerializedNFA::Range::operator[] const): Deleted. 31 1 32 2021-03-25 Chris Dumez <cdumez@apple.com> 2 33 -
trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp
r255036 r275049 41 41 { 42 42 bytecode.grow(bytecode.size() + sizeof(IntType)); 43 *reinterpret_cast<IntType*>(&bytecode[bytecode.size() - sizeof(IntType)]) = value;43 memcpy(&bytecode[bytecode.size() - sizeof(IntType)], &value, sizeof(IntType)); 44 44 } 45 45 -
trunk/Source/WebCore/contentextensions/NFAToDFA.cpp
r270494 r275049 60 60 do { 61 61 unsigned unprocessedNodeId = unprocessedNodes.takeLast(); 62 const auto & node = nfa.nodes()[unprocessedNodeId];63 64 for (uint32_t epsilonTargetIndex = node .epsilonTransitionTargetsStart; epsilonTargetIndex < node.epsilonTransitionTargetsEnd; ++epsilonTargetIndex) {65 uint32_t targetNodeId = nfa.epsilonTransitionsTargets() [epsilonTargetIndex];62 const auto* node = nfa.nodes().pointerAt(unprocessedNodeId); 63 64 for (uint32_t epsilonTargetIndex = node->epsilonTransitionTargetsStart; epsilonTargetIndex < node->epsilonTransitionTargetsEnd; ++epsilonTargetIndex) { 65 uint32_t targetNodeId = nfa.epsilonTransitionsTargets().valueAt(epsilonTargetIndex); 66 66 auto addResult = closure.add(targetNodeId); 67 67 if (addResult.isNewEntry) { … … 250 250 251 251 for (unsigned nfaNodeId : source.nodeIdSet) { 252 const auto & nfaNode = source.nfa.nodes()[nfaNodeId];253 for (unsigned actionIndex = nfaNode .actionStart; actionIndex < nfaNode.actionEnd; ++actionIndex)254 actions.add(source.nfa.actions() [actionIndex]);252 const auto* nfaNode = source.nfa.nodes().pointerAt(nfaNodeId); 253 for (unsigned actionIndex = nfaNode->actionStart; actionIndex < nfaNode->actionEnd; ++actionIndex) 254 actions.add(source.nfa.actions().valueAt(actionIndex)); 255 255 } 256 256 -
trunk/Source/WebCore/contentextensions/SerializedNFA.h
r270519 r275049 50 50 const T* end() const { return m_begin + m_size; } 51 51 size_t size() const { return m_size; } 52 const T & operator[](size_t i) const52 const T* pointerAt(size_t i) const 53 53 { 54 54 RELEASE_ASSERT(i < m_size); 55 return begin()[i]; 55 return begin() + i; 56 } 57 T valueAt(size_t i) const 58 { 59 RELEASE_ASSERT(i < m_size); 60 T value; 61 memcpy(&value, begin() + i, sizeof(T)); 62 return value; 56 63 } 57 64 private: … … 76 83 uint32_t position; 77 84 78 const uint32_t& operator*() const { return serializedNFA.targets()[position]; }79 const uint32_t* operator->() const { return &serializedNFA.targets()[position]; }85 uint32_t operator*() const { return serializedNFA.targets().valueAt(position); } 86 const uint32_t* operator->() const { return serializedNFA.targets().pointerAt(position); } 80 87 81 88 bool operator==(const ConstTargetIterator& other) const … … 121 128 char first() const 122 129 { 123 return range() .first;130 return range()->first; 124 131 } 125 132 126 133 char last() const 127 134 { 128 return range() .last;135 return range()->last; 129 136 } 130 137 131 138 IterableConstTargets data() const 132 139 { 133 const ImmutableRange<char> &range = this->range();134 return { serializedNFA, range .targetStart, range.targetEnd };140 const ImmutableRange<char>* range = this->range(); 141 return { serializedNFA, range->targetStart, range->targetEnd }; 135 142 }; 136 143 137 144 private: 138 const ImmutableRange<char> &range() const139 { 140 return serializedNFA.transitions() [position];145 const ImmutableRange<char>* range() const 146 { 147 return serializedNFA.transitions().pointerAt(position); 141 148 } 142 149 }; … … 161 168 IterableConstRange transitionsForNode(uint32_t nodeId) const 162 169 { 163 const auto & node = nodes()[nodeId];164 return { *this, node .rangesStart, node.rangesEnd };170 const auto* node = nodes().pointerAt(nodeId); 171 return { *this, node->rangesStart, node->rangesEnd }; 165 172 } 166 173
Note:
See TracChangeset
for help on using the changeset viewer.