Ignore:
Timestamp:
Aug 15, 2008, 11:53:44 PM (17 years ago)
Author:
[email protected]
Message:

<rdar://problem/6143072> FastMallocZone's enumeration code makes assumptions about handling of remote memory regions that overlap

Reviewed by Oliver Hunt.

  • wtf/FastMalloc.cpp:

(WTF::TCMalloc_Central_FreeList::enumerateFreeObjects): Don't directly compare pointers mapped into the local process with
a pointer that has not been mapped. Instead, calculate a local address for the pointer and compare with that.
(WTF::TCMallocStats::FreeObjectFinder::findFreeObjects): Pass in the remote address of the central free list so that it can
be used when calculating local addresses.
(WTF::TCMallocStats::FastMallocZone::enumerate): Ditto.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/FastMalloc.cpp

    r35691 r35803  
    18071807#ifdef WTF_CHANGES
    18081808  template <class Finder, class Reader>
    1809   void enumerateFreeObjects(Finder& finder, const Reader& reader)
     1809  void enumerateFreeObjects(Finder& finder, const Reader& reader, TCMalloc_Central_FreeList* remoteCentralFreeList)
    18101810  {
    18111811    for (Span* span = &empty_; span && span != &empty_; span = (span->next ? reader(span->next) : 0))
     
    18131813
    18141814    ASSERT(!nonempty_.objects);
    1815     for (Span* span = reader(nonempty_.next); span && span != &nonempty_; span = (span->next ? reader(span->next) : 0)) {
     1815    static const ptrdiff_t nonemptyOffset = reinterpret_cast<const char*>(&nonempty_) - reinterpret_cast<const char*>(this);
     1816
     1817    Span* remoteNonempty = reinterpret_cast<Span*>(reinterpret_cast<char*>(remoteCentralFreeList) + nonemptyOffset);
     1818    Span* remoteSpan = nonempty_.next;
     1819
     1820    for (Span* span = reader(remoteSpan); span && remoteSpan != remoteNonempty; remoteSpan = span->next, span = (span->next ? reader(span->next) : 0)) {
    18161821      for (void* nextObject = span->objects; nextObject; nextObject = *reader(reinterpret_cast<void**>(nextObject)))
    18171822        finder.visit(nextObject);
     
    35893594    }
    35903595
    3591     void findFreeObjects(TCMalloc_Central_FreeListPadded* centralFreeList, size_t numSizes)
     3596    void findFreeObjects(TCMalloc_Central_FreeListPadded* centralFreeList, size_t numSizes, TCMalloc_Central_FreeListPadded* remoteCentralFreeList)
    35923597    {
    35933598        for (unsigned i = 0; i < numSizes; i++)
    3594             centralFreeList[i].enumerateFreeObjects(*this, m_reader);
     3599            centralFreeList[i].enumerateFreeObjects(*this, m_reader, remoteCentralFreeList + i);
    35953600    }
    35963601};
     
    37063711    FreeObjectFinder finder(memoryReader);
    37073712    finder.findFreeObjects(threadHeaps);
    3708     finder.findFreeObjects(centralCaches, kNumClasses);
     3713    finder.findFreeObjects(centralCaches, kNumClasses, mzone->m_centralCaches);
    37093714
    37103715    TCMalloc_PageHeap::PageMap* pageMap = &pageHeap->pagemap_;
Note: See TracChangeset for help on using the changeset viewer.