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

View file

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

View file

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

View file

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