⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 275049 in webkit


Ignore:
Timestamp:
Mar 25, 2021, 11:47:17 AM (5 years ago)
Author:
Chris Dumez
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.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r275048 r275049  
     12021-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
    1322021-03-25  Chris Dumez  <cdumez@apple.com>
    233
  • trunk/Source/WebCore/contentextensions/DFABytecodeCompiler.cpp

    r255036 r275049  
    4141{
    4242    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));
    4444}
    4545
  • trunk/Source/WebCore/contentextensions/NFAToDFA.cpp

    r270494 r275049  
    6060    do {
    6161        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);
    6666            auto addResult = closure.add(targetNodeId);
    6767            if (addResult.isNewEntry) {
     
    250250
    251251        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));
    255255        }
    256256
  • trunk/Source/WebCore/contentextensions/SerializedNFA.h

    r270519 r275049  
    5050        const T* end() const { return m_begin + m_size; }
    5151        size_t size() const { return m_size; }
    52         const T& operator[](size_t i) const
     52        const T* pointerAt(size_t i) const
    5353        {
    5454            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;
    5663        }
    5764    private:
     
    7683        uint32_t position;
    7784
    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); }
    8087
    8188        bool operator==(const ConstTargetIterator& other) const
     
    121128        char first() const
    122129        {
    123             return range().first;
     130            return range()->first;
    124131        }
    125132
    126133        char last() const
    127134        {
    128             return range().last;
     135            return range()->last;
    129136        }
    130137
    131138        IterableConstTargets data() const
    132139        {
    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 };
    135142        };
    136143
    137144    private:
    138         const ImmutableRange<char>& range() const
    139         {
    140             return serializedNFA.transitions()[position];
     145        const ImmutableRange<char>* range() const
     146        {
     147            return serializedNFA.transitions().pointerAt(position);
    141148        }
    142149    };
     
    161168    IterableConstRange transitionsForNode(uint32_t nodeId) const
    162169    {
    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 };
    165172    }
    166173
Note: See TracChangeset for help on using the changeset viewer.