plumber: fix memory and filedescriptor leaks (thanks BurnZeZ)
This commit is contained in:
parent
c9e86d6b34
commit
4808971db6
4 changed files with 29 additions and 17 deletions
|
@ -739,7 +739,10 @@ fsysopen(Fcall *t, uchar *buf, Fid *f)
|
||||||
}
|
}
|
||||||
if(clearrules){
|
if(clearrules){
|
||||||
writerules(nil, 0);
|
writerules(nil, 0);
|
||||||
rules[0] = nil;
|
for(m=0; rules[m]; m++){
|
||||||
|
freeruleset(rules[m]);
|
||||||
|
rules[m] = nil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
t->qid = f->qid;
|
t->qid = f->qid;
|
||||||
t->iounit = 0;
|
t->iounit = 0;
|
||||||
|
|
|
@ -68,7 +68,6 @@ threadmain(int argc, char *argv[])
|
||||||
error("parse error");
|
error("parse error");
|
||||||
|
|
||||||
rules = readrules(plumbfile, fd);
|
rules = readrules(plumbfile, fd);
|
||||||
close(fd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start all processes and threads from other proc
|
* Start all processes and threads from other proc
|
||||||
|
|
|
@ -81,6 +81,7 @@ void addport(char*);
|
||||||
char* writerules(char*, int);
|
char* writerules(char*, int);
|
||||||
char* expand(Exec*, char*, char**);
|
char* expand(Exec*, char*, char**);
|
||||||
void makeports(Ruleset*[]);
|
void makeports(Ruleset*[]);
|
||||||
|
void freeruleset(Ruleset*);
|
||||||
void printinputstack(void);
|
void printinputstack(void);
|
||||||
int popinput(void);
|
int popinput(void);
|
||||||
|
|
||||||
|
|
|
@ -103,8 +103,7 @@ pushinput(char *name, int fd, uchar *str)
|
||||||
if(str)
|
if(str)
|
||||||
in->s = str;
|
in->s = str;
|
||||||
else{
|
else{
|
||||||
in->fd = emalloc(sizeof(Biobuf));
|
if((in->fd = Bfdopen(fd, OREAD)) == nil)
|
||||||
if(Binit(in->fd, fd, OREAD) < 0)
|
|
||||||
parseerror("can't initialize Bio for rules file: %r");
|
parseerror("can't initialize Bio for rules file: %r");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,10 +118,8 @@ popinput(void)
|
||||||
if(in == nil)
|
if(in == nil)
|
||||||
return 0;
|
return 0;
|
||||||
input = in->next;
|
input = in->next;
|
||||||
if(in->fd){
|
if(in->fd)
|
||||||
Bterm(in->fd);
|
Bterm(in->fd);
|
||||||
free(in->fd);
|
|
||||||
}
|
|
||||||
free(in->file);
|
free(in->file);
|
||||||
free(in);
|
free(in);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -429,12 +426,22 @@ include(char *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
freerule(Rule *r)
|
||||||
|
{
|
||||||
|
free(r->arg);
|
||||||
|
free(r->qarg);
|
||||||
|
free(r->regex);
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
|
||||||
Rule*
|
Rule*
|
||||||
readrule(int *eof)
|
readrule(int *eof)
|
||||||
{
|
{
|
||||||
Rule *rp;
|
Rule *rp;
|
||||||
char *line, *p;
|
char *line, *p;
|
||||||
char *word;
|
char *word;
|
||||||
|
jmp_buf ojmp;
|
||||||
|
|
||||||
Top:
|
Top:
|
||||||
line = getline();
|
line = getline();
|
||||||
|
@ -463,6 +470,12 @@ Top:
|
||||||
return nil;
|
return nil;
|
||||||
|
|
||||||
rp = emalloc(sizeof(Rule));
|
rp = emalloc(sizeof(Rule));
|
||||||
|
|
||||||
|
memmove(ojmp, parsejmp, sizeof(jmp_buf));
|
||||||
|
if(setjmp(parsejmp)){
|
||||||
|
freerule(rp);
|
||||||
|
longjmp(ojmp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* object */
|
/* object */
|
||||||
for(word=p; *p!=' ' && *p!='\t'; p++)
|
for(word=p; *p!=' ' && *p!='\t'; p++)
|
||||||
|
@ -497,15 +510,9 @@ Top:
|
||||||
|
|
||||||
parserule(rp);
|
parserule(rp);
|
||||||
|
|
||||||
return rp;
|
memmove(parsejmp, ojmp, sizeof(jmp_buf));
|
||||||
}
|
|
||||||
|
|
||||||
void
|
return rp;
|
||||||
freerule(Rule *r)
|
|
||||||
{
|
|
||||||
free(r->arg);
|
|
||||||
free(r->qarg);
|
|
||||||
free(r->regex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -735,8 +742,10 @@ morerules(uchar *text, int done)
|
||||||
for(s=text; *s!='\0'; s++)
|
for(s=text; *s!='\0'; s++)
|
||||||
if(*s=='\n' && *++s=='\n')
|
if(*s=='\n' && *++s=='\n')
|
||||||
endofrule = s+1;
|
endofrule = s+1;
|
||||||
if(endofrule == nil)
|
if(endofrule == nil){
|
||||||
|
popinput();
|
||||||
return text;
|
return text;
|
||||||
|
}
|
||||||
input->end = endofrule;
|
input->end = endofrule;
|
||||||
}
|
}
|
||||||
for(n=0; rules[n]; n++)
|
for(n=0; rules[n]; n++)
|
||||||
|
@ -746,7 +755,7 @@ morerules(uchar *text, int done)
|
||||||
rules[n++] = rs;
|
rules[n++] = rs;
|
||||||
rules[n] = nil;
|
rules[n] = nil;
|
||||||
}
|
}
|
||||||
otext =text;
|
otext = text;
|
||||||
if(input == nil)
|
if(input == nil)
|
||||||
text = (uchar*)estrdup("");
|
text = (uchar*)estrdup("");
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue