From 563ea585b5db4ece5fd6c109f661e687dfda5c7d Mon Sep 17 00:00:00 2001 From: KungFuFurby Date: Mon, 20 Sep 2021 16:39:33 -0400 Subject: [PATCH 1/3] Add invalid branch distance error checking on BBC/BBS opcodes This commit closes #219. --- src/asar/arch-spc700.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/asar/arch-spc700.cpp b/src/asar/arch-spc700.cpp index 04ee8637..b248418a 100644 --- a/src/asar/arch-spc700.cpp +++ b/src/asar/arch-spc700.cpp @@ -356,6 +356,10 @@ bool asblock_spc700(char** word, int numwords) write2(((unsigned int)bits<<13)|num); return true; } + int pos = (getnum(arg[1])- (unsigned int)(snespos)-3); + if (pass && foundlabel && (pos<-128 || pos>127)) { + asar_throw_error(1, error_type_block, error_id_relative_branch_out_of_bounds, dec(pos).data()); + } if(0); else if (isop("bbs")) write1((unsigned int)(0x03|(bits<<5))); else if (isop("bbc")) write1((unsigned int)(0x13|(bits<<5))); @@ -363,7 +367,7 @@ bool asblock_spc700(char** word, int numwords) unsigned int num=getnum(s1); if (num>=0x100) asar_throw_error(2, error_type_block, error_id_snes_address_out_of_bounds, hex6(num).data()); write1(num); - write1((getnum(arg[1])- (unsigned int)(snespos+1))); + write1(pos); return true; } #undef isop From ab2e3659a3303b02bfcc0bb592e2666d9b97ab3a Mon Sep 17 00:00:00 2001 From: RPG Hacker Date: Sat, 27 Jan 2024 13:18:43 +0100 Subject: [PATCH 2/3] Fixed defines sometimes being evaluated in inactive branches --- src/asar/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/asar/main.cpp b/src/asar/main.cpp index 788631d0..375cf04a 100644 --- a/src/asar/main.cpp +++ b/src/asar/main.cpp @@ -525,7 +525,7 @@ void assembleline(const char * fname, int linenum, const char * line) try { string tmp; - if(inmacro) tmp = replace_macro_args(line); + if(inmacro && numif == numtrue) tmp = replace_macro_args(line); else tmp = line; clean(tmp); string out; From 181cfc65870208654401b2c7d0108c06ef33848c Mon Sep 17 00:00:00 2001 From: trillian Date: Sat, 27 Jan 2024 21:39:24 +0200 Subject: [PATCH 3/3] fix assert crashing on invalid conditions (closes #279) --- src/asar/assembleblock.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/asar/assembleblock.cpp b/src/asar/assembleblock.cpp index c52aee58..77b478de 100644 --- a/src/asar/assembleblock.cpp +++ b/src/asar/assembleblock.cpp @@ -1050,6 +1050,7 @@ void assembleblock(const char * block, bool isspecialline) if (is("assert")) { autoptr tokens = qpsplit(word[numwords - 1], ","); + if (tokens == nullptr) asar_throw_error(0, error_type_block, error_id_broken_conditional, word[0]); if (tokens[0] != NULL && tokens[1] != NULL) { string rawerrmsg;