aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/ss/services.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/selinux/ss/services.c')
-rw-r--r--security/selinux/ss/services.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 8dfaa3e7c26d..8ee04a424df7 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -16,12 +16,13 @@
16 * Updated: Hewlett-Packard <paul.moore@hp.com> 16 * Updated: Hewlett-Packard <paul.moore@hp.com>
17 * 17 *
18 * Added support for NetLabel 18 * Added support for NetLabel
19 * Added support for the policy capability bitmap
19 * 20 *
20 * Updated: Chad Sellers <csellers@tresys.com> 21 * Updated: Chad Sellers <csellers@tresys.com>
21 * 22 *
22 * Added validation of kernel classes and permissions 23 * Added validation of kernel classes and permissions
23 * 24 *
24 * Copyright (C) 2006 Hewlett-Packard Development Company, L.P. 25 * Copyright (C) 2006, 2007 Hewlett-Packard Development Company, L.P.
25 * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. 26 * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.
26 * Copyright (C) 2003 - 2004, 2006 Tresys Technology, LLC 27 * Copyright (C) 2003 - 2004, 2006 Tresys Technology, LLC
27 * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> 28 * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
@@ -59,6 +60,8 @@
59extern void selnl_notify_policyload(u32 seqno); 60extern void selnl_notify_policyload(u32 seqno);
60unsigned int policydb_loaded_version; 61unsigned int policydb_loaded_version;
61 62
63int selinux_policycap_netpeer;
64
62/* 65/*
63 * This is declared in avc.c 66 * This is declared in avc.c
64 */ 67 */
@@ -1299,6 +1302,12 @@ bad:
1299 goto out; 1302 goto out;
1300} 1303}
1301 1304
1305static void security_load_policycaps(void)
1306{
1307 selinux_policycap_netpeer = ebitmap_get_bit(&policydb.policycaps,
1308 POLICYDB_CAPABILITY_NETPEER);
1309}
1310
1302extern void selinux_complete_init(void); 1311extern void selinux_complete_init(void);
1303static int security_preserve_bools(struct policydb *p); 1312static int security_preserve_bools(struct policydb *p);
1304 1313
@@ -1346,6 +1355,7 @@ int security_load_policy(void *data, size_t len)
1346 avtab_cache_destroy(); 1355 avtab_cache_destroy();
1347 return -EINVAL; 1356 return -EINVAL;
1348 } 1357 }
1358 security_load_policycaps();
1349 policydb_loaded_version = policydb.policyvers; 1359 policydb_loaded_version = policydb.policyvers;
1350 ss_initialized = 1; 1360 ss_initialized = 1;
1351 seqno = ++latest_granting; 1361 seqno = ++latest_granting;
@@ -1404,6 +1414,7 @@ int security_load_policy(void *data, size_t len)
1404 POLICY_WRLOCK; 1414 POLICY_WRLOCK;
1405 memcpy(&policydb, &newpolicydb, sizeof policydb); 1415 memcpy(&policydb, &newpolicydb, sizeof policydb);
1406 sidtab_set(&sidtab, &newsidtab); 1416 sidtab_set(&sidtab, &newsidtab);
1417 security_load_policycaps();
1407 seqno = ++latest_granting; 1418 seqno = ++latest_granting;
1408 policydb_loaded_version = policydb.policyvers; 1419 policydb_loaded_version = policydb.policyvers;
1409 POLICY_WRUNLOCK; 1420 POLICY_WRUNLOCK;
@@ -2148,6 +2159,60 @@ int security_get_allow_unknown(void)
2148 return policydb.allow_unknown; 2159 return policydb.allow_unknown;
2149} 2160}
2150 2161
2162/**
2163 * security_get_policycaps - Query the loaded policy for its capabilities
2164 * @len: the number of capability bits
2165 * @values: the capability bit array
2166 *
2167 * Description:
2168 * Get an array of the policy capabilities in @values where each entry in
2169 * @values is either true (1) or false (0) depending the policy's support of
2170 * that feature. The policy capabilities are defined by the
2171 * POLICYDB_CAPABILITY_* enums. The size of the array is stored in @len and it
2172 * is up to the caller to free the array in @values. Returns zero on success,
2173 * negative values on failure.
2174 *
2175 */
2176int security_get_policycaps(int *len, int **values)
2177{
2178 int rc = -ENOMEM;
2179 unsigned int iter;
2180
2181 POLICY_RDLOCK;
2182
2183 *values = kcalloc(POLICYDB_CAPABILITY_MAX, sizeof(int), GFP_ATOMIC);
2184 if (*values == NULL)
2185 goto out;
2186 for (iter = 0; iter < POLICYDB_CAPABILITY_MAX; iter++)
2187 (*values)[iter] = ebitmap_get_bit(&policydb.policycaps, iter);
2188 *len = POLICYDB_CAPABILITY_MAX;
2189
2190out:
2191 POLICY_RDUNLOCK;
2192 return rc;
2193}
2194
2195/**
2196 * security_policycap_supported - Check for a specific policy capability
2197 * @req_cap: capability
2198 *
2199 * Description:
2200 * This function queries the currently loaded policy to see if it supports the
2201 * capability specified by @req_cap. Returns true (1) if the capability is
2202 * supported, false (0) if it isn't supported.
2203 *
2204 */
2205int security_policycap_supported(unsigned int req_cap)
2206{
2207 int rc;
2208
2209 POLICY_RDLOCK;
2210 rc = ebitmap_get_bit(&policydb.policycaps, req_cap);
2211 POLICY_RDUNLOCK;
2212
2213 return rc;
2214}
2215
2151struct selinux_audit_rule { 2216struct selinux_audit_rule {
2152 u32 au_seqno; 2217 u32 au_seqno;
2153 struct context au_ctxt; 2218 struct context au_ctxt;