security/selinux/ss/services.c
Source file repositories/reference/linux-study-clean/security/selinux/ss/services.c
File Facts
- System
- Linux kernel
- Corpus path
security/selinux/ss/services.c- Extension
.c- Size
- 95889 bytes
- Lines
- 3947
- Domain
- Core OS
- Bucket
- Security And Isolation
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/slab.hlinux/string.hlinux/spinlock.hlinux/rcupdate.hlinux/errno.hlinux/in.hlinux/sched.hlinux/audit.hlinux/parser.hlinux/vmalloc.hlinux/lsm_hooks.hnet/netlabel.hflask.havc.havc_ss.hsecurity.hcontext.hpolicydb.hsidtab.hservices.hconditional.hmls.hobjsec.hnetlabel.hxfrm.hebitmap.haudit.hpolicycap_names.hima.hinitial_sid_to_string.h
Detected Declarations
struct selinux_policy_convert_datastruct selinux_audit_rulefunction selinux_set_mappingfunction unmap_classfunction map_classfunction map_decisionfunction security_mls_enabledfunction constraint_expr_evalfunction dump_masked_av_helperfunction security_dump_masked_avfunction type_attribute_bounds_avfunction services_compute_xperms_driversfunction context_struct_compute_avfunction ebitmap_for_each_positive_bitfunction security_validtrans_handle_failfunction security_compute_validatetransfunction security_validate_transition_userfunction security_validate_transitionfunction security_bounded_transitionfunction avd_initfunction update_xperms_extended_datafunction services_compute_xperms_decisionfunction security_compute_xperms_decisionfunction ebitmap_for_each_positive_bitfunction pairfunction security_compute_av_userfunction context_struct_to_stringfunction sidtab_entry_to_stringfunction security_sidtab_hash_statsfunction security_sid_to_context_corefunction security_sid_to_contextfunction security_sid_to_context_forcefunction stringfunction string_to_context_structfunction security_context_to_sid_corefunction security_context_to_sidfunction security_context_str_to_sidfunction security_context_to_sid_defaultfunction security_context_to_sid_forcefunction compute_sid_handle_invalid_contextfunction filename_compute_typefunction security_compute_sidfunction security_transition_sidfunction security_transition_sid_userfunction security_member_sidfunction pairfunction convert_context_handle_invalid_contextfunction services_convert_context
Annotated Snippet
struct selinux_policy_convert_data {
struct convert_context_args args;
struct sidtab_convert_params sidtab_params;
};
/* Forward declaration. */
static int context_struct_to_string(struct policydb *policydb,
struct context *context,
char **scontext,
u32 *scontext_len);
static int sidtab_entry_to_string(struct policydb *policydb,
struct sidtab *sidtab,
struct sidtab_entry *entry,
char **scontext,
u32 *scontext_len);
static void context_struct_compute_av(struct policydb *policydb,
struct context *scontext,
struct context *tcontext,
u16 tclass,
struct av_decision *avd,
struct extended_perms *xperms);
static int selinux_set_mapping(struct policydb *pol,
const struct security_class_mapping *map,
struct selinux_map *out_map)
{
u16 i, j;
bool print_unknown_handle = false;
/* Find number of classes in the input mapping */
if (!map)
return -EINVAL;
i = 0;
while (map[i].name)
i++;
/* Allocate space for the class records, plus one for class zero */
out_map->mapping = kzalloc_objs(*out_map->mapping, ++i, GFP_ATOMIC);
if (!out_map->mapping)
return -ENOMEM;
/* Store the raw class and permission values */
j = 0;
while (map[j].name) {
const struct security_class_mapping *p_in = map + (j++);
struct selinux_mapping *p_out = out_map->mapping + j;
u16 k;
/* An empty class string skips ahead */
if (!strcmp(p_in->name, "")) {
p_out->num_perms = 0;
continue;
}
p_out->value = string_to_security_class(pol, p_in->name);
if (!p_out->value) {
pr_info("SELinux: Class %s not defined in policy.\n",
p_in->name);
if (pol->reject_unknown)
goto err;
p_out->num_perms = 0;
print_unknown_handle = true;
continue;
}
k = 0;
while (p_in->perms[k]) {
/* An empty permission string skips ahead */
if (!*p_in->perms[k]) {
k++;
continue;
}
p_out->perms[k] = string_to_av_perm(pol, p_out->value,
p_in->perms[k]);
if (!p_out->perms[k]) {
pr_info("SELinux: Permission %s in class %s not defined in policy.\n",
p_in->perms[k], p_in->name);
if (pol->reject_unknown)
goto err;
print_unknown_handle = true;
}
k++;
}
p_out->num_perms = k;
}
if (print_unknown_handle)
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/slab.h`, `linux/string.h`, `linux/spinlock.h`, `linux/rcupdate.h`, `linux/errno.h`, `linux/in.h`, `linux/sched.h`.
- Detected declarations: `struct selinux_policy_convert_data`, `struct selinux_audit_rule`, `function selinux_set_mapping`, `function unmap_class`, `function map_class`, `function map_decision`, `function security_mls_enabled`, `function constraint_expr_eval`, `function dump_masked_av_helper`, `function security_dump_masked_av`.
- Atlas domain: Core OS / Security And Isolation.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.