... | ... |
@@ -76,6 +76,10 @@ error(const char *name, const char *msg) |
76 | 76 |
static char * |
77 | 77 |
sublabel(char *src, char *scope, char *name) |
78 | 78 |
{ |
79 |
+ if(slen(scope) + slen(name) >= 0x3f) { |
|
80 |
+ error("Sublabel length too long", name); |
|
81 |
+ return NULL; |
|
82 |
+ } |
|
79 | 83 |
return scat(scat(scpy(scope, src, 0x40), "/"), name); |
80 | 84 |
} |
81 | 85 |
|
... | ... |
@@ -178,9 +182,11 @@ makereference(char *scope, char *label, Uint16 addr) |
178 | 182 |
if(p.rlen == 0x800) |
179 | 183 |
return error("References limit exceeded", label); |
180 | 184 |
r = &p.refs[p.rlen++]; |
181 |
- if(label[1] == '&') |
|
182 |
- scpy(sublabel(subw, scope, label + 2), r->name, 0x40); |
|
183 |
- else { |
|
185 |
+ if(label[1] == '&') { |
|
186 |
+ if(!sublabel(subw, scope, label + 2)) |
|
187 |
+ return error("Invalid sublabel", label); |
|
188 |
+ scpy(subw, r->name, 0x40); |
|
189 |
+ } else { |
|
184 | 190 |
int pos = spos(label + 1, '/'); |
185 | 191 |
if(pos > 0) { |
186 | 192 |
Label *l; |
... | ... |
@@ -287,7 +293,7 @@ parse(char *w, FILE *f) |
287 | 293 |
scpy(w + 1, p.scope, 0x40); |
288 | 294 |
break; |
289 | 295 |
case '&': /* sublabel */ |
290 |
- if(!makelabel(sublabel(subw, p.scope, w + 1))) |
|
296 |
+ if(!sublabel(subw, p.scope, w + 1) || !makelabel(subw)) |
|
291 | 297 |
return error("Invalid sublabel", w); |
292 | 298 |
break; |
293 | 299 |
case '#': /* literals hex */ |