vm: fix integer overflow
parent
ab9b462411
commit
639a64c2df
|
@ -13,8 +13,9 @@ void heap::clear_free_list()
|
||||||
|
|
||||||
heap::heap(bool secure_gc_, cell size) : secure_gc(secure_gc_)
|
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));
|
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();
|
clear_free_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,9 +64,9 @@ inline static cell align8(cell a)
|
||||||
|
|
||||||
#define TYPE_COUNT 15
|
#define TYPE_COUNT 15
|
||||||
|
|
||||||
/* Not a real type, but code_block's type field can be set to this */
|
/* Not real types, but code_block's type can be set to this */
|
||||||
#define PIC_TYPE 42
|
#define PIC_TYPE 16
|
||||||
#define FREE_BLOCK_TYPE 69
|
#define FREE_BLOCK_TYPE 17
|
||||||
|
|
||||||
/* Constants used when floating-point trap exceptions are thrown */
|
/* Constants used when floating-point trap exceptions are thrown */
|
||||||
enum
|
enum
|
||||||
|
@ -213,16 +213,16 @@ struct heap_block
|
||||||
header &= ~1;
|
header &= ~1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell type() { return (header >> 1) & 0x7f; }
|
cell type() { return (header >> 1) & 0x1f; }
|
||||||
void set_type(cell type)
|
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)
|
void set_size(cell size)
|
||||||
{
|
{
|
||||||
header = (header & 0xff) | (size << 8);
|
header = (header & 0x2f) | (size << 6);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue