aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2018-04-01 22:01:34 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2018-04-05 18:52:28 +0000
commit35c83b22c039526bbe3bad36797d76cf2090c7e9 (patch)
tree9baa8c412c0eab63fc783a62ec6265e93a26b934 /tools
parentc95e18333c8baf130517534e83fd09024f107c06 (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.c22
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);