Commit d9701a754e742fc3491d619fad928ac544b32b93
authorDoug Goldstein <cardoe@cardoe.com>
Mon, 10 Mar 2014 01:20:22 +0000 (20:20 -0500)
committerDoug Goldstein <cardoe@cardoe.com>
Mon, 10 Mar 2014 01:35:15 +0000 (20:35 -0500)
If we somehow had bad code that pointed us past the end of the flash it
would segfault simavr rather than catching the bad case, this fixes and
that wraps the check in an unlikely() branch hint since its very
unlikely we will take that case.

simavr/sim/sim_core.c

index 538caa479a7bfa6af3b03091b5eb3e516be2fc85..840977a82a751a07d9591dadc8e6d57b5e81a9df 100644 (file)
@@ -496,6 +496,15 @@ avr_flashaddr_t avr_run_one(avr_t * avr)
        avr->trace_data->touched[0] = avr->trace_data->touched[1] = avr->trace_data->touched[2] = 0;
 #endif
 
+       /* Ensure we don't crash simavr due to a bad instruction reading past
+        * the end of the flash.
+        */
+       if (unlikely(avr->pc >= avr->flashend)) {
+               STATE("CRASH\n");
+               crash(avr);
+               return 0;
+       }
+
        uint32_t                opcode = (avr->flash[avr->pc + 1] << 8) | avr->flash[avr->pc];
        avr_flashaddr_t new_pc = avr->pc + 2;   // future "default" pc
        int                     cycle = 1;