Title: [275049] trunk/Source/WebCore
Revision
275049
Author
[email protected]
Date
2021-03-25 11:47:17 -0700 (Thu, 25 Mar 2021)

Log Message

Address some alignment issues found by UBSan in contentextensions code
https://bugs.webkit.org/show_bug.cgi?id=223748

Reviewed by Darin Adler.

Address some alignment issues found by UBSan in contentextensions code:
- contentextensions/SerializedNFA.h:55:20: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment
- contentextensions/NFAToDFA.cpp:254:29: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment
- contentextensions/DFABytecodeCompiler.cpp:43:5: runtime error: store to misaligned address 0xnnnnnnnnn for type 'unsigned short', which requires 2 byte alignment

Use memcpy() to store/load to/from misaligned address.

* contentextensions/DFABytecodeCompiler.cpp:
(WebCore::ContentExtensions::append):
* contentextensions/NFAToDFA.cpp:
(WebCore::ContentExtensions::epsilonClosureExcludingSelf):
(WebCore::ContentExtensions::NodeIdSetToUniqueNodeIdSetTranslator::translate):
* contentextensions/SerializedNFA.h:
(WebCore::ContentExtensions::SerializedNFA::Range::pointerAt const):
(WebCore::ContentExtensions::SerializedNFA::Range::valueAt const):
(WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator* const):
(WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator-> const):
(WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::first const):
(WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::last const):
(WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::data const):
(WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::range const):
(WebCore::ContentExtensions::SerializedNFA::transitionsForNode const):
(WebCore::ContentExtensions::SerializedNFA::Range::operator[] const): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (275048 => 275049)


--- trunk/Source/WebCore/ChangeLog	2021-03-25 18:20:58 UTC (rev 275048)
+++ trunk/Source/WebCore/ChangeLog	2021-03-25 18:47:17 UTC (rev 275049)
@@ -1,5 +1,36 @@
 2021-03-25  Chris Dumez  <[email protected]>
 
+        Address some alignment issues found by UBSan in contentextensions code
+        https://bugs.webkit.org/show_bug.cgi?id=223748
+
+        Reviewed by Darin Adler.
+
+        Address some alignment issues found by UBSan in contentextensions code:
+        - contentextensions/SerializedNFA.h:55:20: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment
+        - contentextensions/NFAToDFA.cpp:254:29: runtime error: reference binding to misaligned address 0xnnnnnnnnn for type 'const unsigned long long', which requires 8 byte alignment
+        - contentextensions/DFABytecodeCompiler.cpp:43:5: runtime error: store to misaligned address 0xnnnnnnnnn for type 'unsigned short', which requires 2 byte alignment
+
+        Use memcpy() to store/load to/from misaligned address.
+
+        * contentextensions/DFABytecodeCompiler.cpp:
+        (WebCore::ContentExtensions::append):
+        * contentextensions/NFAToDFA.cpp:
+        (WebCore::ContentExtensions::epsilonClosureExcludingSelf):
+        (WebCore::ContentExtensions::NodeIdSetToUniqueNodeIdSetTranslator::translate):
+        * contentextensions/SerializedNFA.h:
+        (WebCore::ContentExtensions::SerializedNFA::Range::pointerAt const):
+        (WebCore::ContentExtensions::SerializedNFA::Range::valueAt const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator* const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstTargetIterator::operator-> const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::first const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::last const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::data const):
+        (WebCore::ContentExtensions::SerializedNFA::ConstRangeIterator::range const):
+        (WebCore::ContentExtensions::SerializedNFA::transitionsForNode const):
+        (WebCore::ContentExtensions::SerializedNFA::Range::operator[] const): Deleted.
+
+2021-03-25  Chris Dumez  <[email protected]>
+
         Source/WebCore/xml/parser/CharacterReferenceParserInlines.h:107:33: runtime error: signed integer overflow: 268435455 * 16 cannot be represented in type 'int'
         https://bugs.webkit.org/show_bug.cgi?id=223718
 

Modified: trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp (275048 => 275049)


--- trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp	2021-03-25 18:20:58 UTC (rev 275048)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp	2021-03-25 18:47:17 UTC (rev 275049)
@@ -40,7 +40,7 @@
 inline void append(Vector<DFABytecode>& bytecode, IntType value)
 {
     bytecode.grow(bytecode.size() + sizeof(IntType));
-    *reinterpret_cast<IntType*>(&bytecode[bytecode.size() - sizeof(IntType)]) = value;
+    memcpy(&bytecode[bytecode.size() - sizeof(IntType)], &value, sizeof(IntType));
 }
 
 inline void appendZeroes(Vector<DFABytecode>& bytecode, DFABytecodeJumpSize jumpSize)

Modified: trunk/Source/WebCore/contentextensions/NFAToDFA.cpp (275048 => 275049)


--- trunk/Source/WebCore/contentextensions/NFAToDFA.cpp	2021-03-25 18:20:58 UTC (rev 275048)
+++ trunk/Source/WebCore/contentextensions/NFAToDFA.cpp	2021-03-25 18:47:17 UTC (rev 275049)
@@ -59,10 +59,10 @@
 
     do {
         unsigned unprocessedNodeId = unprocessedNodes.takeLast();
-        const auto& node = nfa.nodes()[unprocessedNodeId];
+        const auto* node = nfa.nodes().pointerAt(unprocessedNodeId);
 
-        for (uint32_t epsilonTargetIndex = node.epsilonTransitionTargetsStart; epsilonTargetIndex < node.epsilonTransitionTargetsEnd; ++epsilonTargetIndex) {
-            uint32_t targetNodeId = nfa.epsilonTransitionsTargets()[epsilonTargetIndex];
+        for (uint32_t epsilonTargetIndex = node->epsilonTransitionTargetsStart; epsilonTargetIndex < node->epsilonTransitionTargetsEnd; ++epsilonTargetIndex) {
+            uint32_t targetNodeId = nfa.epsilonTransitionsTargets().valueAt(epsilonTargetIndex);
             auto addResult = closure.add(targetNodeId);
             if (addResult.isNewEntry) {
                 unprocessedNodes.append(targetNodeId);
@@ -249,9 +249,9 @@
         HashSet<uint64_t, DefaultHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> actions;
 
         for (unsigned nfaNodeId : source.nodeIdSet) {
-            const auto& nfaNode = source.nfa.nodes()[nfaNodeId];
-            for (unsigned actionIndex = nfaNode.actionStart; actionIndex < nfaNode.actionEnd; ++actionIndex)
-                actions.add(source.nfa.actions()[actionIndex]);
+            const auto* nfaNode = source.nfa.nodes().pointerAt(nfaNodeId);
+            for (unsigned actionIndex = nfaNode->actionStart; actionIndex < nfaNode->actionEnd; ++actionIndex)
+                actions.add(source.nfa.actions().valueAt(actionIndex));
         }
 
         unsigned actionsStart = source.dfa.actions.size();

Modified: trunk/Source/WebCore/contentextensions/SerializedNFA.h (275048 => 275049)


--- trunk/Source/WebCore/contentextensions/SerializedNFA.h	2021-03-25 18:20:58 UTC (rev 275048)
+++ trunk/Source/WebCore/contentextensions/SerializedNFA.h	2021-03-25 18:47:17 UTC (rev 275049)
@@ -49,11 +49,18 @@
         const T* begin() const { return m_begin; }
         const T* end() const { return m_begin + m_size; }
         size_t size() const { return m_size; }
-        const T& operator[](size_t i) const
+        const T* pointerAt(size_t i) const
         {
             RELEASE_ASSERT(i < m_size);
-            return begin()[i];
+            return begin() + i;
         }
+        T valueAt(size_t i) const
+        {
+            RELEASE_ASSERT(i < m_size);
+            T value;
+            memcpy(&value, begin() + i, sizeof(T));
+            return value;
+        }
     private:
         const T* m_begin { nullptr };
         size_t m_size { 0 };
@@ -75,8 +82,8 @@
         const SerializedNFA& serializedNFA;
         uint32_t position;
 
-        const uint32_t& operator*() const { return serializedNFA.targets()[position]; }
-        const uint32_t* operator->() const { return &serializedNFA.targets()[position]; }
+        uint32_t operator*() const { return serializedNFA.targets().valueAt(position); }
+        const uint32_t* operator->() const { return serializedNFA.targets().pointerAt(position); }
 
         bool operator==(const ConstTargetIterator& other) const
         {
@@ -120,24 +127,24 @@
 
         char first() const
         {
-            return range().first;
+            return range()->first;
         }
 
         char last() const
         {
-            return range().last;
+            return range()->last;
         }
 
         IterableConstTargets data() const
         {
-            const ImmutableRange<char>& range = this->range();
-            return { serializedNFA, range.targetStart, range.targetEnd };
+            const ImmutableRange<char>* range = this->range();
+            return { serializedNFA, range->targetStart, range->targetEnd };
         };
 
     private:
-        const ImmutableRange<char>& range() const
+        const ImmutableRange<char>* range() const
         {
-            return serializedNFA.transitions()[position];
+            return serializedNFA.transitions().pointerAt(position);
         }
     };
 
@@ -160,8 +167,8 @@
 
     IterableConstRange transitionsForNode(uint32_t nodeId) const
     {
-        const auto& node = nodes()[nodeId];
-        return { *this, node.rangesStart, node.rangesEnd };
+        const auto* node = nodes().pointerAt(nodeId);
+        return { *this, node->rangesStart, node->rangesEnd };
     }
 
 private:
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to