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

Changeset 246021 in webkit


Ignore:
Timestamp:
Jun 2, 2019, 5:25:15 AM (7 years ago)
Author:
Tadeu Zagallo
Message:

CachedMetadataTable::decode leaks empty tables
https://bugs.webkit.org/show_bug.cgi?id=198465
<rdar://problem/51307673>

Reviewed by Yusuke Suzuki.

CachedMetadataTable::decode creates the metadata and never calls finalize on it.
This leaks the underlying UnlinkedMetadataTable buffer when m_hasMetadata is false,
since the buffer would be freed in finalize instead of in the destructor.

  • bytecode/UnlinkedMetadataTable.h:

(JSC::UnlinkedMetadataTable::empty):

  • bytecode/UnlinkedMetadataTableInlines.h:

(JSC::UnlinkedMetadataTable::UnlinkedMetadataTable):

  • runtime/CachedTypes.cpp:

(JSC::CachedMetadataTable::decode const):

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r246006 r246021  
     12019-06-02  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        CachedMetadataTable::decode leaks empty tables
     4        https://bugs.webkit.org/show_bug.cgi?id=198465
     5        <rdar://problem/51307673>
     6
     7        Reviewed by Yusuke Suzuki.
     8
     9        CachedMetadataTable::decode creates the metadata and never calls finalize on it.
     10        This leaks the underlying UnlinkedMetadataTable buffer when m_hasMetadata is false,
     11        since the buffer would be freed in finalize instead of in the destructor.
     12
     13        * bytecode/UnlinkedMetadataTable.h:
     14        (JSC::UnlinkedMetadataTable::empty):
     15        * bytecode/UnlinkedMetadataTableInlines.h:
     16        (JSC::UnlinkedMetadataTable::UnlinkedMetadataTable):
     17        * runtime/CachedTypes.cpp:
     18        (JSC::CachedMetadataTable::decode const):
     19
    1202019-05-31  Yusuke Suzuki  <ysuzuki@apple.com>
    221
  • trunk/Source/JavaScriptCore/bytecode/UnlinkedMetadataTable.h

    r245669 r246021  
    6262
    6363private:
     64    enum EmptyTag { Empty };
     65
    6466    UnlinkedMetadataTable();
    6567    UnlinkedMetadataTable(bool is32Bit);
     68    UnlinkedMetadataTable(EmptyTag);
    6669
    6770    static Ref<UnlinkedMetadataTable> create(bool is32Bit)
    6871    {
    6972        return adoptRef(*new UnlinkedMetadataTable(is32Bit));
     73    }
     74
     75    static Ref<UnlinkedMetadataTable> empty()
     76    {
     77        return adoptRef(*new UnlinkedMetadataTable(Empty));
    7078    }
    7179
  • trunk/Source/JavaScriptCore/bytecode/UnlinkedMetadataTableInlines.h

    r245669 r246021  
    4747    , m_is32Bit(is32Bit)
    4848    , m_rawBuffer(static_cast<uint8_t*>(fastZeroedMalloc(sizeof(LinkingData) + (is32Bit ? s_offset16TableSize + s_offset32TableSize : s_offset16TableSize))))
     49{
     50}
     51
     52ALWAYS_INLINE UnlinkedMetadataTable::UnlinkedMetadataTable(EmptyTag)
     53    : m_hasMetadata(false)
     54    , m_isFinalized(true)
     55    , m_isLinked(false)
     56    , m_is32Bit(false)
     57    , m_rawBuffer(nullptr)
    4958{
    5059}
  • trunk/Source/JavaScriptCore/runtime/CachedTypes.cpp

    r245669 r246021  
    13611361    Ref<UnlinkedMetadataTable> decode(Decoder&) const
    13621362    {
     1363        if (!m_hasMetadata)
     1364            return UnlinkedMetadataTable::empty();
     1365
    13631366        Ref<UnlinkedMetadataTable> metadataTable = UnlinkedMetadataTable::create(m_is32Bit);
    13641367        metadataTable->m_isFinalized = true;
Note: See TracChangeset for help on using the changeset viewer.