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){
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue