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 | |
parent | c9e86d6b342bc68f174825178d57e1e171972f5f (diff) |
plumber: fix memory and filedescriptor leaks (thanks BurnZeZ)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/cmd/plumb/fsys.c | 5 | ||||
-rw-r--r-- | sys/src/cmd/plumb/plumber.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/plumb/plumber.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/plumb/rules.c | 39 |
4 files changed, 29 insertions, 17 deletions
diff --git a/sys/src/cmd/plumb/fsys.c b/sys/src/cmd/plumb/fsys.c index d68ea0bc3..7c9e49e36 100644 --- a/sys/src/cmd/plumb/fsys.c +++ b/sys/src/cmd/plumb/fsys.c @@ -739,7 +739,10 @@ fsysopen(Fcall *t, uchar *buf, Fid *f) } if(clearrules){ writerules(nil, 0); - rules[0] = nil; + for(m=0; rules[m]; m++){ + freeruleset(rules[m]); + rules[m] = nil; + } } t->qid = f->qid; t->iounit = 0; diff --git a/sys/src/cmd/plumb/plumber.c b/sys/src/cmd/plumb/plumber.c index e6c18079a..21cb27cd6 100644 --- a/sys/src/cmd/plumb/plumber.c +++ b/sys/src/cmd/plumb/plumber.c @@ -68,7 +68,6 @@ threadmain(int argc, char *argv[]) error("parse error"); rules = readrules(plumbfile, fd); - close(fd); /* * Start all processes and threads from other proc diff --git a/sys/src/cmd/plumb/plumber.h b/sys/src/cmd/plumb/plumber.h index 0d1205f98..2d395ca3e 100644 --- a/sys/src/cmd/plumb/plumber.h +++ b/sys/src/cmd/plumb/plumber.h @@ -81,6 +81,7 @@ void addport(char*); char* writerules(char*, int); char* expand(Exec*, char*, char**); void makeports(Ruleset*[]); +void freeruleset(Ruleset*); void printinputstack(void); int popinput(void); 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 |