| ... | ... |
@@ -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 */ |