Skip to content

Commit

Permalink
libsepol: Improve writing CIL category rules
Browse files Browse the repository at this point in the history
Improves writing of CIL category rules when converting MLS kernel
policy to CIL. No changes to functionality, but eliminate useless
checks for category aliases when using the p_cat_val_to_name array,
find the actual number of aliases before allocating memory, and
skip the category alias rules if there are no aliases.

Signed-off-by: James Carter <jwcart2@gmail.com>
Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
  • Loading branch information
jwcart2 authored and stephensmalley committed May 29, 2020
1 parent 7822838 commit f94b169
Showing 1 changed file with 29 additions and 30 deletions.
59 changes: 29 additions & 30 deletions libsepol/src/kernel_to_cil.c
Expand Up @@ -886,6 +886,17 @@ static int write_sensitivity_rules_to_cil(FILE *out, struct policydb *pdb)
return rc;
}

static int map_count_category_aliases(__attribute__((unused)) char *key, void *data, void *args)
{
cat_datum_t *cat = data;
unsigned *count = args;

if (cat->isalias)
(*count)++;

return SEPOL_OK;
}

static int map_category_aliases_to_strs(char *key, void *data, void *args)
{
cat_datum_t *cat = data;
Expand All @@ -903,26 +914,13 @@ static int write_category_rules_to_cil(FILE *out, struct policydb *pdb)
{
cat_datum_t *cat;
char *prev, *name, *actual;
struct strs *strs;
unsigned i, num;
struct strs *strs = NULL;
unsigned i, num = 0;
int rc = 0;

rc = strs_init(&strs, pdb->p_levels.nprim);
if (rc != 0) {
goto exit;
}

/* categories */
for (i=0; i < pdb->p_cats.nprim; i++) {
name = pdb->p_cat_val_to_name[i];
if (!name) continue;
cat = hashtab_search(pdb->p_cats.table, name);
if (!cat) {
rc = -1;
goto exit;
}
if (cat->isalias) continue;

sepol_printf(out, "(category %s)\n", name);
}

Expand All @@ -931,14 +929,6 @@ static int write_category_rules_to_cil(FILE *out, struct policydb *pdb)
prev = NULL;
for (i=0; i < pdb->p_cats.nprim; i++) {
name = pdb->p_cat_val_to_name[i];
if (!name) continue;
cat = hashtab_search(pdb->p_cats.table, name);
if (!cat) {
rc = -1;
goto exit;
}
if (cat->isalias) continue;

if (prev) {
sepol_printf(out, "%s ", prev);
}
Expand All @@ -949,23 +939,32 @@ static int write_category_rules_to_cil(FILE *out, struct policydb *pdb)
}
sepol_printf(out, "))\n");

rc = hashtab_map(pdb->p_cats.table, map_count_category_aliases, &num);
if (rc != 0) {
goto exit;
}

if (num == 0) {
/* No aliases, so skip category alias rules */
rc = 0;
goto exit;
}

rc = strs_init(&strs, num);
if (rc != 0) {
goto exit;
}

rc = hashtab_map(pdb->p_cats.table, map_category_aliases_to_strs, strs);
if (rc != 0) {
goto exit;
}

strs_sort(strs);

num = strs_num_items(strs);

/* category aliases */
for (i=0; i < num; i++) {
name = strs_read_at_index(strs, i);
cat = hashtab_search(pdb->p_cats.table, name);
if (!cat) {
rc = -1;
goto exit;
}
sepol_printf(out, "(categoryalias %s)\n", name);
}

Expand Down

0 comments on commit f94b169

Please sign in to comment.