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