| Index: Source/platform/heap/Heap.cpp
|
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
|
| index 3fef547f1660fe8dc9a2fddf735d751d6e8f191d..9ab3149667b4110977e8d91b913aecf3f02e7699 100644
|
| --- a/Source/platform/heap/Heap.cpp
|
| +++ b/Source/platform/heap/Heap.cpp
|
| @@ -544,6 +544,7 @@ void NormalPageHeap::freePage(NormalPage* page)
|
| Heap::decreaseAllocatedSpace(page->size());
|
|
|
| if (page->terminating()) {
|
| + ASSERT(ThreadState::current()->isTerminating());
|
| // The thread is shutting down and this page is being removed as a part
|
| // of the thread local GC. In that case the object could be traced in
|
| // the next global GC if there is a dangling pointer from a live thread
|
| @@ -553,7 +554,9 @@ void NormalPageHeap::freePage(NormalPage* page)
|
| // crashes instead of causing use-after-frees. After the next global
|
| // GC, the orphaned pages are removed.
|
| Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), page);
|
| + ASSERT(!page->terminating());
|
| } else {
|
| + ASSERT(!ThreadState::current()->isTerminating());
|
| PageMemory* memory = page->storage();
|
| page->~NormalPage();
|
| Heap::freePagePool()->addFreePage(heapIndex(), memory);
|
| @@ -926,6 +929,7 @@ void LargeObjectHeap::freeLargeObjectPage(LargeObjectPage* object)
|
| // crashes instead of causing use-after-frees. After the next global
|
| // GC, the orphaned pages are removed.
|
| Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), object);
|
| + ASSERT(!object->terminating());
|
| } else {
|
| ASSERT(!ThreadState::current()->isTerminating());
|
| PageMemory* memory = object->storage();
|
| @@ -1312,16 +1316,24 @@ void NormalPage::checkAndMarkPointer(Visitor* visitor, Address address)
|
| markPointer(visitor, header);
|
| }
|
|
|
| -void NormalPage::markOrphaned()
|
| +static void zapOrphanedPage(void* payload, size_t payloadSize)
|
| {
|
| +#if defined(ADDRESS_SANITIZER)
|
| + // Unpoison memory before memset.
|
| + ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize());
|
| +#endif
|
| // Zap the payload with a recognizable value to detect any incorrect
|
| // cross thread pointer usage.
|
| + memset(payload, orphanedZapValue, payloadSize);
|
| #if defined(ADDRESS_SANITIZER)
|
| - // This needs to zap poisoned memory as well.
|
| - // Force unpoison memory before memset.
|
| + // Poison the memory again.
|
| ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize());
|
| #endif
|
| - memset(payload(), orphanedZapValue, payloadSize());
|
| +}
|
| +
|
| +void NormalPage::markOrphaned()
|
| +{
|
| + zapOrphanedPage(payload(), payloadSize());
|
| BasePage::markOrphaned();
|
| }
|
|
|
| @@ -1485,9 +1497,7 @@ void LargeObjectPage::checkAndMarkPointer(Visitor* visitor, Address address)
|
|
|
| void LargeObjectPage::markOrphaned()
|
| {
|
| - // Zap the payload with a recognizable value to detect any incorrect
|
| - // cross thread pointer usage.
|
| - memset(payload(), orphanedZapValue, payloadSize());
|
| + zapOrphanedPage(payload(), payloadSize());
|
| BasePage::markOrphaned();
|
| }
|
|
|
|
|