shithub: riscv

Download patch

ref: f6e8b115d49e8aec463e3a495d53ee11031a4db6
parent: 9b0de7f9d63386bc5e2cb5889559bbdb0c11503d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Dec 22 12:00:00 EST 2015

libjson: fix memory leak setjmp/longjmp problem (thanks spew)

spew → I fixed the memory leak setjmp/longjmp problem with libjson
spew → http://www.spew.club/json.patch
spew → full file: http://www.spew.club/json.c
spew → going to bed, I'll annoy cinap_lenrek tomorrow to try to get this committed

--- a/sys/src/libjson/json.c
+++ b/sys/src/libjson/json.c
@@ -22,8 +22,6 @@
 	double n;
 	char *buf;
 	Rune peeked;
-	jmp_buf jmp;
-	int canjmp;
 };
 
 static Rune
@@ -50,6 +48,20 @@
 	return l->peeked;
 }
 
+static Rune
+peeknonspace(Lex *l)
+{
+	Rune r;
+
+	for(;;){
+		r = peekch(l);
+		if(r != 0x20 && r != 0x09 && r != 0x0A && r != 0x0D)
+			break;
+		getch(l);
+	}
+	return r;
+}
+
 static int
 fixsurrogate(Rune *rp, Rune r2)
 {
@@ -81,16 +93,8 @@
 	int i;
 	char c;
 
-	for(;;){
-		r = peekch(l);
-		if(r != 0x20 && r != 0x09 && r != 0x0A && r != 0x0D)
-			break;
-		getch(l);
-	}
+	peeknonspace(l);
 	r = getch(l);
-	if(r == ']' && l->canjmp)
-		longjmp(l->jmp, 1);
-	l->canjmp = 0;
 	if(r == 0 || r == '{' || r == '[' || r == ']' || r == '}' || r == ':' || r == ','){
 		l->t = r;
 		return 0;
@@ -241,7 +245,6 @@
 	case '[':
 		obj = l->t == '{';
 		ln = &j->first;
-		e = nil;
 		if(obj){
 			j->t = JSONObject;
 			if(lex(l) < 0)
@@ -251,9 +254,8 @@
 			goto firstobj;
 		}else{
 			j->t = JSONArray;
-			l->canjmp = 1;
-			if(setjmp(l->jmp) > 0){
-				free(e);
+			if(peeknonspace(l) == ']'){
+				getch(l);
 				return j;
 			}
 		}