Skip to content

Commit

Permalink
selinux: preserve boolean values across policy reloads
Browse files Browse the repository at this point in the history
At present, the userland policy loading code has to go through contortions to preserve
boolean values across policy reloads, and cannot do so atomically.
As this is what we always want to do for reloads, let the kernel preserve them instead.

Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
Acked-by: Karl MacMillan <kmacmillan@mentalrootkit.com>
Signed-off-by: James Morris <jmorris@namei.org>
  • Loading branch information
stephensmalley authored and James Morris committed Apr 26, 2007
1 parent bce34bc commit e900a7d
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions security/selinux/ss/services.c
Original file line number Diff line number Diff line change
Expand Up @@ -1257,6 +1257,7 @@ static int convert_context(u32 key,
}

extern void selinux_complete_init(void);
static int security_preserve_bools(struct policydb *p);

/**
* security_load_policy - Load a security policy configuration.
Expand Down Expand Up @@ -1333,6 +1334,12 @@ int security_load_policy(void *data, size_t len)
goto err;
}

rc = security_preserve_bools(&newpolicydb);
if (rc) {
printk(KERN_ERR "security: unable to preserve booleans\n");
goto err;
}

/* Clone the SID table. */
sidtab_shutdown(&sidtab);
if (sidtab_map(&sidtab, clone_sid, &newsidtab)) {
Expand Down Expand Up @@ -1890,6 +1897,37 @@ int security_get_bool_value(int bool)
return rc;
}

static int security_preserve_bools(struct policydb *p)
{
int rc, nbools = 0, *bvalues = NULL, i;
char **bnames = NULL;
struct cond_bool_datum *booldatum;
struct cond_node *cur;

rc = security_get_bools(&nbools, &bnames, &bvalues);
if (rc)
goto out;
for (i = 0; i < nbools; i++) {
booldatum = hashtab_search(p->p_bools.table, bnames[i]);
if (booldatum)
booldatum->state = bvalues[i];
}
for (cur = p->cond_list; cur != NULL; cur = cur->next) {
rc = evaluate_cond_node(p, cur);
if (rc)
goto out;
}

out:
if (bnames) {
for (i = 0; i < nbools; i++)
kfree(bnames[i]);
}
kfree(bnames);
kfree(bvalues);
return rc;
}

/*
* security_sid_mls_copy() - computes a new sid based on the given
* sid and the mls portion of mls_sid.
Expand Down

0 comments on commit e900a7d

Please sign in to comment.