diff --git a/src/uxnasm.c b/src/uxnasm.c index b229da3..6fc5cfb 100644 --- a/src/uxnasm.c +++ b/src/uxnasm.c @@ -39,7 +39,7 @@ typedef struct { Uint16 llen, mlen, rlen; Label labels[0x400]; Macro macros[0x100]; - Reference refs[0x800]; + Reference refs[0x1000]; char scope[0x40]; } Program; @@ -76,6 +76,10 @@ error(const char *name, const char *msg) static char * sublabel(char *src, char *scope, char *name) { + if(slen(scope) + slen(name) >= 0x3f) { + error("Sublabel length too long", name); + return NULL; + } return scat(scat(scpy(scope, src, 0x40), "/"), name); } @@ -175,12 +179,14 @@ makereference(char *scope, char *label, Uint16 addr) { char subw[0x40], parent[0x40]; Reference *r; - if(p.rlen == 0x800) + if(p.rlen == 0x1000) return error("References limit exceeded", label); r = &p.refs[p.rlen++]; - if(label[1] == '&') - scpy(sublabel(subw, scope, label + 2), r->name, 0x40); - else { + if(label[1] == '&') { + if(!sublabel(subw, scope, label + 2)) + return error("Invalid sublabel", label); + scpy(subw, r->name, 0x40); + } else { int pos = spos(label + 1, '/'); if(pos > 0) { Label *l; @@ -287,7 +293,7 @@ parse(char *w, FILE *f) scpy(w + 1, p.scope, 0x40); break; case '&': /* sublabel */ - if(!makelabel(sublabel(subw, p.scope, w + 1))) + if(!sublabel(subw, p.scope, w + 1) || !makelabel(subw)) return error("Invalid sublabel", w); break; case '#': /* literals hex */ @@ -408,6 +414,7 @@ static int assemble(FILE *f) { char w[0x40]; + p.ptr = 0x100; scpy("on-reset", p.scope, 0x40); while(fscanf(f, "%62s", w) == 1) if(slen(w) > 0x3d || !parse(w, f))