services.c (f1268534027a792f3d97a0cfff8041d314ef2fca) | services.c (65cddd50980be8c9c27ad7518a0dc812eccb25d5) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Implementation of the security services. 4 * 5 * Authors : Stephen Smalley, <sds@tycho.nsa.gov> 6 * James Morris <jmorris@redhat.com> 7 * 8 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> --- 753 unchanged lines hidden (view full) --- 762 struct sidtab_entry *nentry; 763 struct sidtab_entry *tentry; 764 struct class_datum *tclass_datum; 765 struct constraint_node *constraint; 766 u16 tclass; 767 int rc = 0; 768 769 | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Implementation of the security services. 4 * 5 * Authors : Stephen Smalley, <sds@tycho.nsa.gov> 6 * James Morris <jmorris@redhat.com> 7 * 8 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> --- 753 unchanged lines hidden (view full) --- 762 struct sidtab_entry *nentry; 763 struct sidtab_entry *tentry; 764 struct class_datum *tclass_datum; 765 struct constraint_node *constraint; 766 u16 tclass; 767 int rc = 0; 768 769 |
770 if (!state->initialized) | 770 if (!selinux_initialized(state)) |
771 return 0; 772 773 read_lock(&state->ss->policy_rwlock); 774 775 policydb = &state->ss->policydb; 776 sidtab = state->ss->sidtab; 777 778 if (!user) --- 84 unchanged lines hidden (view full) --- 863{ 864 struct policydb *policydb; 865 struct sidtab *sidtab; 866 struct sidtab_entry *old_entry, *new_entry; 867 struct type_datum *type; 868 int index; 869 int rc; 870 | 771 return 0; 772 773 read_lock(&state->ss->policy_rwlock); 774 775 policydb = &state->ss->policydb; 776 sidtab = state->ss->sidtab; 777 778 if (!user) --- 84 unchanged lines hidden (view full) --- 863{ 864 struct policydb *policydb; 865 struct sidtab *sidtab; 866 struct sidtab_entry *old_entry, *new_entry; 867 struct type_datum *type; 868 int index; 869 int rc; 870 |
871 if (!state->initialized) | 871 if (!selinux_initialized(state)) |
872 return 0; 873 874 read_lock(&state->ss->policy_rwlock); 875 876 policydb = &state->ss->policydb; 877 sidtab = state->ss->sidtab; 878 879 rc = -EINVAL; --- 142 unchanged lines hidden (view full) --- 1022 1023 xpermd->driver = driver; 1024 xpermd->used = 0; 1025 memset(xpermd->allowed->p, 0, sizeof(xpermd->allowed->p)); 1026 memset(xpermd->auditallow->p, 0, sizeof(xpermd->auditallow->p)); 1027 memset(xpermd->dontaudit->p, 0, sizeof(xpermd->dontaudit->p)); 1028 1029 read_lock(&state->ss->policy_rwlock); | 872 return 0; 873 874 read_lock(&state->ss->policy_rwlock); 875 876 policydb = &state->ss->policydb; 877 sidtab = state->ss->sidtab; 878 879 rc = -EINVAL; --- 142 unchanged lines hidden (view full) --- 1022 1023 xpermd->driver = driver; 1024 xpermd->used = 0; 1025 memset(xpermd->allowed->p, 0, sizeof(xpermd->allowed->p)); 1026 memset(xpermd->auditallow->p, 0, sizeof(xpermd->auditallow->p)); 1027 memset(xpermd->dontaudit->p, 0, sizeof(xpermd->dontaudit->p)); 1028 1029 read_lock(&state->ss->policy_rwlock); |
1030 if (!state->initialized) | 1030 if (!selinux_initialized(state)) |
1031 goto allow; 1032 1033 policydb = &state->ss->policydb; 1034 sidtab = state->ss->sidtab; 1035 1036 scontext = sidtab_search(sidtab, ssid); 1037 if (!scontext) { 1038 pr_err("SELinux: %s: unrecognized SID %d\n", --- 68 unchanged lines hidden (view full) --- 1107 struct policydb *policydb; 1108 struct sidtab *sidtab; 1109 u16 tclass; 1110 struct context *scontext = NULL, *tcontext = NULL; 1111 1112 read_lock(&state->ss->policy_rwlock); 1113 avd_init(state, avd); 1114 xperms->len = 0; | 1031 goto allow; 1032 1033 policydb = &state->ss->policydb; 1034 sidtab = state->ss->sidtab; 1035 1036 scontext = sidtab_search(sidtab, ssid); 1037 if (!scontext) { 1038 pr_err("SELinux: %s: unrecognized SID %d\n", --- 68 unchanged lines hidden (view full) --- 1107 struct policydb *policydb; 1108 struct sidtab *sidtab; 1109 u16 tclass; 1110 struct context *scontext = NULL, *tcontext = NULL; 1111 1112 read_lock(&state->ss->policy_rwlock); 1113 avd_init(state, avd); 1114 xperms->len = 0; |
1115 if (!state->initialized) | 1115 if (!selinux_initialized(state)) |
1116 goto allow; 1117 1118 policydb = &state->ss->policydb; 1119 sidtab = state->ss->sidtab; 1120 1121 scontext = sidtab_search(sidtab, ssid); 1122 if (!scontext) { 1123 pr_err("SELinux: %s: unrecognized SID %d\n", --- 37 unchanged lines hidden (view full) --- 1161 struct av_decision *avd) 1162{ 1163 struct policydb *policydb; 1164 struct sidtab *sidtab; 1165 struct context *scontext = NULL, *tcontext = NULL; 1166 1167 read_lock(&state->ss->policy_rwlock); 1168 avd_init(state, avd); | 1116 goto allow; 1117 1118 policydb = &state->ss->policydb; 1119 sidtab = state->ss->sidtab; 1120 1121 scontext = sidtab_search(sidtab, ssid); 1122 if (!scontext) { 1123 pr_err("SELinux: %s: unrecognized SID %d\n", --- 37 unchanged lines hidden (view full) --- 1161 struct av_decision *avd) 1162{ 1163 struct policydb *policydb; 1164 struct sidtab *sidtab; 1165 struct context *scontext = NULL, *tcontext = NULL; 1166 1167 read_lock(&state->ss->policy_rwlock); 1168 avd_init(state, avd); |
1169 if (!state->initialized) | 1169 if (!selinux_initialized(state)) |
1170 goto allow; 1171 1172 policydb = &state->ss->policydb; 1173 sidtab = state->ss->sidtab; 1174 1175 scontext = sidtab_search(sidtab, ssid); 1176 if (!scontext) { 1177 pr_err("SELinux: %s: unrecognized SID %d\n", --- 103 unchanged lines hidden (view full) --- 1281} 1282 1283#include "initial_sid_to_string.h" 1284 1285int security_sidtab_hash_stats(struct selinux_state *state, char *page) 1286{ 1287 int rc; 1288 | 1170 goto allow; 1171 1172 policydb = &state->ss->policydb; 1173 sidtab = state->ss->sidtab; 1174 1175 scontext = sidtab_search(sidtab, ssid); 1176 if (!scontext) { 1177 pr_err("SELinux: %s: unrecognized SID %d\n", --- 103 unchanged lines hidden (view full) --- 1281} 1282 1283#include "initial_sid_to_string.h" 1284 1285int security_sidtab_hash_stats(struct selinux_state *state, char *page) 1286{ 1287 int rc; 1288 |
1289 if (!state->initialized) { | 1289 if (!selinux_initialized(state)) { |
1290 pr_err("SELinux: %s: called before initial load_policy\n", 1291 __func__); 1292 return -EINVAL; 1293 } 1294 1295 read_lock(&state->ss->policy_rwlock); 1296 rc = sidtab_hash_stats(state->ss->sidtab, page); 1297 read_unlock(&state->ss->policy_rwlock); --- 17 unchanged lines hidden (view full) --- 1315 struct sidtab *sidtab; 1316 struct sidtab_entry *entry; 1317 int rc = 0; 1318 1319 if (scontext) 1320 *scontext = NULL; 1321 *scontext_len = 0; 1322 | 1290 pr_err("SELinux: %s: called before initial load_policy\n", 1291 __func__); 1292 return -EINVAL; 1293 } 1294 1295 read_lock(&state->ss->policy_rwlock); 1296 rc = sidtab_hash_stats(state->ss->sidtab, page); 1297 read_unlock(&state->ss->policy_rwlock); --- 17 unchanged lines hidden (view full) --- 1315 struct sidtab *sidtab; 1316 struct sidtab_entry *entry; 1317 int rc = 0; 1318 1319 if (scontext) 1320 *scontext = NULL; 1321 *scontext_len = 0; 1322 |
1323 if (!state->initialized) { | 1323 if (!selinux_initialized(state)) { |
1324 if (sid <= SECINITSID_NUM) { 1325 char *scontextp; 1326 1327 *scontext_len = strlen(initial_sid_to_string[sid]) + 1; 1328 if (!scontext) 1329 goto out; 1330 scontextp = kmemdup(initial_sid_to_string[sid], 1331 *scontext_len, GFP_ATOMIC); --- 212 unchanged lines hidden (view full) --- 1544 if (!scontext_len) 1545 return -EINVAL; 1546 1547 /* Copy the string to allow changes and ensure a NUL terminator */ 1548 scontext2 = kmemdup_nul(scontext, scontext_len, gfp_flags); 1549 if (!scontext2) 1550 return -ENOMEM; 1551 | 1324 if (sid <= SECINITSID_NUM) { 1325 char *scontextp; 1326 1327 *scontext_len = strlen(initial_sid_to_string[sid]) + 1; 1328 if (!scontext) 1329 goto out; 1330 scontextp = kmemdup(initial_sid_to_string[sid], 1331 *scontext_len, GFP_ATOMIC); --- 212 unchanged lines hidden (view full) --- 1544 if (!scontext_len) 1545 return -EINVAL; 1546 1547 /* Copy the string to allow changes and ensure a NUL terminator */ 1548 scontext2 = kmemdup_nul(scontext, scontext_len, gfp_flags); 1549 if (!scontext2) 1550 return -ENOMEM; 1551 |
1552 if (!state->initialized) { | 1552 if (!selinux_initialized(state)) { |
1553 int i; 1554 1555 for (i = 1; i < SECINITSID_NUM; i++) { 1556 if (!strcmp(initial_sid_to_string[i], scontext2)) { 1557 *sid = i; 1558 goto out; 1559 } 1560 } --- 170 unchanged lines hidden (view full) --- 1731 struct role_trans *roletr = NULL; 1732 struct avtab_key avkey; 1733 struct avtab_datum *avdatum; 1734 struct avtab_node *node; 1735 u16 tclass; 1736 int rc = 0; 1737 bool sock; 1738 | 1553 int i; 1554 1555 for (i = 1; i < SECINITSID_NUM; i++) { 1556 if (!strcmp(initial_sid_to_string[i], scontext2)) { 1557 *sid = i; 1558 goto out; 1559 } 1560 } --- 170 unchanged lines hidden (view full) --- 1731 struct role_trans *roletr = NULL; 1732 struct avtab_key avkey; 1733 struct avtab_datum *avdatum; 1734 struct avtab_node *node; 1735 u16 tclass; 1736 int rc = 0; 1737 bool sock; 1738 |
1739 if (!state->initialized) { | 1739 if (!selinux_initialized(state)) { |
1740 switch (orig_tclass) { 1741 case SECCLASS_PROCESS: /* kernel value */ 1742 *out_sid = ssid; 1743 break; 1744 default: 1745 *out_sid = tsid; 1746 break; 1747 } --- 445 unchanged lines hidden (view full) --- 2193 policydb = &state->ss->policydb; 2194 2195 newsidtab = kmalloc(sizeof(*newsidtab), GFP_KERNEL); 2196 if (!newsidtab) { 2197 rc = -ENOMEM; 2198 goto out; 2199 } 2200 | 1740 switch (orig_tclass) { 1741 case SECCLASS_PROCESS: /* kernel value */ 1742 *out_sid = ssid; 1743 break; 1744 default: 1745 *out_sid = tsid; 1746 break; 1747 } --- 445 unchanged lines hidden (view full) --- 2193 policydb = &state->ss->policydb; 2194 2195 newsidtab = kmalloc(sizeof(*newsidtab), GFP_KERNEL); 2196 if (!newsidtab) { 2197 rc = -ENOMEM; 2198 goto out; 2199 } 2200 |
2201 if (!state->initialized) { | 2201 if (!selinux_initialized(state)) { |
2202 rc = policydb_read(policydb, fp); 2203 if (rc) { 2204 kfree(newsidtab); 2205 goto out; 2206 } 2207 2208 policydb->len = len; 2209 rc = selinux_set_mapping(policydb, secclass_map, --- 8 unchanged lines hidden (view full) --- 2218 if (rc) { 2219 kfree(newsidtab); 2220 policydb_destroy(policydb); 2221 goto out; 2222 } 2223 2224 state->ss->sidtab = newsidtab; 2225 security_load_policycaps(state); | 2202 rc = policydb_read(policydb, fp); 2203 if (rc) { 2204 kfree(newsidtab); 2205 goto out; 2206 } 2207 2208 policydb->len = len; 2209 rc = selinux_set_mapping(policydb, secclass_map, --- 8 unchanged lines hidden (view full) --- 2218 if (rc) { 2219 kfree(newsidtab); 2220 policydb_destroy(policydb); 2221 goto out; 2222 } 2223 2224 state->ss->sidtab = newsidtab; 2225 security_load_policycaps(state); |
2226 state->initialized = 1; | 2226 selinux_mark_initialized(state); |
2227 seqno = ++state->ss->latest_granting; 2228 selinux_complete_init(); 2229 avc_ss_reset(state->avc, seqno); 2230 selnl_notify_policyload(seqno); 2231 selinux_status_update_policyload(state, seqno); 2232 selinux_netlbl_cache_invalidate(); 2233 selinux_xfrm_notify_policyload(); 2234 goto out; --- 399 unchanged lines hidden (view full) --- 2634 struct user_datum *user; 2635 struct role_datum *role; 2636 struct ebitmap_node *rnode, *tnode; 2637 int rc = 0, i, j; 2638 2639 *sids = NULL; 2640 *nel = 0; 2641 | 2227 seqno = ++state->ss->latest_granting; 2228 selinux_complete_init(); 2229 avc_ss_reset(state->avc, seqno); 2230 selnl_notify_policyload(seqno); 2231 selinux_status_update_policyload(state, seqno); 2232 selinux_netlbl_cache_invalidate(); 2233 selinux_xfrm_notify_policyload(); 2234 goto out; --- 399 unchanged lines hidden (view full) --- 2634 struct user_datum *user; 2635 struct role_datum *role; 2636 struct ebitmap_node *rnode, *tnode; 2637 int rc = 0, i, j; 2638 2639 *sids = NULL; 2640 *nel = 0; 2641 |
2642 if (!state->initialized) | 2642 if (!selinux_initialized(state)) |
2643 goto out; 2644 2645 read_lock(&state->ss->policy_rwlock); 2646 2647 policydb = &state->ss->policydb; 2648 sidtab = state->ss->sidtab; 2649 2650 context_init(&usercon); --- 219 unchanged lines hidden (view full) --- 2870} 2871 2872int security_get_bools(struct selinux_state *state, 2873 int *len, char ***names, int **values) 2874{ 2875 struct policydb *policydb; 2876 int i, rc; 2877 | 2643 goto out; 2644 2645 read_lock(&state->ss->policy_rwlock); 2646 2647 policydb = &state->ss->policydb; 2648 sidtab = state->ss->sidtab; 2649 2650 context_init(&usercon); --- 219 unchanged lines hidden (view full) --- 2870} 2871 2872int security_get_bools(struct selinux_state *state, 2873 int *len, char ***names, int **values) 2874{ 2875 struct policydb *policydb; 2876 int i, rc; 2877 |
2878 if (!state->initialized) { | 2878 if (!selinux_initialized(state)) { |
2879 *len = 0; 2880 *names = NULL; 2881 *values = NULL; 2882 return 0; 2883 } 2884 2885 read_lock(&state->ss->policy_rwlock); 2886 --- 158 unchanged lines hidden (view full) --- 3045 struct context *context1; 3046 struct context *context2; 3047 struct context newcon; 3048 char *s; 3049 u32 len; 3050 int rc; 3051 3052 rc = 0; | 2879 *len = 0; 2880 *names = NULL; 2881 *values = NULL; 2882 return 0; 2883 } 2884 2885 read_lock(&state->ss->policy_rwlock); 2886 --- 158 unchanged lines hidden (view full) --- 3045 struct context *context1; 3046 struct context *context2; 3047 struct context newcon; 3048 char *s; 3049 u32 len; 3050 int rc; 3051 3052 rc = 0; |
3053 if (!state->initialized || !policydb->mls_enabled) { | 3053 if (!selinux_initialized(state) || !policydb->mls_enabled) { |
3054 *new_sid = sid; 3055 goto out; 3056 } 3057 3058 context_init(&newcon); 3059 3060 read_lock(&state->ss->policy_rwlock); 3061 --- 150 unchanged lines hidden (view full) --- 3212} 3213 3214int security_get_classes(struct selinux_state *state, 3215 char ***classes, int *nclasses) 3216{ 3217 struct policydb *policydb = &state->ss->policydb; 3218 int rc; 3219 | 3054 *new_sid = sid; 3055 goto out; 3056 } 3057 3058 context_init(&newcon); 3059 3060 read_lock(&state->ss->policy_rwlock); 3061 --- 150 unchanged lines hidden (view full) --- 3212} 3213 3214int security_get_classes(struct selinux_state *state, 3215 char ***classes, int *nclasses) 3216{ 3217 struct policydb *policydb = &state->ss->policydb; 3218 int rc; 3219 |
3220 if (!state->initialized) { | 3220 if (!selinux_initialized(state)) { |
3221 *nclasses = 0; 3222 *classes = NULL; 3223 return 0; 3224 } 3225 3226 read_lock(&state->ss->policy_rwlock); 3227 3228 rc = -ENOMEM; --- 132 unchanged lines hidden (view full) --- 3361 struct role_datum *roledatum; 3362 struct type_datum *typedatum; 3363 struct user_datum *userdatum; 3364 struct selinux_audit_rule **rule = (struct selinux_audit_rule **)vrule; 3365 int rc = 0; 3366 3367 *rule = NULL; 3368 | 3221 *nclasses = 0; 3222 *classes = NULL; 3223 return 0; 3224 } 3225 3226 read_lock(&state->ss->policy_rwlock); 3227 3228 rc = -ENOMEM; --- 132 unchanged lines hidden (view full) --- 3361 struct role_datum *roledatum; 3362 struct type_datum *typedatum; 3363 struct user_datum *userdatum; 3364 struct selinux_audit_rule **rule = (struct selinux_audit_rule **)vrule; 3365 int rc = 0; 3366 3367 *rule = NULL; 3368 |
3369 if (!state->initialized) | 3369 if (!selinux_initialized(state)) |
3370 return -EOPNOTSUPP; 3371 3372 switch (field) { 3373 case AUDIT_SUBJ_USER: 3374 case AUDIT_SUBJ_ROLE: 3375 case AUDIT_SUBJ_TYPE: 3376 case AUDIT_OBJ_USER: 3377 case AUDIT_OBJ_ROLE: --- 282 unchanged lines hidden (view full) --- 3660 u32 *sid) 3661{ 3662 struct policydb *policydb = &state->ss->policydb; 3663 struct sidtab *sidtab = state->ss->sidtab; 3664 int rc; 3665 struct context *ctx; 3666 struct context ctx_new; 3667 | 3370 return -EOPNOTSUPP; 3371 3372 switch (field) { 3373 case AUDIT_SUBJ_USER: 3374 case AUDIT_SUBJ_ROLE: 3375 case AUDIT_SUBJ_TYPE: 3376 case AUDIT_OBJ_USER: 3377 case AUDIT_OBJ_ROLE: --- 282 unchanged lines hidden (view full) --- 3660 u32 *sid) 3661{ 3662 struct policydb *policydb = &state->ss->policydb; 3663 struct sidtab *sidtab = state->ss->sidtab; 3664 int rc; 3665 struct context *ctx; 3666 struct context ctx_new; 3667 |
3668 if (!state->initialized) { | 3668 if (!selinux_initialized(state)) { |
3669 *sid = SECSID_NULL; 3670 return 0; 3671 } 3672 3673 read_lock(&state->ss->policy_rwlock); 3674 3675 if (secattr->flags & NETLBL_SECATTR_CACHE) 3676 *sid = *(u32 *)secattr->cache->data; --- 50 unchanged lines hidden (view full) --- 3727 */ 3728int security_netlbl_sid_to_secattr(struct selinux_state *state, 3729 u32 sid, struct netlbl_lsm_secattr *secattr) 3730{ 3731 struct policydb *policydb = &state->ss->policydb; 3732 int rc; 3733 struct context *ctx; 3734 | 3669 *sid = SECSID_NULL; 3670 return 0; 3671 } 3672 3673 read_lock(&state->ss->policy_rwlock); 3674 3675 if (secattr->flags & NETLBL_SECATTR_CACHE) 3676 *sid = *(u32 *)secattr->cache->data; --- 50 unchanged lines hidden (view full) --- 3727 */ 3728int security_netlbl_sid_to_secattr(struct selinux_state *state, 3729 u32 sid, struct netlbl_lsm_secattr *secattr) 3730{ 3731 struct policydb *policydb = &state->ss->policydb; 3732 int rc; 3733 struct context *ctx; 3734 |
3735 if (!state->initialized) | 3735 if (!selinux_initialized(state)) |
3736 return 0; 3737 3738 read_lock(&state->ss->policy_rwlock); 3739 3740 rc = -ENOENT; 3741 ctx = sidtab_search(state->ss->sidtab, sid); 3742 if (ctx == NULL) 3743 goto out; --- 22 unchanged lines hidden (view full) --- 3766 */ 3767int security_read_policy(struct selinux_state *state, 3768 void **data, size_t *len) 3769{ 3770 struct policydb *policydb = &state->ss->policydb; 3771 int rc; 3772 struct policy_file fp; 3773 | 3736 return 0; 3737 3738 read_lock(&state->ss->policy_rwlock); 3739 3740 rc = -ENOENT; 3741 ctx = sidtab_search(state->ss->sidtab, sid); 3742 if (ctx == NULL) 3743 goto out; --- 22 unchanged lines hidden (view full) --- 3766 */ 3767int security_read_policy(struct selinux_state *state, 3768 void **data, size_t *len) 3769{ 3770 struct policydb *policydb = &state->ss->policydb; 3771 int rc; 3772 struct policy_file fp; 3773 |
3774 if (!state->initialized) | 3774 if (!selinux_initialized(state)) |
3775 return -EINVAL; 3776 3777 *len = security_policydb_len(state); 3778 3779 *data = vmalloc_user(*len); 3780 if (!*data) 3781 return -ENOMEM; 3782 --- 14 unchanged lines hidden --- | 3775 return -EINVAL; 3776 3777 *len = security_policydb_len(state); 3778 3779 *data = vmalloc_user(*len); 3780 if (!*data) 3781 return -ENOMEM; 3782 --- 14 unchanged lines hidden --- |