From c7cce94119b874a5078521d960957b034a42744d Mon Sep 17 00:00:00 2001 From: samsonium Date: Wed, 21 Oct 2026 04:31:57 +0300 Subject: [PATCH] fix: add AST freeing on errors; add checks for `parser`, `walker` and `writer` are not NULL --- src/compiler/main.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/compiler/main.c b/src/compiler/main.c index d6b534b..dfb486c 100644 --- a/src/compiler/main.c +++ b/src/compiler/main.c @@ -96,11 +96,21 @@ int main(int argc, char **argv) } fzl_parser_t *parser = fzl_mkparser(rd->first); - result = fzl_parse(parser); + if (!parser) + { + printf("%sError%s: failed to allocate writer\n", FZL_CERROR, FZL_CRST); + fzl_freeoptions(opts); + fzl_freereader(rd); + fzl_freelinked(linked); + return -1; + } + + result = fzl_parse(parser); if (result != 0) { printf("%sError%s: %s\n", FZL_CERROR, FZL_CRST, fzl_parser_geterror()); fzl_freeoptions(opts); + fzl_freeast(parser->root); fzl_freeparser(parser); fzl_freereader(rd); fzl_freelinked(linked); @@ -116,12 +126,24 @@ int main(int argc, char **argv) } fzl_walker_t *walker = fzl_mkwalker(parser->root); - result = fzl_walk(walker); + if (!walker) + { + printf("%sError%s: failed to allocate writer\n", FZL_CERROR, FZL_CRST); + fzl_freeoptions(opts); + fzl_freeast(parser->root); + fzl_freeparser(parser); + fzl_freereader(rd); + fzl_freelinked(linked); + return -1; + } + + result = fzl_walk(walker); if (result != 0) { printf("%sError%s: %s\n", FZL_CERROR, FZL_CRST, fzl_walker_geterror()); fzl_freeoptions(opts); fzl_freewalker(walker); + fzl_freeast(parser->root); fzl_freeparser(parser); fzl_freereader(rd); fzl_freelinked(linked); @@ -162,13 +184,26 @@ int main(int argc, char **argv) } fzl_writer_t *writer = fzl_mkwriter(outpath); - result = fzl_write(writer, walker); + if (!writer) + { + printf("%sError%s: failed to allocate writer\n", FZL_CERROR, FZL_CRST); + fzl_freeoptions(opts); + fzl_freewalker(walker); + fzl_freeast(parser->root); + fzl_freeparser(parser); + fzl_freereader(rd); + fzl_freelinked(linked); + return -1; + } + + result = fzl_write(writer, walker); if (result != 0) { printf("%sError%s: %s\n", FZL_CERROR, FZL_CRST, fzl_writer_geterror()); fzl_freeoptions(opts); fzl_freewriter(writer); fzl_freewalker(walker); + fzl_freeast(parser->root); fzl_freeparser(parser); fzl_freereader(rd); fzl_freelinked(linked);