Skip to content

Commit

Permalink
selinux: do not allocate ancillary buffer on first load
Browse files Browse the repository at this point in the history
In security_load_policy(), we can defer allocating the newpolicydb
ancillary array to after checking state->initialized, thereby avoiding
the pointless allocation when loading policy the first time.

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
[PM: merged portions by hand]
Reviewed-by: Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: Paul Moore <paul@paul-moore.com>
  • Loading branch information
Ondrej Mosnacek authored and Paul Moore committed Jan 16, 2020
1 parent cb89e24 commit dd89b9d
Showing 1 changed file with 13 additions and 15 deletions.
28 changes: 13 additions & 15 deletions security/selinux/ss/services.c
Original file line number Diff line number Diff line change
Expand Up @@ -2183,26 +2183,17 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len)
int rc = 0;
struct policy_file file = { data, len }, *fp = &file;

oldpolicydb = kcalloc(2, sizeof(*oldpolicydb), GFP_KERNEL);
if (!oldpolicydb) {
rc = -ENOMEM;
goto out;
}
newpolicydb = oldpolicydb + 1;

policydb = &state->ss->policydb;

newsidtab = kmalloc(sizeof(*newsidtab), GFP_KERNEL);
if (!newsidtab) {
rc = -ENOMEM;
goto out;
}
if (!newsidtab)
return -ENOMEM;

if (!selinux_initialized(state)) {
rc = policydb_read(policydb, fp);
if (rc) {
kfree(newsidtab);
goto out;
return rc;
}

policydb->len = len;
Expand All @@ -2211,14 +2202,14 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len)
if (rc) {
kfree(newsidtab);
policydb_destroy(policydb);
goto out;
return rc;
}

rc = policydb_load_isids(policydb, newsidtab);
if (rc) {
kfree(newsidtab);
policydb_destroy(policydb);
goto out;
return rc;
}

state->ss->sidtab = newsidtab;
Expand All @@ -2231,9 +2222,16 @@ int security_load_policy(struct selinux_state *state, void *data, size_t len)
selinux_status_update_policyload(state, seqno);
selinux_netlbl_cache_invalidate();
selinux_xfrm_notify_policyload();
goto out;
return 0;
}

oldpolicydb = kcalloc(2, sizeof(*oldpolicydb), GFP_KERNEL);
if (!oldpolicydb) {
kfree(newsidtab);
return -ENOMEM;
}
newpolicydb = oldpolicydb + 1;

rc = policydb_read(newpolicydb, fp);
if (rc) {
kfree(newsidtab);
Expand Down

0 comments on commit dd89b9d

Please sign in to comment.