commit 823e301

Devine Lu Linvega  ·  2023-01-07 20:02:57 +0000 UTC
parent a124ca9
Fixed security leaks in uxnasm and uxn
2 files changed,  +9, -9
+4, -4
 1@@ -32,8 +32,8 @@ WITH REGARD TO THIS SOFTWARE.
 2 int
 3 uxn_eval(Uxn *u, Uint16 pc)
 4 {
 5-	unsigned int a, b, c, j, k, bs, instr;
 6 	Uint8 kptr, *sp;
 7+	Uint16 a, b, c, j, k, bs, instr;
 8 	Stack *src, *dst;
 9 	if(!pc || u->dev[0x0f]) return 0;
10 	while((instr = u->ram[pc++])) {
11@@ -49,8 +49,8 @@ uxn_eval(Uxn *u, Uint16 pc)
12 		case 0x00:
13 		/* Literals/Calls */
14 		if(instr == 0x20)      /* JMI  */ { PEEK16(a, pc) pc = a; }
15-		else if(instr == 0x40) /* JCI  */ { sp = &u->wst->ptr; src = u->wst; POP8(a) if(a) { PEEK16(b, pc) pc = b; } else { pc += 2; } }
16-		else if(instr == 0x60) /* JSI  */ { PEEK16(a, pc) PUSH16(u->rst, pc + 2) pc = a; }
17+		else if(instr == 0x40) /* JCI  */ { sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; }
18+		else if(instr == 0x60) /* JSI  */ { PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; }
19 		else if(bs)            /* LIT2 */ { PEEK16(a, pc) PUSH16(src, a) pc += 2; }
20 		else                   /* LITr */ { a = u->ram[pc++]; PUSH8(src, a) } break;
21 		/* ALU */
22@@ -80,7 +80,7 @@ uxn_eval(Uxn *u, Uint16 pc)
23 		case 0x18: /* ADD */ POP(a) POP(b) PUSH(src, b + a) break;
24 		case 0x19: /* SUB */ POP(a) POP(b) PUSH(src, b - a) break;
25 		case 0x1a: /* MUL */ POP(a) POP(b) PUSH(src, (Uint32)b * a) break;
26-		case 0x1b: /* DIV */ POP(a) POP(b) if(a == 0) HALT(3) PUSH(src, b / a) break;
27+		case 0x1b: /* DIV */ POP(a) POP(b) if(!a) HALT(3) PUSH(src, b / a) break;
28 		case 0x1c: /* AND */ POP(a) POP(b) PUSH(src, b & a) break;
29 		case 0x1d: /* ORA */ POP(a) POP(b) PUSH(src, b | a) break;
30 		case 0x1e: /* EOR */ POP(a) POP(b) PUSH(src, b ^ a) break;
+5, -5
 1@@ -1,7 +1,7 @@
 2 #include <stdio.h>
 3 
 4 /*
 5--Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick
 6+Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick
 7 
 8 Permission to use, copy, modify, and distribute this software for any
 9 purpose with or without fee is hereby granted, provided that the above
10@@ -416,9 +416,9 @@ assemble(FILE *f)
11 {
12 	char w[0x40];
13 	scpy("on-reset", p.scope, 0x40);
14-	while(fscanf(f, "%63s", w) == 1)
15-		if(!parse(w, f))
16-			return error("Unknown token", w);
17+	while(fscanf(f, "%62s", w) == 1)
18+		if(slen(w) > 0x3d || !parse(w, f))
19+			return error("Invalid token", w);
20 	return resolve();
21 }
22 
23@@ -443,12 +443,12 @@ review(char *filename)
24 static void
25 writesym(char *filename)
26 {
27+	int i;
28 	char symdst[0x60];
29 	FILE *fp;
30 	if(slen(filename) > 0x60 - 5)
31 		return;
32 	fp = fopen(scat(scpy(filename, symdst, slen(filename) + 1), ".sym"), "w");
33-	int i;
34 	if(fp != NULL) {
35 		for(i = 0; i < p.llen; i++) {
36 			fwrite(&p.labels[i].addr + 1, 1, 1, fp);