On Mon, Jan 22, 2024 at 9:02 AM Christian Göttsche <cgzones@xxxxxxxxxxxxxx> wrote: > > 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 <cgzones@xxxxxxxxxxxxxx> Acked-by: James Carter <jwcart2@xxxxxxxxx> > --- > checkpolicy/parse_util.c | 26 +++++++++++++++++++------- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/checkpolicy/parse_util.c b/checkpolicy/parse_util.c > index f2d1e04d..eda814e1 100644 > --- a/checkpolicy/parse_util.c > +++ b/checkpolicy/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,21 +44,26 @@ 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; > } > > + mlspol = p->mls; > policydbp = p; > policydbp->name = strdup(file); > - mlspol = p->mls; > + if (!policydbp->name) { > + fprintf(stderr, "%s: out of memory!\n", progname); > + goto cleanup; > + } > > 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); > @@ -65,11 +73,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.43.0 > >