diff options
author | Dario Lombardo <lomato@gmail.com> | 2018-04-01 22:01:34 +0200 |
---|---|---|
committer | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2018-04-05 18:52:28 +0000 |
commit | 35c83b22c039526bbe3bad36797d76cf2090c7e9 (patch) | |
tree | 9baa8c412c0eab63fc783a62ec6265e93a26b934 /tools | |
parent | c95e18333c8baf130517534e83fd09024f107c06 (diff) |
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lemon/lemon.c | 22 |
1 files 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; 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); |