Skip to content

Commit

Permalink
SELinux: return error codes on policy load failure
Browse files Browse the repository at this point in the history
policy load failure always return EINVAL even if the failure was for some
other reason (usually ENOMEM).  This patch passes error codes back up the
stack where they will make their way to userspace.  This might help in
debugging future problems with policy load.

Signed-off-by: Eric Paris <eparis@redhat.com>
Acked-by:  Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: James Morris <jmorris@namei.org>
  • Loading branch information
Eric Paris authored and James Morris committed Apr 20, 2010
1 parent 6f262d8 commit a200005
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions security/selinux/ss/services.c
Original file line number Diff line number Diff line change
Expand Up @@ -1760,22 +1760,28 @@ int security_load_policy(void *data, size_t len)

if (!ss_initialized) {
avtab_cache_init();
if (policydb_read(&policydb, fp)) {
rc = policydb_read(&policydb, fp);
if (rc) {
avtab_cache_destroy();
return -EINVAL;
return rc;
}
if (selinux_set_mapping(&policydb, secclass_map,
&current_mapping,
&current_mapping_size)) {

rc = selinux_set_mapping(&policydb, secclass_map,
&current_mapping,
&current_mapping_size);
if (rc) {
policydb_destroy(&policydb);
avtab_cache_destroy();
return -EINVAL;
return rc;
}
if (policydb_load_isids(&policydb, &sidtab)) {

rc = policydb_load_isids(&policydb, &sidtab);
if (rc) {
policydb_destroy(&policydb);
avtab_cache_destroy();
return -EINVAL;
return rc;
}

security_load_policycaps();
ss_initialized = 1;
seqno = ++latest_granting;
Expand All @@ -1791,8 +1797,9 @@ int security_load_policy(void *data, size_t len)
sidtab_hash_eval(&sidtab, "sids");
#endif

if (policydb_read(&newpolicydb, fp))
return -EINVAL;
rc = policydb_read(&newpolicydb, fp);
if (rc)
return rc;

/* If switching between different policy types, log MLS status */
if (policydb.mls_enabled && !newpolicydb.mls_enabled)
Expand All @@ -1807,8 +1814,8 @@ int security_load_policy(void *data, size_t len)
return rc;
}

if (selinux_set_mapping(&newpolicydb, secclass_map,
&map, &map_size))
rc = selinux_set_mapping(&newpolicydb, secclass_map, &map, &map_size);
if (rc)
goto err;

rc = security_preserve_bools(&newpolicydb);
Expand All @@ -1819,10 +1826,10 @@ int security_load_policy(void *data, size_t len)

/* Clone the SID table. */
sidtab_shutdown(&sidtab);
if (sidtab_map(&sidtab, clone_sid, &newsidtab)) {
rc = -ENOMEM;

rc = sidtab_map(&sidtab, clone_sid, &newsidtab);
if (rc)
goto err;
}

/*
* Convert the internal representations of contexts
Expand Down

0 comments on commit a200005

Please sign in to comment.