lemon: remove leaks in main().

Change-Id: If6693d2ad87fcd1dcceb137d76d890663f83a827
Reviewed-on: https://code.wireshark.org/review/26705
Petri-Dish: Dario Lombardo <lomato@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
This commit is contained in:
Dario Lombardo 2018-04-01 22:01:34 +02:00 committed by Alexis La Goutte
parent c95e18333c
commit 35c83b22c0
1 changed files with 20 additions and 2 deletions

View File

@ -1699,6 +1699,10 @@ int main(int argc _U_, char **argv)
int exitcode;
struct lemon lem;
struct rule *rp;
struct symbol *dollar_sym;
struct symbol *default_sym;
memset(&lem, 0x0, sizeof(lem));
OptInit(argv,options,stderr);
if( version ){
@ -1720,7 +1724,7 @@ int main(int argc _U_, char **argv)
lem.filename = OptArg(0);
lem.basisflag = basisflag;
lem.nolinenosflag = nolinenosflag;
Symbol_new("$");
dollar_sym = Symbol_new("$");
lem.errsym = Symbol_new("error");
lem.errsym->useCnt = 0;
@ -1731,14 +1735,25 @@ int main(int argc _U_, char **argv)
Parse(&lem);
if( lem.errorcnt ) exit(lem.errorcnt);
if( lem.nrule==0 || lem.rule == NULL ){
free(dollar_sym);
fprintf(stderr,"Empty grammar.\n");
exit(1);
}
/* Count and index the symbols of the grammar */
Symbol_new("{default}");
default_sym = Symbol_new("{default}");
lem.nsymbol = Symbol_count();
lem.symbols = Symbol_arrayof();
if (lem.nsymbol == 0 || !lem.symbols) {
free(dollar_sym);
free(default_sym);
free(lem.errsym);
if (lem.symbols)
free(lem.symbols);
fprintf(stderr, "Can't find symbols\n");
exit(1);
}
for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i;
qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp);
for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i;
@ -1825,6 +1840,9 @@ int main(int argc _U_, char **argv)
fprintf(stderr,"%d parsing conflicts.\n",lem.nconflict);
}
free(default_sym);
free(dollar_sym);
/* return 0 on success, 1 on failure. */
exitcode = ((lem.errorcnt > 0) || (lem.nconflict > 0)) ? 1 : 0;
exit(exitcode);