From c2fc48be68ee466207d870137681896b0b544691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Mon, 22 Jan 2024 14:54:54 +0100 Subject: [PATCH] checkpolicy: cleanup resources on parse error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close the input file and free all memory by the queue and lexer on a syntax or parse error. Signed-off-by: Christian Göttsche Acked-by: James Carter --- parse_util.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/parse_util.c b/parse_util.c index 8c1f393..5f92730 100644 --- a/parse_util.c +++ b/parse_util.c @@ -26,6 +26,7 @@ extern FILE *yyin; extern void init_parser(int); extern int yyparse(void); extern void yyrestart(FILE *); +extern int yylex_destroy(void); extern queue_t id_queue; extern unsigned int policydb_errors; extern policydb_t *policydbp; @@ -34,6 +35,8 @@ extern void set_source_file(const char *name); int read_source_policy(policydb_t * p, const char *file, const char *progname) { + int rc = -1; + yyin = fopen(file, "r"); if (!yyin) { fprintf(stderr, "%s: unable to open %s: %s\n", progname, file, strerror(errno)); @@ -41,20 +44,21 @@ int read_source_policy(policydb_t * p, const char *file, const char *progname) } set_source_file(file); - if ((id_queue = queue_create()) == NULL) { + id_queue = queue_create(); + if (id_queue == NULL) { fprintf(stderr, "%s: out of memory!\n", progname); - return -1; + goto cleanup; } - policydbp = p; mlspol = p->mls; + policydbp = p; init_parser(1); if (yyparse() || policydb_errors) { fprintf(stderr, "%s: error(s) encountered while parsing configuration\n", progname); - return -1; + goto cleanup; } rewind(yyin); init_parser(2); @@ -64,11 +68,15 @@ int read_source_policy(policydb_t * p, const char *file, const char *progname) fprintf(stderr, "%s: error(s) encountered while parsing configuration\n", progname); - return -1; + goto cleanup; } - queue_destroy(id_queue); + rc = 0; + +cleanup: + queue_destroy(id_queue); fclose(yyin); + yylex_destroy(); - return 0; + return rc; } -- 2.33.0