Re: [PATCH 02/15] checkpolicy: cleanup resources on parse error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>
>





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux