From 35c83b22c039526bbe3bad36797d76cf2090c7e9 Mon Sep 17 00:00:00 2001 From: Dario Lombardo Date: Sun, 1 Apr 2018 22:01:34 +0200 Subject: [PATCH] lemon: remove leaks in main(). Change-Id: If6693d2ad87fcd1dcceb137d76d890663f83a827 Reviewed-on: https://code.wireshark.org/review/26705 Petri-Dish: Dario Lombardo Tested-by: Petri Dish Buildbot Reviewed-by: Alexis La Goutte --- tools/lemon/lemon.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/lemon/lemon.c b/tools/lemon/lemon.c index 4673e1d061..35ffe8ce91 100644 --- a/tools/lemon/lemon.c +++ b/tools/lemon/lemon.c @@ -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; iindex = i; qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp); for(i=0; iindex = 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);