V8 erroneously did null pointer checks on `this`.
It can lead to a SIGSEGV crash if node is compiled with GCC 6.
Backport relevant changes from [1] that fix this issue.
[1]: https://codereview.chromium.org/
1900423002
Fixes: https://github.com/nodejs/node/issues/6272
PR-URL: https://github.com/nodejs/node/pull/6669
Change-Id: I488cde214e1b22df424e74d8ffaed91c119b56a5
Signed-off-by: min7.choi <min7.choi@samsung.com>
DeactivateIncrementalWriteBarrierForSpace(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page();
- while (lop->is_valid()) {
+ while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, false, false);
lop = lop->next_page();
}
ActivateIncrementalWriteBarrier(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page();
- while (lop->is_valid()) {
+ while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, true, is_compacting_);
lop = lop->next_page();
}
bool PagedSpace::Contains(Address addr) {
Page* p = Page::FromAddress(addr);
- if (!p->is_valid()) return false;
+ if (!Page::IsValid(p)) return false;
return p->owner() == this;
}
if (e != NULL) {
DCHECK(e->value != NULL);
LargePage* page = reinterpret_cast<LargePage*>(e->value);
- DCHECK(page->is_valid());
+ DCHECK(LargePage::IsValid(page));
if (page->Contains(a)) {
return page;
}
// Only works for addresses in pointer spaces, not data or code spaces.
static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr);
- Address address() { return reinterpret_cast<Address>(this); }
+ static bool IsValid(MemoryChunk* chunk) { return chunk != nullptr; }
- bool is_valid() { return address() != NULL; }
+ Address address() { return reinterpret_cast<Address>(this); }
MemoryChunk* next_chunk() const {
return reinterpret_cast<MemoryChunk*>(base::Acquire_Load(&next_chunk_));
faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE);
first_page->InsertAfter(faked_space.anchor()->prev_page());
- CHECK(first_page->is_valid());
+ CHECK(Page::IsValid(first_page));
CHECK(first_page->next_page() == faked_space.anchor());
total_pages++;
// Again, we should get n or n - 1 pages.
Page* other = memory_allocator->AllocatePage(
faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE);
- CHECK(other->is_valid());
+ CHECK(Page::IsValid(other));
total_pages++;
other->InsertAfter(first_page);
int page_count = 0;
CHECK(total_pages == page_count);
Page* second_page = first_page->next_page();
- CHECK(second_page->is_valid());
+ CHECK(Page::IsValid(second_page));
memory_allocator->Free(first_page);
memory_allocator->Free(second_page);
memory_allocator->TearDown();