Browse Source

deps: backport IsValid changes from 4e8736d in V8

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/6544
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com>
process-exit-stdio-flushing
Michaël Zasso 9 years ago
parent
commit
96198d5bc7
No known key found for this signature in database GPG Key ID: 770F7A9A5AE15600
  1. 4
      deps/v8/src/heap/incremental-marking.cc
  2. 4
      deps/v8/src/heap/spaces-inl.h
  3. 2
      deps/v8/src/heap/spaces.cc
  4. 4
      deps/v8/src/heap/spaces.h
  5. 6
      deps/v8/test/cctest/heap/test-spaces.cc

4
deps/v8/src/heap/incremental-marking.cc

@ -404,7 +404,7 @@ void IncrementalMarking::DeactivateIncrementalWriteBarrier() {
DeactivateIncrementalWriteBarrierForSpace(heap_->new_space()); DeactivateIncrementalWriteBarrierForSpace(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page(); LargePage* lop = heap_->lo_space()->first_page();
while (lop->is_valid()) { while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, false, false); SetOldSpacePageFlags(lop, false, false);
lop = lop->next_page(); lop = lop->next_page();
} }
@ -436,7 +436,7 @@ void IncrementalMarking::ActivateIncrementalWriteBarrier() {
ActivateIncrementalWriteBarrier(heap_->new_space()); ActivateIncrementalWriteBarrier(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page(); LargePage* lop = heap_->lo_space()->first_page();
while (lop->is_valid()) { while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, true, is_compacting_); SetOldSpacePageFlags(lop, true, is_compacting_);
lop = lop->next_page(); lop = lop->next_page();
} }

4
deps/v8/src/heap/spaces-inl.h

@ -284,14 +284,14 @@ void MemoryChunk::IncrementLiveBytesFromMutator(HeapObject* object, int by) {
bool PagedSpace::Contains(Address addr) { bool PagedSpace::Contains(Address addr) {
Page* p = Page::FromAddress(addr); Page* p = Page::FromAddress(addr);
if (!p->is_valid()) return false; if (!Page::IsValid(p)) return false;
return p->owner() == this; return p->owner() == this;
} }
bool PagedSpace::Contains(Object* o) { bool PagedSpace::Contains(Object* o) {
if (!o->IsHeapObject()) return false; if (!o->IsHeapObject()) return false;
Page* p = Page::FromAddress(HeapObject::cast(o)->address()); Page* p = Page::FromAddress(HeapObject::cast(o)->address());
if (!p->is_valid()) return false; if (!Page::IsValid(p)) return false;
return p->owner() == this; return p->owner() == this;
} }

2
deps/v8/src/heap/spaces.cc

@ -3044,7 +3044,7 @@ LargePage* LargeObjectSpace::FindPage(Address a) {
if (e != NULL) { if (e != NULL) {
DCHECK(e->value != NULL); DCHECK(e->value != NULL);
LargePage* page = reinterpret_cast<LargePage*>(e->value); LargePage* page = reinterpret_cast<LargePage*>(e->value);
DCHECK(page->is_valid()); DCHECK(LargePage::IsValid(page));
if (page->Contains(a)) { if (page->Contains(a)) {
return page; return page;
} }

4
deps/v8/src/heap/spaces.h

@ -454,9 +454,9 @@ class MemoryChunk {
!chunk->high_water_mark_.TrySetValue(old_mark, new_mark)); !chunk->high_water_mark_.TrySetValue(old_mark, new_mark));
} }
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); }
base::Mutex* mutex() { return mutex_; } base::Mutex* mutex() { return mutex_; }

6
deps/v8/test/cctest/heap/test-spaces.cc

@ -321,7 +321,7 @@ TEST(MemoryAllocator) {
faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE); faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE);
first_page->InsertAfter(faked_space.anchor()->prev_page()); 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()); CHECK(first_page->next_page() == faked_space.anchor());
total_pages++; total_pages++;
@ -332,7 +332,7 @@ TEST(MemoryAllocator) {
// Again, we should get n or n - 1 pages. // Again, we should get n or n - 1 pages.
Page* other = memory_allocator->AllocatePage(faked_space.AreaSize(), Page* other = memory_allocator->AllocatePage(faked_space.AreaSize(),
&faked_space, NOT_EXECUTABLE); &faked_space, NOT_EXECUTABLE);
CHECK(other->is_valid()); CHECK(Page::IsValid(other));
total_pages++; total_pages++;
other->InsertAfter(first_page); other->InsertAfter(first_page);
int page_count = 0; int page_count = 0;
@ -343,7 +343,7 @@ TEST(MemoryAllocator) {
CHECK(total_pages == page_count); CHECK(total_pages == page_count);
Page* second_page = first_page->next_page(); Page* second_page = first_page->next_page();
CHECK(second_page->is_valid()); CHECK(Page::IsValid(second_page));
// OldSpace's destructor will tear down the space and free up all pages. // OldSpace's destructor will tear down the space and free up all pages.
} }

Loading…
Cancel
Save