]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: allocate stacks and data heap segments without execute permissions
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 16 Oct 2009 09:37:27 +0000 (04:37 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 16 Oct 2009 10:16:12 +0000 (05:16 -0500)
vm/code_heap.cpp
vm/contexts.cpp
vm/data_heap.cpp
vm/heap.cpp
vm/heap.hpp
vm/os-unix.cpp
vm/os-windows.cpp
vm/segments.hpp

index 18f089f0fadbb5b80b5d999969e3c05d3ec0f67f..d60ec189cdae12a7ea3c17d99ef8069e27dd3ba2 100755 (executable)
@@ -3,7 +3,7 @@
 namespace factor
 {
 
-code_heap::code_heap(bool secure_gc, cell size) : heap(secure_gc,size) {}
+code_heap::code_heap(bool secure_gc, cell size) : heap(secure_gc,size,true) {}
 
 void code_heap::write_barrier(code_block *compiled)
 {
index 7e0a2e195d8e5a4d45199bf4d2f5998ba1b7abbc..050f4b3db66d40aeaec3a8c02c745ba21c69619f 100644 (file)
@@ -44,8 +44,8 @@ context *factor_vm::alloc_context()
        else
        {
                new_context = new context;
-               new_context->datastack_region = new segment(ds_size);
-               new_context->retainstack_region = new segment(rs_size);
+               new_context->datastack_region = new segment(ds_size,false);
+               new_context->retainstack_region = new segment(rs_size,false);
        }
 
        return new_context;
index d93c121db0ff2e903c8564d6ad9d00ddea8fdce6..6b099533141b173c8271a20f899b83e7ec22ef0a 100755 (executable)
@@ -23,7 +23,7 @@ data_heap::data_heap(cell young_size_, cell aging_size_, cell tenured_size_)
 
        total_size += deck_size;
 
-       seg = new segment(total_size);
+       seg = new segment(total_size,false);
 
        cell cards_size = addr_to_card(total_size);
 
index f6d17cd4d5af73020fd0a243fbf866f7f7ae8020..0f0da63df0de72ebffafaf760fb81fb2702349cc 100644 (file)
@@ -11,10 +11,10 @@ void heap::clear_free_list()
        memset(&free,0,sizeof(heap_free_list));
 }
 
-heap::heap(bool secure_gc_, cell size) : secure_gc(secure_gc_)
+heap::heap(bool secure_gc_, cell size, bool executable_p) : secure_gc(secure_gc_)
 {
        if(size > (1L << (sizeof(cell) * 8 - 6))) fatal_error("Heap too large",size);
-       seg = new segment(align_page(size));
+       seg = new segment(align_page(size),executable_p);
        if(!seg) fatal_error("Out of memory in heap allocator",size);
        clear_free_list();
 }
index bc9653e3d7f3b30212a4a49a6015f69c341c2f4f..ef09c2b23822b55dea0b5d63490e08d444677271 100644 (file)
@@ -15,7 +15,7 @@ struct heap {
        heap_free_list free;
        unordered_map<heap_block *, char *> forwarding;
 
-       explicit heap(bool secure_gc_, cell size);
+       explicit heap(bool secure_gc_, cell size, bool executable_p);
 
        inline heap_block *next_block(heap_block *block)
        {
index 342be7a360a83df9ace8b5d843c30baf237092db..70d7e395dee5d42ecd4d9e1c9fd8d5d355572d81 100644 (file)
@@ -83,16 +83,19 @@ void factor_vm::primitive_existsp()
        box_boolean(stat(path,&sb) >= 0);
 }
 
-segment::segment(cell size_)
+segment::segment(cell size_, bool executable_p)
 {
        size = size_;
 
        int pagesize = getpagesize();
 
-       char *array = (char *)mmap(NULL,pagesize + size + pagesize,
-               PROT_READ | PROT_WRITE | PROT_EXEC,
-               MAP_ANON | MAP_PRIVATE,-1,0);
+       int prot;
+       if(executable_p)
+               prot = (PROT_READ | PROT_WRITE | PROT_EXEC);
+       else
+               prot = (PROT_READ | PROT_WRITE);
 
+       char *array = (char *)mmap(NULL,pagesize + size + pagesize,prot,MAP_ANON | MAP_PRIVATE,-1,0);
        if(array == (char*)-1) out_of_memory();
 
        if(mprotect(array,pagesize,PROT_NONE) == -1)
index 48ddeffcb6d3d501e4e15a92a3ec3130ea07c012..48745584d3c29ee8d4513e635cdfff08a4b0975c 100755 (executable)
@@ -96,7 +96,7 @@ void factor_vm::primitive_existsp()
        box_boolean(windows_stat(path));
 }
 
-segment::segment(cell size_)
+segment::segment(cell size_, bool executable_p)
 {
        size = size_;
 
@@ -104,7 +104,7 @@ segment::segment(cell size_)
        DWORD ignore;
 
        if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
-               MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == 0)
+               MEM_COMMIT, executable_p ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE)) == 0)
                out_of_memory();
 
        if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
index 6ff21709746673aaf9d45c3fd36ea3d1bf61f40b..5cedada57803e9afe1962ef8ed31f13dab2c4d98 100644 (file)
@@ -13,7 +13,7 @@ struct segment {
        cell size;
        cell end;
 
-       explicit segment(cell size);
+       explicit segment(cell size, bool executable_p);
        ~segment();
 };