Browse code

Catch invalid sublabels

Devine Lu Linvega authored on 14/01/2023 23:08:40
Showing 1 changed files
... ...
@@ -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 */