X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/1ef30936f5fdb253b397347b91521455d0c39172..1b56fac4a07ed3ef680a46639c8e8e5bae4767e9:/src/parse-decl.c diff --git a/src/parse-decl.c b/src/parse-decl.c index 8516a3a..1268fc3 100644 --- a/src/parse-decl.c +++ b/src/parse-decl.c @@ -220,7 +220,6 @@ static struct cdecl_declarator *reduce_function(struct cdecl *param) spec->u.declarator.type = CDECL_DECL_IDENT; *p = &spec->u.declarator; - free(d); d = param->declarators; free(param); return d; @@ -262,7 +261,6 @@ simplify_functions(struct cdecl_declarator **p, struct cdecl_declarator *d) if (!new) return 0; /* e.g. int (foo bar) */ *p = new; - free(d->child); free(d); return 1; @@ -502,9 +500,9 @@ static int forall_declarators(struct cdecl *decl, static struct cdecl *do_parse(const char *str, int english_mode) { + struct cdecl *decl = NULL; YY_BUFFER_STATE state; yyscan_t scanner; - struct cdecl *decl; #if YYDEBUG extern int cdecl__yydebug; @@ -516,8 +514,15 @@ static struct cdecl *do_parse(const char *str, int english_mode) return NULL; state = cdecl__yy_scan_string(str, scanner); - if (cdecl__yyparse(scanner, &decl) != 0) + if (cdecl__yyparse(scanner, &decl) != 0) { + /* + * If the input consists of a complete, valid declaration + * followed by some garbage, that parsed declaration will + * be output by the parser and we need to free it here. + */ + cdecl__free(decl); decl = NULL; + } cdecl__yy_delete_buffer(state, scanner); cdecl__yylex_destroy(scanner);