diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-10-11 22:49:45 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-10-11 22:49:45 +0200 |
commit | 4808971db6c402f0f50a9bd2145e0e2daa5786fa (patch) | |
tree | ff41151684e5541a1f4128f5d5580578602a8406 /sys/src/cmd/plumb/rules.c | |
parent | c9e86d6b342bc68f174825178d57e1e171972f5f (diff) |
plumber: fix memory and filedescriptor leaks (thanks BurnZeZ)
Diffstat (limited to 'sys/src/cmd/plumb/rules.c')
-rw-r--r-- | sys/src/cmd/plumb/rules.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/sys/src/cmd/plumb/rules.c b/sys/src/cmd/plumb/rules.c index 2b537fe21..5f7ea34e7 100644 --- a/sys/src/cmd/plumb/rules.c +++ b/sys/src/cmd/plumb/rules.c @@ -103,8 +103,7 @@ pushinput(char *name, int fd, uchar *str) if(str) in->s = str; else{ - in->fd = emalloc(sizeof(Biobuf)); - if(Binit(in->fd, fd, OREAD) < 0) + if((in->fd = Bfdopen(fd, OREAD)) == nil) parseerror("can't initialize Bio for rules file: %r"); } @@ -119,10 +118,8 @@ popinput(void) if(in == nil) return 0; input = in->next; - if(in->fd){ + if(in->fd) Bterm(in->fd); - free(in->fd); - } free(in->file); free(in); return 1; @@ -429,12 +426,22 @@ include(char *s) return 0; } +void +freerule(Rule *r) +{ + free(r->arg); + free(r->qarg); + free(r->regex); + free(r); +} + Rule* readrule(int *eof) { Rule *rp; char *line, *p; char *word; + jmp_buf ojmp; Top: line = getline(); @@ -463,6 +470,12 @@ Top: return nil; rp = emalloc(sizeof(Rule)); + + memmove(ojmp, parsejmp, sizeof(jmp_buf)); + if(setjmp(parsejmp)){ + freerule(rp); + longjmp(ojmp, 1); + } /* object */ for(word=p; *p!=' ' && *p!='\t'; p++) @@ -497,15 +510,9 @@ Top: parserule(rp); - return rp; -} + memmove(parsejmp, ojmp, sizeof(jmp_buf)); -void -freerule(Rule *r) -{ - free(r->arg); - free(r->qarg); - free(r->regex); + return rp; } void @@ -735,8 +742,10 @@ morerules(uchar *text, int done) for(s=text; *s!='\0'; s++) if(*s=='\n' && *++s=='\n') endofrule = s+1; - if(endofrule == nil) + if(endofrule == nil){ + popinput(); return text; + } input->end = endofrule; } for(n=0; rules[n]; n++) @@ -746,7 +755,7 @@ morerules(uchar *text, int done) rules[n++] = rs; rules[n] = nil; } - otext =text; + otext = text; if(input == nil) text = (uchar*)estrdup(""); else |