Re: [PATCH] checkpolicy: Remove support for role dominance rules

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

 



On Tue, Aug 15, 2023 at 2:50 AM Petr Lautrbach <lautrbach@xxxxxxxxxx> wrote:
>
> James Carter <jwcart2@xxxxxxxxx> writes:
>
> > On Fri, Jul 14, 2023 at 1:32 PM James Carter <jwcart2@xxxxxxxxx> wrote:
> >>
> >> Role dominance has been deprecated for a very, very long time (since
> >> at least August 2008) and has never been used in any widely deployed
> >> policy.
> >>
> >> Remove support for compiling role dominance rules.
> >>
> >> Support will remain, for now, in libsepol for backwards compatibility.
> >>
> >> Signed-off-by: James Carter <jwcart2@xxxxxxxxx>
> >
> > There should not be any controversy over this patch, so I plan on
> > merging it soon unless someone objects.
> > Jim
>
> Acked-by: Petr Lautrbach <lautrbach@xxxxxxxxxx>
>

Merged.
Thanks,
Jim


> >
> >> ---
> >>  checkpolicy/policy_define.c | 184 ------------------------------------
> >>  checkpolicy/policy_define.h |   2 -
> >>  checkpolicy/policy_parse.y  |  14 ---
> >>  3 files changed, 200 deletions(-)
> >>
> >> diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
> >> index 8421b253..23a65339 100644
> >> --- a/checkpolicy/policy_define.c
> >> +++ b/checkpolicy/policy_define.c
> >> @@ -2926,190 +2926,6 @@ int define_roleattribute(void)
> >>         return 0;
> >>  }
> >>
> >> -role_datum_t *merge_roles_dom(role_datum_t * r1, role_datum_t * r2)
> >> -{
> >> -       role_datum_t *new;
> >> -
> >> -       if (pass == 1) {
> >> -               return (role_datum_t *) 1;      /* any non-NULL value */
> >> -       }
> >> -
> >> -       new = malloc(sizeof(role_datum_t));
> >> -       if (!new) {
> >> -               yyerror("out of memory");
> >> -               return NULL;
> >> -       }
> >> -       memset(new, 0, sizeof(role_datum_t));
> >> -       new->s.value = 0;               /* temporary role */
> >> -       if (ebitmap_or(&new->dominates, &r1->dominates, &r2->dominates)) {
> >> -               yyerror("out of memory");
> >> -               free(new);
> >> -               return NULL;
> >> -       }
> >> -       if (ebitmap_or(&new->types.types, &r1->types.types, &r2->types.types)) {
> >> -               yyerror("out of memory");
> >> -               free(new);
> >> -               return NULL;
> >> -       }
> >> -       if (!r1->s.value) {
> >> -               /* free intermediate result */
> >> -               type_set_destroy(&r1->types);
> >> -               ebitmap_destroy(&r1->dominates);
> >> -               free(r1);
> >> -       }
> >> -       if (!r2->s.value) {
> >> -               /* free intermediate result */
> >> -               yyerror("right hand role is temporary?");
> >> -               type_set_destroy(&r2->types);
> >> -               ebitmap_destroy(&r2->dominates);
> >> -               free(r2);
> >> -       }
> >> -       return new;
> >> -}
> >> -
> >> -/* This function eliminates the ordering dependency of role dominance rule */
> >> -static int dominate_role_recheck(hashtab_key_t key __attribute__ ((unused)),
> >> -                                hashtab_datum_t datum, void *arg)
> >> -{
> >> -       role_datum_t *rdp = (role_datum_t *) arg;
> >> -       role_datum_t *rdatum = (role_datum_t *) datum;
> >> -       ebitmap_node_t *node;
> >> -       uint32_t i;
> >> -
> >> -       /* Don't bother to process against self role */
> >> -       if (rdatum->s.value == rdp->s.value)
> >> -               return 0;
> >> -
> >> -       /* If a dominating role found */
> >> -       if (ebitmap_get_bit(&(rdatum->dominates), rdp->s.value - 1)) {
> >> -               ebitmap_t types;
> >> -               ebitmap_init(&types);
> >> -               if (type_set_expand(&rdp->types, &types, policydbp, 1)) {
> >> -                       ebitmap_destroy(&types);
> >> -                       return -1;
> >> -               }
> >> -               /* raise types and dominates from dominated role */
> >> -               ebitmap_for_each_positive_bit(&rdp->dominates, node, i) {
> >> -                       if (ebitmap_set_bit(&rdatum->dominates, i, TRUE))
> >> -                               goto oom;
> >> -               }
> >> -               ebitmap_for_each_positive_bit(&types, node, i) {
> >> -                       if (ebitmap_set_bit(&rdatum->types.types, i, TRUE))
> >> -                               goto oom;
> >> -               }
> >> -               ebitmap_destroy(&types);
> >> -       }
> >> -
> >> -       /* go through all the roles */
> >> -       return 0;
> >> -      oom:
> >> -       yyerror("Out of memory");
> >> -       return -1;
> >> -}
> >> -
> >> -role_datum_t *define_role_dom(role_datum_t * r)
> >> -{
> >> -       role_datum_t *role;
> >> -       char *role_id;
> >> -       ebitmap_node_t *node;
> >> -       unsigned int i;
> >> -       int ret;
> >> -
> >> -       if (pass == 1) {
> >> -               role_id = queue_remove(id_queue);
> >> -               free(role_id);
> >> -               return (role_datum_t *) 1;      /* any non-NULL value */
> >> -       }
> >> -
> >> -       yywarn("Role dominance has been deprecated");
> >> -
> >> -       role_id = queue_remove(id_queue);
> >> -       if (!is_id_in_scope(SYM_ROLES, role_id)) {
> >> -               yyerror2("role %s is not within scope", role_id);
> >> -               free(role_id);
> >> -               return NULL;
> >> -       }
> >> -       role = (role_datum_t *) hashtab_search(policydbp->p_roles.table,
> >> -                                              role_id);
> >> -       if (!role) {
> >> -               role = (role_datum_t *) malloc(sizeof(role_datum_t));
> >> -               if (!role) {
> >> -                       yyerror("out of memory");
> >> -                       free(role_id);
> >> -                       return NULL;
> >> -               }
> >> -               memset(role, 0, sizeof(role_datum_t));
> >> -               ret =
> >> -                   declare_symbol(SYM_ROLES, (hashtab_key_t) role_id,
> >> -                                  (hashtab_datum_t) role, &role->s.value,
> >> -                                  &role->s.value);
> >> -               switch (ret) {
> >> -               case -3:{
> >> -                               yyerror("Out of memory!");
> >> -                               goto cleanup;
> >> -                       }
> >> -               case -2:{
> >> -                               yyerror2("duplicate declaration of role %s",
> >> -                                        role_id);
> >> -                               goto cleanup;
> >> -                       }
> >> -               case -1:{
> >> -                               yyerror("could not declare role here");
> >> -                               goto cleanup;
> >> -                       }
> >> -               case 0:
> >> -               case 1:{
> >> -                               break;
> >> -                       }
> >> -               default:{
> >> -                               assert(0);      /* should never get here */
> >> -                       }
> >> -               }
> >> -               if (ebitmap_set_bit(&role->dominates, role->s.value - 1, TRUE)) {
> >> -                       yyerror("Out of memory!");
> >> -                       goto cleanup;
> >> -               }
> >> -       }
> >> -       if (r) {
> >> -               ebitmap_t types;
> >> -               ebitmap_init(&types);
> >> -               ebitmap_for_each_positive_bit(&r->dominates, node, i) {
> >> -                       if (ebitmap_set_bit(&role->dominates, i, TRUE))
> >> -                               goto oom;
> >> -               }
> >> -               if (type_set_expand(&r->types, &types, policydbp, 1)) {
> >> -                       ebitmap_destroy(&types);
> >> -                       return NULL;
> >> -               }
> >> -               ebitmap_for_each_positive_bit(&types, node, i) {
> >> -                       if (ebitmap_set_bit(&role->types.types, i, TRUE))
> >> -                               goto oom;
> >> -               }
> >> -               ebitmap_destroy(&types);
> >> -               if (!r->s.value) {
> >> -                       /* free intermediate result */
> >> -                       type_set_destroy(&r->types);
> >> -                       ebitmap_destroy(&r->dominates);
> >> -                       free(r);
> >> -               }
> >> -               /*
> >> -                * Now go through all the roles and escalate this role's
> >> -                * dominates and types if a role dominates this role.
> >> -                */
> >> -               hashtab_map(policydbp->p_roles.table,
> >> -                           dominate_role_recheck, role);
> >> -       }
> >> -       return role;
> >> -      cleanup:
> >> -       free(role_id);
> >> -       role_datum_destroy(role);
> >> -       free(role);
> >> -       return NULL;
> >> -      oom:
> >> -       yyerror("Out of memory");
> >> -       goto cleanup;
> >> -}
> >> -
> >>  static int role_val_to_name_helper(hashtab_key_t key, hashtab_datum_t datum,
> >>                                    void *p)
> >>  {
> >> diff --git a/checkpolicy/policy_define.h b/checkpolicy/policy_define.h
> >> index c1314871..7c5a4e6c 100644
> >> --- a/checkpolicy/policy_define.h
> >> +++ b/checkpolicy/policy_define.h
> >> @@ -69,8 +69,6 @@ int define_validatetrans(constraint_expr_t *expr);
> >>  int expand_attrib(void);
> >>  int insert_id(const char *id,int push);
> >>  int insert_separator(int push);
> >> -role_datum_t *define_role_dom(role_datum_t *r);
> >> -role_datum_t *merge_roles_dom(role_datum_t *r1,role_datum_t *r2);
> >>  uintptr_t define_cexpr(uint32_t expr_type, uintptr_t arg1, uintptr_t arg2);
> >>
> >>  #endif /* _POLICY_DEFINE_H_ */
> >> diff --git a/checkpolicy/policy_parse.y b/checkpolicy/policy_parse.y
> >> index 6b6890a3..02b076c7 100644
> >> --- a/checkpolicy/policy_parse.y
> >> +++ b/checkpolicy/policy_parse.y
> >> @@ -76,7 +76,6 @@ typedef int (* require_func_t)(int pass);
> >>  %type <ptr> cond_expr cond_expr_prim cond_pol_list cond_else
> >>  %type <ptr> cond_allow_def cond_auditallow_def cond_auditdeny_def cond_dontaudit_def
> >>  %type <ptr> cond_transition_def cond_te_avtab_def cond_rule_def
> >> -%type <ptr> role_def roles
> >>  %type <valptr> cexpr cexpr_prim op role_mls_op
> >>  %type <val> ipv4_addr_def number
> >>  %type <val64> number64
> >> @@ -312,7 +311,6 @@ te_rbac_decl                : te_decl
> >>                          ;
> >>  rbac_decl              : attribute_role_def
> >>                         | role_type_def
> >> -                        | role_dominance
> >>                          | role_trans_def
> >>                         | role_allow_def
> >>                         | roleattribute_def
> >> @@ -515,8 +513,6 @@ role_type_def               : ROLE identifier TYPES names ';'
> >>  role_attr_def          : ROLE identifier opt_attr_list ';'
> >>                         {if (define_role_attr()) return -1;}
> >>                          ;
> >> -role_dominance         : DOMINANCE '{' roles '}'
> >> -                       ;
> >>  role_trans_def         : ROLE_TRANSITION names names identifier ';'
> >>                         {if (define_role_trans(0)) return -1; }
> >>                         | ROLE_TRANSITION names names ':' names identifier ';'
> >> @@ -525,16 +521,6 @@ role_trans_def             : ROLE_TRANSITION names names identifier ';'
> >>  role_allow_def         : ALLOW names names ';'
> >>                         {if (define_role_allow()) return -1; }
> >>                         ;
> >> -roles                  : role_def
> >> -                       { $$ = $1; }
> >> -                       | roles role_def
> >> -                       { $$ = merge_roles_dom((role_datum_t*)$1, (role_datum_t*)$2); if ($$ == 0) return -1;}
> >> -                       ;
> >> -role_def               : ROLE identifier_push ';'
> >> -                        {$$ = define_role_dom(NULL); if ($$ == 0) return -1;}
> >> -                       | ROLE identifier_push '{' roles '}'
> >> -                        {$$ = define_role_dom((role_datum_t*)$4); if ($$ == 0) return -1;}
> >> -                       ;
> >>  roleattribute_def      : ROLEATTRIBUTE identifier id_comma_list ';'
> >>                         {if (define_roleattribute()) return -1;}
> >>                         ;
> >> --
> >> 2.41.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