summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormin7.choi <min7.choi@samsung.com>2017-07-20 18:55:45 +0900
committermin7.choi <min7.choi@samsung.com>2017-07-20 18:55:52 +0900
commitfbdf8cfd11929495b4f6d2290a381fb2e932f7f3 (patch)
tree58253c2360783922648a76eeaec7a61c44cce7da
parent44da52a1827bf05a010b12f4bccfb370fe4e59c2 (diff)
downloadnodejs-fbdf8cfd11929495b4f6d2290a381fb2e932f7f3.tar.gz
nodejs-fbdf8cfd11929495b4f6d2290a381fb2e932f7f3.tar.bz2
nodejs-fbdf8cfd11929495b4f6d2290a381fb2e932f7f3.zip
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>
-rw-r--r--deps/v8/src/heap/incremental-marking.cc4
-rw-r--r--deps/v8/src/heap/spaces-inl.h2
-rw-r--r--deps/v8/src/heap/spaces.cc2
-rw-r--r--deps/v8/src/heap/spaces.h4
-rw-r--r--deps/v8/test/cctest/test-spaces.cc6
5 files changed, 9 insertions, 9 deletions
diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc
index 58eb0aa40..b2b796f42 100644
--- a/deps/v8/src/heap/incremental-marking.cc
+++ b/deps/v8/src/heap/incremental-marking.cc
@@ -364,7 +364,7 @@ void IncrementalMarking::DeactivateIncrementalWriteBarrier() {
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();
}
@@ -396,7 +396,7 @@ void IncrementalMarking::ActivateIncrementalWriteBarrier() {
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();
}
diff --git a/deps/v8/src/heap/spaces-inl.h b/deps/v8/src/heap/spaces-inl.h
index c2c4d1269..d63ee635a 100644
--- a/deps/v8/src/heap/spaces-inl.h
+++ b/deps/v8/src/heap/spaces-inl.h
@@ -155,7 +155,7 @@ Page* Page::Initialize(Heap* heap, MemoryChunk* chunk, Executability executable,
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;
}
diff --git a/deps/v8/src/heap/spaces.cc b/deps/v8/src/heap/spaces.cc
index 0806b2565..c0e109b61 100644
--- a/deps/v8/src/heap/spaces.cc
+++ b/deps/v8/src/heap/spaces.cc
@@ -2953,7 +2953,7 @@ LargePage* LargeObjectSpace::FindPage(Address a) {
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;
}
diff --git a/deps/v8/src/heap/spaces.h b/deps/v8/src/heap/spaces.h
index 3461de3ef..e35c05757 100644
--- a/deps/v8/src/heap/spaces.h
+++ b/deps/v8/src/heap/spaces.h
@@ -278,9 +278,9 @@ class MemoryChunk {
// 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_));
diff --git a/deps/v8/test/cctest/test-spaces.cc b/deps/v8/test/cctest/test-spaces.cc
index 3f5e43722..8ad9e869b 100644
--- a/deps/v8/test/cctest/test-spaces.cc
+++ b/deps/v8/test/cctest/test-spaces.cc
@@ -314,7 +314,7 @@ TEST(MemoryAllocator) {
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++;
@@ -325,7 +325,7 @@ TEST(MemoryAllocator) {
// 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;
@@ -336,7 +336,7 @@ TEST(MemoryAllocator) {
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();