Re: [PATCH] libsepol/cil: Check for duplicate blocks, optionals, and macros

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

 



On Tue, Mar 16, 2021 at 4:49 PM Nicolas Iooss <nicolas.iooss@xxxxxxx> wrote:
>
> On Tue, Mar 16, 2021 at 5:51 PM James Carter <jwcart2@xxxxxxxxx> wrote:
> >
> > In CIL, blocks, optionals, and macros share the same symbol table so
> > that the targets of "in" statements can be located. Because of this,
> > they cannot have the same name in the same namespace, but, because
> > they do not show up in the final policy, they can have the same name
> > as long as they are in different namespaces. Unfortunately, when
> > copying from one namespace to another, no check was being done to see
> > if there was a conflict.
> >
> > When copying blocks, optionals, and macros, if a datum is found in
> > the destination namespace, then there is a conflict with a previously
> > declared block, optional, or macro, so exit with an error.
> >
> > Reported-by: Nicolas Iooss <nicolas.iooss@xxxxxxx>
> > Reported-by: Evgeny Vereshchagin <evvers@xxxxx>
> > Signed-off-by: James Carter <jwcart2@xxxxxxxxx>
>
> I confirm this patch fixes the reported bug, and makes secilc no
> longer crashes on the non-reduced test case found by OSS-Fuzz.
>
> Acked-by: Nicolas Iooss <nicolas.iooss@xxxxxxx>
>

Merged.
Thanks,
Jim

> Thanks!
> Nicolas
>
> > ---
> >  libsepol/cil/src/cil_copy_ast.c | 89 +++++++++------------------------
> >  1 file changed, 25 insertions(+), 64 deletions(-)
> >
> > diff --git a/libsepol/cil/src/cil_copy_ast.c b/libsepol/cil/src/cil_copy_ast.c
> > index c9aada9d..ed967861 100644
> > --- a/libsepol/cil/src/cil_copy_ast.c
> > +++ b/libsepol/cil/src/cil_copy_ast.c
> > @@ -100,16 +100,17 @@ int cil_copy_block(__attribute__((unused)) struct cil_db *db, void *data, void *
> >         struct cil_block *orig = data;
> >         char *key = orig->datum.name;
> >         struct cil_symtab_datum *datum = NULL;
> > +       struct cil_block *new;
> >
> >         cil_symtab_get_datum(symtab, key, &datum);
> > -       if (datum == NULL) {
> > -               struct cil_block *new;
> > -               cil_block_init(&new);
> > -               *copy = new;
> > -       } else {
> > -               *copy = datum;;
> > +       if (datum != NULL) {
> > +               cil_tree_log(NODE(datum), CIL_ERR, "Re-declaration of %s %s", cil_node_to_string(NODE(datum)), key);
> > +               return SEPOL_ERR;
> >         }
> >
> > +       cil_block_init(&new);
> > +       *copy = new;
> > +
> >         return SEPOL_OK;
> >  }
> >
> > @@ -1509,64 +1510,22 @@ int cil_copy_macro(__attribute__((unused)) struct cil_db *db, void *data, void *
> >         struct cil_macro *orig = data;
> >         char *key = orig->datum.name;
> >         struct cil_symtab_datum *datum = NULL;
> > +       struct cil_macro *new;
> >
> >         cil_symtab_get_datum(symtab, key, &datum);
> > -       if (datum == NULL) {
> > -               struct cil_macro *new;
> > -               cil_macro_init(&new);
> > -               if (orig->params != NULL) {
> > -                       cil_copy_list(orig->params, &new->params);
> > -               }
> > -
> > -               *copy = new;
> > -
> > -       } else {
> > -               struct cil_list_item *curr_orig = NULL;
> > -               struct cil_list_item *curr_new = NULL;
> > -               struct cil_param *param_orig = NULL;
> > -               struct cil_param *param_new = NULL;
> > -
> > -               if (((struct cil_macro*)datum)->params != NULL) {
> > -                       curr_new = ((struct cil_macro*)datum)->params->head;
> > -               }
> > -
> > -               if (orig->params != NULL) {
> > -                       curr_orig = orig->params->head;
> > -               }
> > -
> > -               if (curr_orig != NULL && curr_new != NULL) {
> > -                       while (curr_orig != NULL) {
> > -                               if (curr_new == NULL) {
> > -                                       goto exit;
> > -                               }
> > -
> > -                               param_orig = (struct cil_param*)curr_orig->data;
> > -                               param_new = (struct cil_param*)curr_new->data;
> > -                               if (param_orig->str != param_new->str) {
> > -                                       goto exit;
> > -                               } else if (param_orig->flavor != param_new->flavor) {
> > -                                       goto exit;
> > -                               }
> > -
> > -                               curr_orig = curr_orig->next;
> > -                               curr_new = curr_new->next;
> > -                       }
> > -
> > -                       if (curr_new != NULL) {
> > -                               goto exit;
> > -                       }
> > -               } else if (!(curr_orig == NULL && curr_new == NULL)) {
> > -                       goto exit;
> > -               }
> > +       if (datum != NULL) {
> > +               cil_tree_log(NODE(datum), CIL_ERR, "Re-declaration of %s %s", cil_node_to_string(NODE(datum)), key);
> > +               return SEPOL_ERR;
> > +       }
> >
> > -               *copy = datum;
> > +       cil_macro_init(&new);
> > +       if (orig->params != NULL) {
> > +               cil_copy_list(orig->params, &new->params);
> >         }
> >
> > -       return SEPOL_OK;
> > +       *copy = new;
> >
> > -exit:
> > -       cil_log(CIL_INFO, "cil_copy_macro: macro cannot be redefined\n");
> > -       return SEPOL_ERR;
> > +       return SEPOL_OK;
> >  }
> >
> >  int cil_copy_optional(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
> > @@ -1574,16 +1533,17 @@ int cil_copy_optional(__attribute__((unused)) struct cil_db *db, void *data, voi
> >         struct cil_optional *orig = data;
> >         char *key = orig->datum.name;
> >         struct cil_symtab_datum *datum = NULL;
> > +       struct cil_optional *new;
> >
> >         cil_symtab_get_datum(symtab, key, &datum);
> > -       if (datum == NULL) {
> > -               struct cil_optional *new;
> > -               cil_optional_init(&new);
> > -               *copy = new;
> > -       } else {
> > -               *copy = datum;
> > +       if (datum != NULL) {
> > +               cil_tree_log(NODE(datum), CIL_ERR, "Re-declaration of %s %s", cil_node_to_string(NODE(datum)), key);
> > +               return SEPOL_ERR;
> >         }
> >
> > +       cil_optional_init(&new);
> > +       *copy = new;
> > +
> >         return SEPOL_OK;
> >  }
> >
> > @@ -2122,6 +2082,7 @@ int __cil_copy_node_helper(struct cil_tree_node *orig, __attribute__((unused)) u
> >                         args->dest = new;
> >                 }
> >         } else {
> > +               cil_tree_log(orig, CIL_ERR, "Problem copying %s node", cil_node_to_string(orig));
> >                 goto exit;
> >         }
> >
> > --
> > 2.26.2
> >
>



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

  Powered by Linux