Browse Source

Added bountry checking on memory access to ensure out of bounds access does not occur

Jeremiah Orians 7 years ago
parent
commit
bfde853549
4 changed files with 29 additions and 1 deletions
  1. 1 1
      vm.c
  2. 2 0
      vm.h
  3. 16 0
      vm_decode.c
  4. 10 0
      vm_instructions.c

+ 1 - 1
vm.c

@@ -44,7 +44,7 @@ int main(int argc, char **argv)
 
 	/* Perform all the essential stages in order */
 	struct lilith* vm;
-	vm = create_vm(1 << 22);
+	vm = create_vm(1 << 20);
 	load_program(vm, argv);
 	execute_vm(vm);
 	destroy_vm(vm);

+ 2 - 0
vm.h

@@ -8,6 +8,7 @@
 struct lilith
 {
 	uint8_t *memory;
+	size_t amount_of_Ram;
 	uint32_t reg[16];
 	uint32_t ip;
 	bool halted;
@@ -247,3 +248,4 @@ struct lilith* create_vm(size_t size);
 void destroy_vm(struct lilith* vm);
 void read_instruction(struct lilith* vm, struct Instruction *current);
 void eval_instruction(struct lilith* vm, struct Instruction* current);
+void outside_of_world(struct lilith* vm, uint32_t place, char* message);

+ 16 - 0
vm_decode.c

@@ -13,6 +13,7 @@ struct lilith* create_vm(size_t size)
 	struct lilith* vm;
 	vm = calloc(1, sizeof(struct lilith));
 	vm->memory = calloc(size, sizeof(uint8_t));
+	vm->amount_of_Ram = size;
 	vm->halted = false;
 	vm->exception = false;
 	return vm;
@@ -25,6 +26,19 @@ void destroy_vm(struct lilith* vm)
 	free(vm);
 }
 
+/* Validate Memory Addresses*/
+void outside_of_world(struct lilith* vm, uint32_t place, char* message)
+{
+	if(vm->amount_of_Ram <= place)
+	{
+		fprintf(stderr, "Invalid state reached after: %i instructions\n", performance_counter);
+		fprintf(stderr, "%i: %s\n", place, message);
+		vm->halted = true;
+		exit(EXIT_FAILURE);
+	}
+
+}
+
 /* Deal with 4OP */
 void decode_4OP(struct Instruction* c)
 {
@@ -148,6 +162,8 @@ void read_instruction(struct lilith* vm, struct Instruction *current)
 	/* Store IP for debugging */
 	current->ip = vm->ip;
 
+	outside_of_world(vm, current->ip, "Instruction outside of World");
+
 	/* Read the actual bytes and increment the IP */
 	current->raw0 = (uint8_t)vm->memory[vm->ip];
 	vm->ip = vm->ip + 1;

+ 10 - 0
vm_instructions.c

@@ -19,6 +19,8 @@ void writeout_Reg(struct lilith* vm, uint32_t p, uint32_t value)
 	tmp = tmp/0x100;
 	raw0 = tmp%0x100;
 
+	outside_of_world(vm, p, "Address is outside of World");
+
 	vm->memory[p] = raw0;
 	vm->memory[p + 1] = raw1;
 	vm->memory[p + 2] = raw2;
@@ -28,6 +30,8 @@ void writeout_Reg(struct lilith* vm, uint32_t p, uint32_t value)
 /* Allow the use of native data format for Register operations */
 uint32_t readin_Reg(struct lilith* vm, uint32_t p)
 {
+	outside_of_world(vm, p, "Address is outside of World");
+
 	uint8_t raw0, raw1, raw2, raw3;
 	uint32_t sum;
 	raw0 = vm->memory[p];
@@ -46,12 +50,14 @@ uint32_t readin_Reg(struct lilith* vm, uint32_t p)
 /* Unify byte write functionality */
 void writeout_byte(struct lilith* vm, uint32_t p, uint32_t value)
 {
+	outside_of_world(vm, p, "Address is outside of World");
 	vm->memory[p] = (uint8_t)(value%0x100);
 }
 
 /* Unify byte read functionality*/
 uint32_t readin_byte(struct lilith* vm, uint32_t p, bool Signed)
 {
+	outside_of_world(vm, p, "Address is outside of World");
 	if(Signed)
 	{
 		int32_t raw0;
@@ -72,6 +78,8 @@ void writeout_doublebyte(struct lilith* vm, uint32_t p, uint32_t value)
 	utmp = utmp/0x100;
 	uraw0 = utmp%0x100;
 
+	outside_of_world(vm, p, "Address is outside of World");
+
 	vm->memory[p] = uraw0;
 	vm->memory[p + 1] = uraw1;
 }
@@ -79,6 +87,8 @@ void writeout_doublebyte(struct lilith* vm, uint32_t p, uint32_t value)
 /* Unify doublebyte read functionality*/
 uint32_t readin_doublebyte(struct lilith* vm, uint32_t p, bool Signed)
 {
+	outside_of_world(vm, p, "Address is outside of World");
+
 	if(Signed)
 	{
 		int8_t raw0, raw1;