@@ -3401,7 +3401,7 @@ void comp_pass2_scan() {
34013401 w = label -> ip ;
34023402
34033403 // adjust the address to compensate for optimisation to remove adjoining kwEOC
3404- if (comp_prog .ptr [w ] != kwTYPE_LINE && comp_prog .ptr [w - 1 ] == kwTYPE_LINE ) {
3404+ if (w > 0 && w < comp_prog . count && comp_prog .ptr [w ] != kwTYPE_LINE && comp_prog .ptr [w - 1 ] == kwTYPE_LINE ) {
34053405 w -- ;
34063406 }
34073407 memcpy (comp_prog .ptr + node -> pos + (j * ADDRSZ ) + (ADDRSZ + ADDRSZ + 3 ), & w , ADDRSZ );
@@ -3419,7 +3419,7 @@ void comp_pass2_scan() {
34193419 w = label -> ip ;
34203420
34213421 // adjust the address to compensate for optimisation to remove adjoining kwEOC
3422- if (comp_prog .ptr [w ] != kwTYPE_LINE && comp_prog .ptr [w - 1 ] == kwTYPE_LINE ) {
3422+ if (w > 0 && w < comp_prog . count && comp_prog .ptr [w ] != kwTYPE_LINE && comp_prog .ptr [w - 1 ] == kwTYPE_LINE ) {
34233423 w -- ;
34243424 }
34253425
@@ -3697,12 +3697,14 @@ bcip_t comp_optimise_line_goto(bcip_t ip) {
36973697
36983698 ip = comp_read_goto (ip + 1 , & addr , & level );
36993699 bcip_t goto_ip = addr ;
3700- if (comp_prog .ptr [goto_ip ] == kwTYPE_EOC ) {
3700+
3701+ // note: INVALID_ADDR is assumed to be > comp_prog.count
3702+ if (goto_ip < comp_prog .count && comp_prog .ptr [goto_ip ] == kwTYPE_EOC ) {
37013703 new_addr = goto_ip + 1 ;
37023704 }
3703- while (goto_ip > 0 && comp_prog .ptr [goto_ip ] == kwTYPE_LINE ) {
3705+ while (goto_ip > -1 && comp_prog .ptr [goto_ip ] == kwTYPE_LINE ) {
37043706 goto_ip += 1 + sizeof (bcip_t );
3705- if (comp_prog .ptr [goto_ip ] == kwGOTO ) {
3707+ if (goto_ip < comp_prog . count && comp_prog .ptr [goto_ip ] == kwGOTO ) {
37063708 code_t next_level ;
37073709 comp_read_goto (goto_ip + 1 , & addr , & next_level );
37083710 goto_ip = addr ;
0 commit comments