From f6e8b115d49e8aec463e3a495d53ee11031a4db6 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 22 Dec 2015 17:00:00 +0100 Subject: [PATCH] libjson: fix memory leak setjmp/longjmp problem (thanks spew) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- sys/src/libjson/json.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/sys/src/libjson/json.c b/sys/src/libjson/json.c index 4a671c4e5..c62cfa248 100644 --- a/sys/src/libjson/json.c +++ b/sys/src/libjson/json.c @@ -22,8 +22,6 @@ struct Lex double n; char *buf; Rune peeked; - jmp_buf jmp; - int canjmp; }; static Rune @@ -50,6 +48,20 @@ peekch(Lex *l) 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 @@ lex(Lex *l) 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 @@ error: case '[': obj = l->t == '{'; ln = &j->first; - e = nil; if(obj){ j->t = JSONObject; if(lex(l) < 0) @@ -251,9 +254,8 @@ error: goto firstobj; }else{ j->t = JSONArray; - l->canjmp = 1; - if(setjmp(l->jmp) > 0){ - free(e); + if(peeknonspace(l) == ']'){ + getch(l); return j; } }