Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(568)

Unified Diff: runtime/vm/object.cc

Issue 106593002: Write protect executable pages in the VM. Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/instructions_x64_test.cc ('k') | runtime/vm/pages.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b138c2a23a38dbecbbe9b1d08e3abdb3194154ff..833f31903f0c540e77eaa594a3cfdbb9d5932448 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9561,7 +9561,7 @@ RawCode* Code::New(intptr_t pointer_offsets_length) {
result ^= raw;
result.set_pointer_offsets_length(pointer_offsets_length);
result.set_is_optimized(false);
- result.set_is_alive(true);
+ result.set_is_alive(false);
result.set_comments(Comments::New(0));
}
return result.raw();
@@ -9573,7 +9573,11 @@ RawCode* Code::FinalizeCode(const char* name,
bool optimized) {
ASSERT(assembler != NULL);
- // Allocate the Instructions object.
+ // Allocate the Code and Instructions objects. Code is allocated first
+ // because a GC during allocation of the code will leave the instruction
+ // pages read-only.
+ intptr_t pointer_offset_count = assembler->CountPointerOffsets();
+ Code& code = Code::ZoneHandle(Code::New(pointer_offset_count));
Instructions& instrs =
Instructions::ZoneHandle(Instructions::New(assembler->CodeSize()));
@@ -9590,17 +9594,15 @@ RawCode* Code::FinalizeCode(const char* name,
instrs.size(),
optimized);
- const ZoneGrowableArray<intptr_t>& pointer_offsets =
- assembler->GetPointerOffsets();
-
- // Allocate the code object.
- Code& code = Code::ZoneHandle(Code::New(pointer_offsets.length()));
{
NoGCScope no_gc;
+ const ZoneGrowableArray<intptr_t>& pointer_offsets =
+ assembler->GetPointerOffsets();
+ ASSERT(pointer_offsets.length() == pointer_offset_count);
+ ASSERT(code.pointer_offsets_length() == pointer_offsets.length());
// Set pointer offsets list in Code object and resolve all handles in
// the instruction stream to raw objects.
- ASSERT(code.pointer_offsets_length() == pointer_offsets.length());
for (intptr_t i = 0; i < pointer_offsets.length(); i++) {
intptr_t offset_in_instrs = pointer_offsets[i];
code.SetPointerOffsetAt(i, offset_in_instrs);
@@ -9611,6 +9613,7 @@ RawCode* Code::FinalizeCode(const char* name,
// Hook up Code and Instructions objects.
instrs.set_code(code.raw());
code.set_instructions(instrs.raw());
+ code.set_is_alive(true);
// Set object pool in Instructions object.
const GrowableObjectArray& object_pool = assembler->object_pool();
@@ -9622,6 +9625,11 @@ RawCode* Code::FinalizeCode(const char* name,
// GrowableObjectArray in new space.
instrs.set_object_pool(Array::MakeArray(object_pool));
}
+ bool status =
+ VirtualMemory::Protect(reinterpret_cast<void*>(instrs.raw_ptr()),
+ instrs.raw()->Size(),
+ VirtualMemory::kReadExecute);
+ ASSERT(status);
}
return code.raw();
}
« no previous file with comments | « runtime/vm/instructions_x64_test.cc ('k') | runtime/vm/pages.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698