mirror of
https://github.com/SELinuxProject/selinux
synced 2025-02-22 04:26:52 +00:00
libsepol: Fix type alias handling in kernel_to_cil
Type alias rules are not written out when converting a binary kernel
policy to CIL. The problem is that type aliases are not in the
type_val_to_struct array and that is what is being used to find the
aliases.
Since type aliases are only in the types hashtable, walk that to
find the type aliases.
Fixes: 70a480bfcd
("libsepol: Add ability to convert binary
policy to CIL")
Signed-off-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
a9ff2cc9a3
commit
b902944554
@ -1367,33 +1367,55 @@ exit:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int map_count_type_aliases(__attribute__((unused)) char *key, void *data, void *args)
|
||||
{
|
||||
type_datum_t *datum = data;
|
||||
unsigned *count = args;
|
||||
|
||||
if (datum->primary == 0 && datum->flavor == TYPE_TYPE)
|
||||
(*count)++;
|
||||
|
||||
return SEPOL_OK;
|
||||
}
|
||||
|
||||
static int map_type_aliases_to_strs(char *key, void *data, void *args)
|
||||
{
|
||||
type_datum_t *datum = data;
|
||||
struct strs *strs = args;
|
||||
int rc = 0;
|
||||
|
||||
if (datum->primary == 0 && datum->flavor == TYPE_TYPE)
|
||||
rc = strs_add(strs, key);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int write_type_alias_rules_to_cil(FILE *out, struct policydb *pdb)
|
||||
{
|
||||
type_datum_t *alias;
|
||||
struct strs *strs;
|
||||
char *name;
|
||||
char *type;
|
||||
unsigned i, num;
|
||||
unsigned i, num = 0;
|
||||
int rc = 0;
|
||||
|
||||
rc = strs_init(&strs, pdb->p_types.nprim);
|
||||
rc = hashtab_map(pdb->p_types.table, map_count_type_aliases, &num);
|
||||
if (rc != 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
for (i=0; i < pdb->p_types.nprim; i++) {
|
||||
alias = pdb->type_val_to_struct[i];
|
||||
if (!alias->primary) {
|
||||
rc = strs_add(strs, pdb->p_type_val_to_name[i]);
|
||||
if (rc != 0) {
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
rc = strs_init(&strs, num);
|
||||
if (rc != 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
rc = hashtab_map(pdb->p_types.table, map_type_aliases_to_strs, strs);
|
||||
if (rc != 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
strs_sort(strs);
|
||||
|
||||
num = strs_num_items(strs);
|
||||
for (i=0; i<num; i++) {
|
||||
name = strs_read_at_index(strs, i);
|
||||
if (!name) {
|
||||
|
Loading…
Reference in New Issue
Block a user