plumber: fix memory and filedescriptor leaks (thanks BurnZeZ)

This commit is contained in:
cinap_lenrek 2018-10-11 22:49:45 +02:00
parent c9e86d6b34
commit 4808971db6
4 changed files with 29 additions and 17 deletions

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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