]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: fix integer overflow
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 9 Oct 2009 10:53:55 +0000 (05:53 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 9 Oct 2009 10:55:32 +0000 (05:55 -0500)
vm/heap.cpp
vm/layouts.hpp

index 9cd59c9139b1da6a7298b644df658c27d8fcb538..1689af3ee49f84fd22d7abccad185107002f8ac3 100644 (file)
@@ -13,8 +13,9 @@ void heap::clear_free_list()
 
 heap::heap(bool secure_gc_, cell size) : secure_gc(secure_gc_)
 {
+       if(size > (1L << (sizeof(cell) * 8 - 6))) fatal_error("Heap too large",size);
        seg = new segment(align_page(size));
-       if(!seg) fatal_error("Out of memory in new_heap",size);
+       if(!seg) fatal_error("Out of memory in heap allocator",size);
        clear_free_list();
 }
 
index 25db79b00a3966d8e302e4becb5febe6e43475f6..988fc99ec5755a0a51eeb6c630646bd04002060a 100644 (file)
@@ -64,9 +64,9 @@ inline static cell align8(cell a)
 
 #define TYPE_COUNT 15
 
-/* Not a real type, but code_block's type field can be set to this */
-#define PIC_TYPE 42
-#define FREE_BLOCK_TYPE 69
+/* Not real types, but code_block's type can be set to this */
+#define PIC_TYPE 16
+#define FREE_BLOCK_TYPE 17
 
 /* Constants used when floating-point trap exceptions are thrown */
 enum
@@ -213,16 +213,16 @@ struct heap_block
                        header &= ~1;
        }
 
-       cell type() { return (header >> 1) & 0x7f; }
+       cell type() { return (header >> 1) & 0x1f; }
        void set_type(cell type)
        {
-               header = ((header & ~(0x7f << 1)) | (type << 1));
+               header = ((header & ~(0x1f << 1)) | (type << 1));
        }
 
-       cell size() { return (header >> 8); }
+       cell size() { return (header >> 6); }
        void set_size(cell size)
        {
-               header = (header & 0xff) | (size << 8);
+               header = (header & 0x2f) | (size << 6);
        }
 };