cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

services.c (98693B)


      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>
      9 *
     10 *	Support for enhanced MLS infrastructure.
     11 *	Support for context based audit filters.
     12 *
     13 * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
     14 *
     15 *	Added conditional policy language extensions
     16 *
     17 * Updated: Hewlett-Packard <paul@paul-moore.com>
     18 *
     19 *      Added support for NetLabel
     20 *      Added support for the policy capability bitmap
     21 *
     22 * Updated: Chad Sellers <csellers@tresys.com>
     23 *
     24 *  Added validation of kernel classes and permissions
     25 *
     26 * Updated: KaiGai Kohei <kaigai@ak.jp.nec.com>
     27 *
     28 *  Added support for bounds domain and audit messaged on masked permissions
     29 *
     30 * Updated: Guido Trentalancia <guido@trentalancia.com>
     31 *
     32 *  Added support for runtime switching of the policy type
     33 *
     34 * Copyright (C) 2008, 2009 NEC Corporation
     35 * Copyright (C) 2006, 2007 Hewlett-Packard Development Company, L.P.
     36 * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.
     37 * Copyright (C) 2003 - 2004, 2006 Tresys Technology, LLC
     38 * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
     39 */
     40#include <linux/kernel.h>
     41#include <linux/slab.h>
     42#include <linux/string.h>
     43#include <linux/spinlock.h>
     44#include <linux/rcupdate.h>
     45#include <linux/errno.h>
     46#include <linux/in.h>
     47#include <linux/sched.h>
     48#include <linux/audit.h>
     49#include <linux/vmalloc.h>
     50#include <linux/lsm_hooks.h>
     51#include <net/netlabel.h>
     52
     53#include "flask.h"
     54#include "avc.h"
     55#include "avc_ss.h"
     56#include "security.h"
     57#include "context.h"
     58#include "policydb.h"
     59#include "sidtab.h"
     60#include "services.h"
     61#include "conditional.h"
     62#include "mls.h"
     63#include "objsec.h"
     64#include "netlabel.h"
     65#include "xfrm.h"
     66#include "ebitmap.h"
     67#include "audit.h"
     68#include "policycap_names.h"
     69#include "ima.h"
     70
     71struct convert_context_args {
     72	struct selinux_state *state;
     73	struct policydb *oldp;
     74	struct policydb *newp;
     75};
     76
     77struct selinux_policy_convert_data {
     78	struct convert_context_args args;
     79	struct sidtab_convert_params sidtab_params;
     80};
     81
     82/* Forward declaration. */
     83static int context_struct_to_string(struct policydb *policydb,
     84				    struct context *context,
     85				    char **scontext,
     86				    u32 *scontext_len);
     87
     88static int sidtab_entry_to_string(struct policydb *policydb,
     89				  struct sidtab *sidtab,
     90				  struct sidtab_entry *entry,
     91				  char **scontext,
     92				  u32 *scontext_len);
     93
     94static void context_struct_compute_av(struct policydb *policydb,
     95				      struct context *scontext,
     96				      struct context *tcontext,
     97				      u16 tclass,
     98				      struct av_decision *avd,
     99				      struct extended_perms *xperms);
    100
    101static int selinux_set_mapping(struct policydb *pol,
    102			       const struct security_class_mapping *map,
    103			       struct selinux_map *out_map)
    104{
    105	u16 i, j;
    106	unsigned k;
    107	bool print_unknown_handle = false;
    108
    109	/* Find number of classes in the input mapping */
    110	if (!map)
    111		return -EINVAL;
    112	i = 0;
    113	while (map[i].name)
    114		i++;
    115
    116	/* Allocate space for the class records, plus one for class zero */
    117	out_map->mapping = kcalloc(++i, sizeof(*out_map->mapping), GFP_ATOMIC);
    118	if (!out_map->mapping)
    119		return -ENOMEM;
    120
    121	/* Store the raw class and permission values */
    122	j = 0;
    123	while (map[j].name) {
    124		const struct security_class_mapping *p_in = map + (j++);
    125		struct selinux_mapping *p_out = out_map->mapping + j;
    126
    127		/* An empty class string skips ahead */
    128		if (!strcmp(p_in->name, "")) {
    129			p_out->num_perms = 0;
    130			continue;
    131		}
    132
    133		p_out->value = string_to_security_class(pol, p_in->name);
    134		if (!p_out->value) {
    135			pr_info("SELinux:  Class %s not defined in policy.\n",
    136			       p_in->name);
    137			if (pol->reject_unknown)
    138				goto err;
    139			p_out->num_perms = 0;
    140			print_unknown_handle = true;
    141			continue;
    142		}
    143
    144		k = 0;
    145		while (p_in->perms[k]) {
    146			/* An empty permission string skips ahead */
    147			if (!*p_in->perms[k]) {
    148				k++;
    149				continue;
    150			}
    151			p_out->perms[k] = string_to_av_perm(pol, p_out->value,
    152							    p_in->perms[k]);
    153			if (!p_out->perms[k]) {
    154				pr_info("SELinux:  Permission %s in class %s not defined in policy.\n",
    155				       p_in->perms[k], p_in->name);
    156				if (pol->reject_unknown)
    157					goto err;
    158				print_unknown_handle = true;
    159			}
    160
    161			k++;
    162		}
    163		p_out->num_perms = k;
    164	}
    165
    166	if (print_unknown_handle)
    167		pr_info("SELinux: the above unknown classes and permissions will be %s\n",
    168		       pol->allow_unknown ? "allowed" : "denied");
    169
    170	out_map->size = i;
    171	return 0;
    172err:
    173	kfree(out_map->mapping);
    174	out_map->mapping = NULL;
    175	return -EINVAL;
    176}
    177
    178/*
    179 * Get real, policy values from mapped values
    180 */
    181
    182static u16 unmap_class(struct selinux_map *map, u16 tclass)
    183{
    184	if (tclass < map->size)
    185		return map->mapping[tclass].value;
    186
    187	return tclass;
    188}
    189
    190/*
    191 * Get kernel value for class from its policy value
    192 */
    193static u16 map_class(struct selinux_map *map, u16 pol_value)
    194{
    195	u16 i;
    196
    197	for (i = 1; i < map->size; i++) {
    198		if (map->mapping[i].value == pol_value)
    199			return i;
    200	}
    201
    202	return SECCLASS_NULL;
    203}
    204
    205static void map_decision(struct selinux_map *map,
    206			 u16 tclass, struct av_decision *avd,
    207			 int allow_unknown)
    208{
    209	if (tclass < map->size) {
    210		struct selinux_mapping *mapping = &map->mapping[tclass];
    211		unsigned int i, n = mapping->num_perms;
    212		u32 result;
    213
    214		for (i = 0, result = 0; i < n; i++) {
    215			if (avd->allowed & mapping->perms[i])
    216				result |= 1<<i;
    217			if (allow_unknown && !mapping->perms[i])
    218				result |= 1<<i;
    219		}
    220		avd->allowed = result;
    221
    222		for (i = 0, result = 0; i < n; i++)
    223			if (avd->auditallow & mapping->perms[i])
    224				result |= 1<<i;
    225		avd->auditallow = result;
    226
    227		for (i = 0, result = 0; i < n; i++) {
    228			if (avd->auditdeny & mapping->perms[i])
    229				result |= 1<<i;
    230			if (!allow_unknown && !mapping->perms[i])
    231				result |= 1<<i;
    232		}
    233		/*
    234		 * In case the kernel has a bug and requests a permission
    235		 * between num_perms and the maximum permission number, we
    236		 * should audit that denial
    237		 */
    238		for (; i < (sizeof(u32)*8); i++)
    239			result |= 1<<i;
    240		avd->auditdeny = result;
    241	}
    242}
    243
    244int security_mls_enabled(struct selinux_state *state)
    245{
    246	int mls_enabled;
    247	struct selinux_policy *policy;
    248
    249	if (!selinux_initialized(state))
    250		return 0;
    251
    252	rcu_read_lock();
    253	policy = rcu_dereference(state->policy);
    254	mls_enabled = policy->policydb.mls_enabled;
    255	rcu_read_unlock();
    256	return mls_enabled;
    257}
    258
    259/*
    260 * Return the boolean value of a constraint expression
    261 * when it is applied to the specified source and target
    262 * security contexts.
    263 *
    264 * xcontext is a special beast...  It is used by the validatetrans rules
    265 * only.  For these rules, scontext is the context before the transition,
    266 * tcontext is the context after the transition, and xcontext is the context
    267 * of the process performing the transition.  All other callers of
    268 * constraint_expr_eval should pass in NULL for xcontext.
    269 */
    270static int constraint_expr_eval(struct policydb *policydb,
    271				struct context *scontext,
    272				struct context *tcontext,
    273				struct context *xcontext,
    274				struct constraint_expr *cexpr)
    275{
    276	u32 val1, val2;
    277	struct context *c;
    278	struct role_datum *r1, *r2;
    279	struct mls_level *l1, *l2;
    280	struct constraint_expr *e;
    281	int s[CEXPR_MAXDEPTH];
    282	int sp = -1;
    283
    284	for (e = cexpr; e; e = e->next) {
    285		switch (e->expr_type) {
    286		case CEXPR_NOT:
    287			BUG_ON(sp < 0);
    288			s[sp] = !s[sp];
    289			break;
    290		case CEXPR_AND:
    291			BUG_ON(sp < 1);
    292			sp--;
    293			s[sp] &= s[sp + 1];
    294			break;
    295		case CEXPR_OR:
    296			BUG_ON(sp < 1);
    297			sp--;
    298			s[sp] |= s[sp + 1];
    299			break;
    300		case CEXPR_ATTR:
    301			if (sp == (CEXPR_MAXDEPTH - 1))
    302				return 0;
    303			switch (e->attr) {
    304			case CEXPR_USER:
    305				val1 = scontext->user;
    306				val2 = tcontext->user;
    307				break;
    308			case CEXPR_TYPE:
    309				val1 = scontext->type;
    310				val2 = tcontext->type;
    311				break;
    312			case CEXPR_ROLE:
    313				val1 = scontext->role;
    314				val2 = tcontext->role;
    315				r1 = policydb->role_val_to_struct[val1 - 1];
    316				r2 = policydb->role_val_to_struct[val2 - 1];
    317				switch (e->op) {
    318				case CEXPR_DOM:
    319					s[++sp] = ebitmap_get_bit(&r1->dominates,
    320								  val2 - 1);
    321					continue;
    322				case CEXPR_DOMBY:
    323					s[++sp] = ebitmap_get_bit(&r2->dominates,
    324								  val1 - 1);
    325					continue;
    326				case CEXPR_INCOMP:
    327					s[++sp] = (!ebitmap_get_bit(&r1->dominates,
    328								    val2 - 1) &&
    329						   !ebitmap_get_bit(&r2->dominates,
    330								    val1 - 1));
    331					continue;
    332				default:
    333					break;
    334				}
    335				break;
    336			case CEXPR_L1L2:
    337				l1 = &(scontext->range.level[0]);
    338				l2 = &(tcontext->range.level[0]);
    339				goto mls_ops;
    340			case CEXPR_L1H2:
    341				l1 = &(scontext->range.level[0]);
    342				l2 = &(tcontext->range.level[1]);
    343				goto mls_ops;
    344			case CEXPR_H1L2:
    345				l1 = &(scontext->range.level[1]);
    346				l2 = &(tcontext->range.level[0]);
    347				goto mls_ops;
    348			case CEXPR_H1H2:
    349				l1 = &(scontext->range.level[1]);
    350				l2 = &(tcontext->range.level[1]);
    351				goto mls_ops;
    352			case CEXPR_L1H1:
    353				l1 = &(scontext->range.level[0]);
    354				l2 = &(scontext->range.level[1]);
    355				goto mls_ops;
    356			case CEXPR_L2H2:
    357				l1 = &(tcontext->range.level[0]);
    358				l2 = &(tcontext->range.level[1]);
    359				goto mls_ops;
    360mls_ops:
    361				switch (e->op) {
    362				case CEXPR_EQ:
    363					s[++sp] = mls_level_eq(l1, l2);
    364					continue;
    365				case CEXPR_NEQ:
    366					s[++sp] = !mls_level_eq(l1, l2);
    367					continue;
    368				case CEXPR_DOM:
    369					s[++sp] = mls_level_dom(l1, l2);
    370					continue;
    371				case CEXPR_DOMBY:
    372					s[++sp] = mls_level_dom(l2, l1);
    373					continue;
    374				case CEXPR_INCOMP:
    375					s[++sp] = mls_level_incomp(l2, l1);
    376					continue;
    377				default:
    378					BUG();
    379					return 0;
    380				}
    381				break;
    382			default:
    383				BUG();
    384				return 0;
    385			}
    386
    387			switch (e->op) {
    388			case CEXPR_EQ:
    389				s[++sp] = (val1 == val2);
    390				break;
    391			case CEXPR_NEQ:
    392				s[++sp] = (val1 != val2);
    393				break;
    394			default:
    395				BUG();
    396				return 0;
    397			}
    398			break;
    399		case CEXPR_NAMES:
    400			if (sp == (CEXPR_MAXDEPTH-1))
    401				return 0;
    402			c = scontext;
    403			if (e->attr & CEXPR_TARGET)
    404				c = tcontext;
    405			else if (e->attr & CEXPR_XTARGET) {
    406				c = xcontext;
    407				if (!c) {
    408					BUG();
    409					return 0;
    410				}
    411			}
    412			if (e->attr & CEXPR_USER)
    413				val1 = c->user;
    414			else if (e->attr & CEXPR_ROLE)
    415				val1 = c->role;
    416			else if (e->attr & CEXPR_TYPE)
    417				val1 = c->type;
    418			else {
    419				BUG();
    420				return 0;
    421			}
    422
    423			switch (e->op) {
    424			case CEXPR_EQ:
    425				s[++sp] = ebitmap_get_bit(&e->names, val1 - 1);
    426				break;
    427			case CEXPR_NEQ:
    428				s[++sp] = !ebitmap_get_bit(&e->names, val1 - 1);
    429				break;
    430			default:
    431				BUG();
    432				return 0;
    433			}
    434			break;
    435		default:
    436			BUG();
    437			return 0;
    438		}
    439	}
    440
    441	BUG_ON(sp != 0);
    442	return s[0];
    443}
    444
    445/*
    446 * security_dump_masked_av - dumps masked permissions during
    447 * security_compute_av due to RBAC, MLS/Constraint and Type bounds.
    448 */
    449static int dump_masked_av_helper(void *k, void *d, void *args)
    450{
    451	struct perm_datum *pdatum = d;
    452	char **permission_names = args;
    453
    454	BUG_ON(pdatum->value < 1 || pdatum->value > 32);
    455
    456	permission_names[pdatum->value - 1] = (char *)k;
    457
    458	return 0;
    459}
    460
    461static void security_dump_masked_av(struct policydb *policydb,
    462				    struct context *scontext,
    463				    struct context *tcontext,
    464				    u16 tclass,
    465				    u32 permissions,
    466				    const char *reason)
    467{
    468	struct common_datum *common_dat;
    469	struct class_datum *tclass_dat;
    470	struct audit_buffer *ab;
    471	char *tclass_name;
    472	char *scontext_name = NULL;
    473	char *tcontext_name = NULL;
    474	char *permission_names[32];
    475	int index;
    476	u32 length;
    477	bool need_comma = false;
    478
    479	if (!permissions)
    480		return;
    481
    482	tclass_name = sym_name(policydb, SYM_CLASSES, tclass - 1);
    483	tclass_dat = policydb->class_val_to_struct[tclass - 1];
    484	common_dat = tclass_dat->comdatum;
    485
    486	/* init permission_names */
    487	if (common_dat &&
    488	    hashtab_map(&common_dat->permissions.table,
    489			dump_masked_av_helper, permission_names) < 0)
    490		goto out;
    491
    492	if (hashtab_map(&tclass_dat->permissions.table,
    493			dump_masked_av_helper, permission_names) < 0)
    494		goto out;
    495
    496	/* get scontext/tcontext in text form */
    497	if (context_struct_to_string(policydb, scontext,
    498				     &scontext_name, &length) < 0)
    499		goto out;
    500
    501	if (context_struct_to_string(policydb, tcontext,
    502				     &tcontext_name, &length) < 0)
    503		goto out;
    504
    505	/* audit a message */
    506	ab = audit_log_start(audit_context(),
    507			     GFP_ATOMIC, AUDIT_SELINUX_ERR);
    508	if (!ab)
    509		goto out;
    510
    511	audit_log_format(ab, "op=security_compute_av reason=%s "
    512			 "scontext=%s tcontext=%s tclass=%s perms=",
    513			 reason, scontext_name, tcontext_name, tclass_name);
    514
    515	for (index = 0; index < 32; index++) {
    516		u32 mask = (1 << index);
    517
    518		if ((mask & permissions) == 0)
    519			continue;
    520
    521		audit_log_format(ab, "%s%s",
    522				 need_comma ? "," : "",
    523				 permission_names[index]
    524				 ? permission_names[index] : "????");
    525		need_comma = true;
    526	}
    527	audit_log_end(ab);
    528out:
    529	/* release scontext/tcontext */
    530	kfree(tcontext_name);
    531	kfree(scontext_name);
    532}
    533
    534/*
    535 * security_boundary_permission - drops violated permissions
    536 * on boundary constraint.
    537 */
    538static void type_attribute_bounds_av(struct policydb *policydb,
    539				     struct context *scontext,
    540				     struct context *tcontext,
    541				     u16 tclass,
    542				     struct av_decision *avd)
    543{
    544	struct context lo_scontext;
    545	struct context lo_tcontext, *tcontextp = tcontext;
    546	struct av_decision lo_avd;
    547	struct type_datum *source;
    548	struct type_datum *target;
    549	u32 masked = 0;
    550
    551	source = policydb->type_val_to_struct[scontext->type - 1];
    552	BUG_ON(!source);
    553
    554	if (!source->bounds)
    555		return;
    556
    557	target = policydb->type_val_to_struct[tcontext->type - 1];
    558	BUG_ON(!target);
    559
    560	memset(&lo_avd, 0, sizeof(lo_avd));
    561
    562	memcpy(&lo_scontext, scontext, sizeof(lo_scontext));
    563	lo_scontext.type = source->bounds;
    564
    565	if (target->bounds) {
    566		memcpy(&lo_tcontext, tcontext, sizeof(lo_tcontext));
    567		lo_tcontext.type = target->bounds;
    568		tcontextp = &lo_tcontext;
    569	}
    570
    571	context_struct_compute_av(policydb, &lo_scontext,
    572				  tcontextp,
    573				  tclass,
    574				  &lo_avd,
    575				  NULL);
    576
    577	masked = ~lo_avd.allowed & avd->allowed;
    578
    579	if (likely(!masked))
    580		return;		/* no masked permission */
    581
    582	/* mask violated permissions */
    583	avd->allowed &= ~masked;
    584
    585	/* audit masked permissions */
    586	security_dump_masked_av(policydb, scontext, tcontext,
    587				tclass, masked, "bounds");
    588}
    589
    590/*
    591 * flag which drivers have permissions
    592 * only looking for ioctl based extended permssions
    593 */
    594void services_compute_xperms_drivers(
    595		struct extended_perms *xperms,
    596		struct avtab_node *node)
    597{
    598	unsigned int i;
    599
    600	if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLDRIVER) {
    601		/* if one or more driver has all permissions allowed */
    602		for (i = 0; i < ARRAY_SIZE(xperms->drivers.p); i++)
    603			xperms->drivers.p[i] |= node->datum.u.xperms->perms.p[i];
    604	} else if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLFUNCTION) {
    605		/* if allowing permissions within a driver */
    606		security_xperm_set(xperms->drivers.p,
    607					node->datum.u.xperms->driver);
    608	}
    609
    610	xperms->len = 1;
    611}
    612
    613/*
    614 * Compute access vectors and extended permissions based on a context
    615 * structure pair for the permissions in a particular class.
    616 */
    617static void context_struct_compute_av(struct policydb *policydb,
    618				      struct context *scontext,
    619				      struct context *tcontext,
    620				      u16 tclass,
    621				      struct av_decision *avd,
    622				      struct extended_perms *xperms)
    623{
    624	struct constraint_node *constraint;
    625	struct role_allow *ra;
    626	struct avtab_key avkey;
    627	struct avtab_node *node;
    628	struct class_datum *tclass_datum;
    629	struct ebitmap *sattr, *tattr;
    630	struct ebitmap_node *snode, *tnode;
    631	unsigned int i, j;
    632
    633	avd->allowed = 0;
    634	avd->auditallow = 0;
    635	avd->auditdeny = 0xffffffff;
    636	if (xperms) {
    637		memset(&xperms->drivers, 0, sizeof(xperms->drivers));
    638		xperms->len = 0;
    639	}
    640
    641	if (unlikely(!tclass || tclass > policydb->p_classes.nprim)) {
    642		if (printk_ratelimit())
    643			pr_warn("SELinux:  Invalid class %hu\n", tclass);
    644		return;
    645	}
    646
    647	tclass_datum = policydb->class_val_to_struct[tclass - 1];
    648
    649	/*
    650	 * If a specific type enforcement rule was defined for
    651	 * this permission check, then use it.
    652	 */
    653	avkey.target_class = tclass;
    654	avkey.specified = AVTAB_AV | AVTAB_XPERMS;
    655	sattr = &policydb->type_attr_map_array[scontext->type - 1];
    656	tattr = &policydb->type_attr_map_array[tcontext->type - 1];
    657	ebitmap_for_each_positive_bit(sattr, snode, i) {
    658		ebitmap_for_each_positive_bit(tattr, tnode, j) {
    659			avkey.source_type = i + 1;
    660			avkey.target_type = j + 1;
    661			for (node = avtab_search_node(&policydb->te_avtab,
    662						      &avkey);
    663			     node;
    664			     node = avtab_search_node_next(node, avkey.specified)) {
    665				if (node->key.specified == AVTAB_ALLOWED)
    666					avd->allowed |= node->datum.u.data;
    667				else if (node->key.specified == AVTAB_AUDITALLOW)
    668					avd->auditallow |= node->datum.u.data;
    669				else if (node->key.specified == AVTAB_AUDITDENY)
    670					avd->auditdeny &= node->datum.u.data;
    671				else if (xperms && (node->key.specified & AVTAB_XPERMS))
    672					services_compute_xperms_drivers(xperms, node);
    673			}
    674
    675			/* Check conditional av table for additional permissions */
    676			cond_compute_av(&policydb->te_cond_avtab, &avkey,
    677					avd, xperms);
    678
    679		}
    680	}
    681
    682	/*
    683	 * Remove any permissions prohibited by a constraint (this includes
    684	 * the MLS policy).
    685	 */
    686	constraint = tclass_datum->constraints;
    687	while (constraint) {
    688		if ((constraint->permissions & (avd->allowed)) &&
    689		    !constraint_expr_eval(policydb, scontext, tcontext, NULL,
    690					  constraint->expr)) {
    691			avd->allowed &= ~(constraint->permissions);
    692		}
    693		constraint = constraint->next;
    694	}
    695
    696	/*
    697	 * If checking process transition permission and the
    698	 * role is changing, then check the (current_role, new_role)
    699	 * pair.
    700	 */
    701	if (tclass == policydb->process_class &&
    702	    (avd->allowed & policydb->process_trans_perms) &&
    703	    scontext->role != tcontext->role) {
    704		for (ra = policydb->role_allow; ra; ra = ra->next) {
    705			if (scontext->role == ra->role &&
    706			    tcontext->role == ra->new_role)
    707				break;
    708		}
    709		if (!ra)
    710			avd->allowed &= ~policydb->process_trans_perms;
    711	}
    712
    713	/*
    714	 * If the given source and target types have boundary
    715	 * constraint, lazy checks have to mask any violated
    716	 * permission and notice it to userspace via audit.
    717	 */
    718	type_attribute_bounds_av(policydb, scontext, tcontext,
    719				 tclass, avd);
    720}
    721
    722static int security_validtrans_handle_fail(struct selinux_state *state,
    723					struct selinux_policy *policy,
    724					struct sidtab_entry *oentry,
    725					struct sidtab_entry *nentry,
    726					struct sidtab_entry *tentry,
    727					u16 tclass)
    728{
    729	struct policydb *p = &policy->policydb;
    730	struct sidtab *sidtab = policy->sidtab;
    731	char *o = NULL, *n = NULL, *t = NULL;
    732	u32 olen, nlen, tlen;
    733
    734	if (sidtab_entry_to_string(p, sidtab, oentry, &o, &olen))
    735		goto out;
    736	if (sidtab_entry_to_string(p, sidtab, nentry, &n, &nlen))
    737		goto out;
    738	if (sidtab_entry_to_string(p, sidtab, tentry, &t, &tlen))
    739		goto out;
    740	audit_log(audit_context(), GFP_ATOMIC, AUDIT_SELINUX_ERR,
    741		  "op=security_validate_transition seresult=denied"
    742		  " oldcontext=%s newcontext=%s taskcontext=%s tclass=%s",
    743		  o, n, t, sym_name(p, SYM_CLASSES, tclass-1));
    744out:
    745	kfree(o);
    746	kfree(n);
    747	kfree(t);
    748
    749	if (!enforcing_enabled(state))
    750		return 0;
    751	return -EPERM;
    752}
    753
    754static int security_compute_validatetrans(struct selinux_state *state,
    755					  u32 oldsid, u32 newsid, u32 tasksid,
    756					  u16 orig_tclass, bool user)
    757{
    758	struct selinux_policy *policy;
    759	struct policydb *policydb;
    760	struct sidtab *sidtab;
    761	struct sidtab_entry *oentry;
    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 (!selinux_initialized(state))
    771		return 0;
    772
    773	rcu_read_lock();
    774
    775	policy = rcu_dereference(state->policy);
    776	policydb = &policy->policydb;
    777	sidtab = policy->sidtab;
    778
    779	if (!user)
    780		tclass = unmap_class(&policy->map, orig_tclass);
    781	else
    782		tclass = orig_tclass;
    783
    784	if (!tclass || tclass > policydb->p_classes.nprim) {
    785		rc = -EINVAL;
    786		goto out;
    787	}
    788	tclass_datum = policydb->class_val_to_struct[tclass - 1];
    789
    790	oentry = sidtab_search_entry(sidtab, oldsid);
    791	if (!oentry) {
    792		pr_err("SELinux: %s:  unrecognized SID %d\n",
    793			__func__, oldsid);
    794		rc = -EINVAL;
    795		goto out;
    796	}
    797
    798	nentry = sidtab_search_entry(sidtab, newsid);
    799	if (!nentry) {
    800		pr_err("SELinux: %s:  unrecognized SID %d\n",
    801			__func__, newsid);
    802		rc = -EINVAL;
    803		goto out;
    804	}
    805
    806	tentry = sidtab_search_entry(sidtab, tasksid);
    807	if (!tentry) {
    808		pr_err("SELinux: %s:  unrecognized SID %d\n",
    809			__func__, tasksid);
    810		rc = -EINVAL;
    811		goto out;
    812	}
    813
    814	constraint = tclass_datum->validatetrans;
    815	while (constraint) {
    816		if (!constraint_expr_eval(policydb, &oentry->context,
    817					  &nentry->context, &tentry->context,
    818					  constraint->expr)) {
    819			if (user)
    820				rc = -EPERM;
    821			else
    822				rc = security_validtrans_handle_fail(state,
    823								policy,
    824								oentry,
    825								nentry,
    826								tentry,
    827								tclass);
    828			goto out;
    829		}
    830		constraint = constraint->next;
    831	}
    832
    833out:
    834	rcu_read_unlock();
    835	return rc;
    836}
    837
    838int security_validate_transition_user(struct selinux_state *state,
    839				      u32 oldsid, u32 newsid, u32 tasksid,
    840				      u16 tclass)
    841{
    842	return security_compute_validatetrans(state, oldsid, newsid, tasksid,
    843					      tclass, true);
    844}
    845
    846int security_validate_transition(struct selinux_state *state,
    847				 u32 oldsid, u32 newsid, u32 tasksid,
    848				 u16 orig_tclass)
    849{
    850	return security_compute_validatetrans(state, oldsid, newsid, tasksid,
    851					      orig_tclass, false);
    852}
    853
    854/*
    855 * security_bounded_transition - check whether the given
    856 * transition is directed to bounded, or not.
    857 * It returns 0, if @newsid is bounded by @oldsid.
    858 * Otherwise, it returns error code.
    859 *
    860 * @state: SELinux state
    861 * @oldsid : current security identifier
    862 * @newsid : destinated security identifier
    863 */
    864int security_bounded_transition(struct selinux_state *state,
    865				u32 old_sid, u32 new_sid)
    866{
    867	struct selinux_policy *policy;
    868	struct policydb *policydb;
    869	struct sidtab *sidtab;
    870	struct sidtab_entry *old_entry, *new_entry;
    871	struct type_datum *type;
    872	int index;
    873	int rc;
    874
    875	if (!selinux_initialized(state))
    876		return 0;
    877
    878	rcu_read_lock();
    879	policy = rcu_dereference(state->policy);
    880	policydb = &policy->policydb;
    881	sidtab = policy->sidtab;
    882
    883	rc = -EINVAL;
    884	old_entry = sidtab_search_entry(sidtab, old_sid);
    885	if (!old_entry) {
    886		pr_err("SELinux: %s: unrecognized SID %u\n",
    887		       __func__, old_sid);
    888		goto out;
    889	}
    890
    891	rc = -EINVAL;
    892	new_entry = sidtab_search_entry(sidtab, new_sid);
    893	if (!new_entry) {
    894		pr_err("SELinux: %s: unrecognized SID %u\n",
    895		       __func__, new_sid);
    896		goto out;
    897	}
    898
    899	rc = 0;
    900	/* type/domain unchanged */
    901	if (old_entry->context.type == new_entry->context.type)
    902		goto out;
    903
    904	index = new_entry->context.type;
    905	while (true) {
    906		type = policydb->type_val_to_struct[index - 1];
    907		BUG_ON(!type);
    908
    909		/* not bounded anymore */
    910		rc = -EPERM;
    911		if (!type->bounds)
    912			break;
    913
    914		/* @newsid is bounded by @oldsid */
    915		rc = 0;
    916		if (type->bounds == old_entry->context.type)
    917			break;
    918
    919		index = type->bounds;
    920	}
    921
    922	if (rc) {
    923		char *old_name = NULL;
    924		char *new_name = NULL;
    925		u32 length;
    926
    927		if (!sidtab_entry_to_string(policydb, sidtab, old_entry,
    928					    &old_name, &length) &&
    929		    !sidtab_entry_to_string(policydb, sidtab, new_entry,
    930					    &new_name, &length)) {
    931			audit_log(audit_context(),
    932				  GFP_ATOMIC, AUDIT_SELINUX_ERR,
    933				  "op=security_bounded_transition "
    934				  "seresult=denied "
    935				  "oldcontext=%s newcontext=%s",
    936				  old_name, new_name);
    937		}
    938		kfree(new_name);
    939		kfree(old_name);
    940	}
    941out:
    942	rcu_read_unlock();
    943
    944	return rc;
    945}
    946
    947static void avd_init(struct selinux_policy *policy, struct av_decision *avd)
    948{
    949	avd->allowed = 0;
    950	avd->auditallow = 0;
    951	avd->auditdeny = 0xffffffff;
    952	if (policy)
    953		avd->seqno = policy->latest_granting;
    954	else
    955		avd->seqno = 0;
    956	avd->flags = 0;
    957}
    958
    959void services_compute_xperms_decision(struct extended_perms_decision *xpermd,
    960					struct avtab_node *node)
    961{
    962	unsigned int i;
    963
    964	if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLFUNCTION) {
    965		if (xpermd->driver != node->datum.u.xperms->driver)
    966			return;
    967	} else if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLDRIVER) {
    968		if (!security_xperm_test(node->datum.u.xperms->perms.p,
    969					xpermd->driver))
    970			return;
    971	} else {
    972		BUG();
    973	}
    974
    975	if (node->key.specified == AVTAB_XPERMS_ALLOWED) {
    976		xpermd->used |= XPERMS_ALLOWED;
    977		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLDRIVER) {
    978			memset(xpermd->allowed->p, 0xff,
    979					sizeof(xpermd->allowed->p));
    980		}
    981		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLFUNCTION) {
    982			for (i = 0; i < ARRAY_SIZE(xpermd->allowed->p); i++)
    983				xpermd->allowed->p[i] |=
    984					node->datum.u.xperms->perms.p[i];
    985		}
    986	} else if (node->key.specified == AVTAB_XPERMS_AUDITALLOW) {
    987		xpermd->used |= XPERMS_AUDITALLOW;
    988		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLDRIVER) {
    989			memset(xpermd->auditallow->p, 0xff,
    990					sizeof(xpermd->auditallow->p));
    991		}
    992		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLFUNCTION) {
    993			for (i = 0; i < ARRAY_SIZE(xpermd->auditallow->p); i++)
    994				xpermd->auditallow->p[i] |=
    995					node->datum.u.xperms->perms.p[i];
    996		}
    997	} else if (node->key.specified == AVTAB_XPERMS_DONTAUDIT) {
    998		xpermd->used |= XPERMS_DONTAUDIT;
    999		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLDRIVER) {
   1000			memset(xpermd->dontaudit->p, 0xff,
   1001					sizeof(xpermd->dontaudit->p));
   1002		}
   1003		if (node->datum.u.xperms->specified == AVTAB_XPERMS_IOCTLFUNCTION) {
   1004			for (i = 0; i < ARRAY_SIZE(xpermd->dontaudit->p); i++)
   1005				xpermd->dontaudit->p[i] |=
   1006					node->datum.u.xperms->perms.p[i];
   1007		}
   1008	} else {
   1009		BUG();
   1010	}
   1011}
   1012
   1013void security_compute_xperms_decision(struct selinux_state *state,
   1014				      u32 ssid,
   1015				      u32 tsid,
   1016				      u16 orig_tclass,
   1017				      u8 driver,
   1018				      struct extended_perms_decision *xpermd)
   1019{
   1020	struct selinux_policy *policy;
   1021	struct policydb *policydb;
   1022	struct sidtab *sidtab;
   1023	u16 tclass;
   1024	struct context *scontext, *tcontext;
   1025	struct avtab_key avkey;
   1026	struct avtab_node *node;
   1027	struct ebitmap *sattr, *tattr;
   1028	struct ebitmap_node *snode, *tnode;
   1029	unsigned int i, j;
   1030
   1031	xpermd->driver = driver;
   1032	xpermd->used = 0;
   1033	memset(xpermd->allowed->p, 0, sizeof(xpermd->allowed->p));
   1034	memset(xpermd->auditallow->p, 0, sizeof(xpermd->auditallow->p));
   1035	memset(xpermd->dontaudit->p, 0, sizeof(xpermd->dontaudit->p));
   1036
   1037	rcu_read_lock();
   1038	if (!selinux_initialized(state))
   1039		goto allow;
   1040
   1041	policy = rcu_dereference(state->policy);
   1042	policydb = &policy->policydb;
   1043	sidtab = policy->sidtab;
   1044
   1045	scontext = sidtab_search(sidtab, ssid);
   1046	if (!scontext) {
   1047		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1048		       __func__, ssid);
   1049		goto out;
   1050	}
   1051
   1052	tcontext = sidtab_search(sidtab, tsid);
   1053	if (!tcontext) {
   1054		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1055		       __func__, tsid);
   1056		goto out;
   1057	}
   1058
   1059	tclass = unmap_class(&policy->map, orig_tclass);
   1060	if (unlikely(orig_tclass && !tclass)) {
   1061		if (policydb->allow_unknown)
   1062			goto allow;
   1063		goto out;
   1064	}
   1065
   1066
   1067	if (unlikely(!tclass || tclass > policydb->p_classes.nprim)) {
   1068		pr_warn_ratelimited("SELinux:  Invalid class %hu\n", tclass);
   1069		goto out;
   1070	}
   1071
   1072	avkey.target_class = tclass;
   1073	avkey.specified = AVTAB_XPERMS;
   1074	sattr = &policydb->type_attr_map_array[scontext->type - 1];
   1075	tattr = &policydb->type_attr_map_array[tcontext->type - 1];
   1076	ebitmap_for_each_positive_bit(sattr, snode, i) {
   1077		ebitmap_for_each_positive_bit(tattr, tnode, j) {
   1078			avkey.source_type = i + 1;
   1079			avkey.target_type = j + 1;
   1080			for (node = avtab_search_node(&policydb->te_avtab,
   1081						      &avkey);
   1082			     node;
   1083			     node = avtab_search_node_next(node, avkey.specified))
   1084				services_compute_xperms_decision(xpermd, node);
   1085
   1086			cond_compute_xperms(&policydb->te_cond_avtab,
   1087						&avkey, xpermd);
   1088		}
   1089	}
   1090out:
   1091	rcu_read_unlock();
   1092	return;
   1093allow:
   1094	memset(xpermd->allowed->p, 0xff, sizeof(xpermd->allowed->p));
   1095	goto out;
   1096}
   1097
   1098/**
   1099 * security_compute_av - Compute access vector decisions.
   1100 * @state: SELinux state
   1101 * @ssid: source security identifier
   1102 * @tsid: target security identifier
   1103 * @orig_tclass: target security class
   1104 * @avd: access vector decisions
   1105 * @xperms: extended permissions
   1106 *
   1107 * Compute a set of access vector decisions based on the
   1108 * SID pair (@ssid, @tsid) for the permissions in @tclass.
   1109 */
   1110void security_compute_av(struct selinux_state *state,
   1111			 u32 ssid,
   1112			 u32 tsid,
   1113			 u16 orig_tclass,
   1114			 struct av_decision *avd,
   1115			 struct extended_perms *xperms)
   1116{
   1117	struct selinux_policy *policy;
   1118	struct policydb *policydb;
   1119	struct sidtab *sidtab;
   1120	u16 tclass;
   1121	struct context *scontext = NULL, *tcontext = NULL;
   1122
   1123	rcu_read_lock();
   1124	policy = rcu_dereference(state->policy);
   1125	avd_init(policy, avd);
   1126	xperms->len = 0;
   1127	if (!selinux_initialized(state))
   1128		goto allow;
   1129
   1130	policydb = &policy->policydb;
   1131	sidtab = policy->sidtab;
   1132
   1133	scontext = sidtab_search(sidtab, ssid);
   1134	if (!scontext) {
   1135		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1136		       __func__, ssid);
   1137		goto out;
   1138	}
   1139
   1140	/* permissive domain? */
   1141	if (ebitmap_get_bit(&policydb->permissive_map, scontext->type))
   1142		avd->flags |= AVD_FLAGS_PERMISSIVE;
   1143
   1144	tcontext = sidtab_search(sidtab, tsid);
   1145	if (!tcontext) {
   1146		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1147		       __func__, tsid);
   1148		goto out;
   1149	}
   1150
   1151	tclass = unmap_class(&policy->map, orig_tclass);
   1152	if (unlikely(orig_tclass && !tclass)) {
   1153		if (policydb->allow_unknown)
   1154			goto allow;
   1155		goto out;
   1156	}
   1157	context_struct_compute_av(policydb, scontext, tcontext, tclass, avd,
   1158				  xperms);
   1159	map_decision(&policy->map, orig_tclass, avd,
   1160		     policydb->allow_unknown);
   1161out:
   1162	rcu_read_unlock();
   1163	return;
   1164allow:
   1165	avd->allowed = 0xffffffff;
   1166	goto out;
   1167}
   1168
   1169void security_compute_av_user(struct selinux_state *state,
   1170			      u32 ssid,
   1171			      u32 tsid,
   1172			      u16 tclass,
   1173			      struct av_decision *avd)
   1174{
   1175	struct selinux_policy *policy;
   1176	struct policydb *policydb;
   1177	struct sidtab *sidtab;
   1178	struct context *scontext = NULL, *tcontext = NULL;
   1179
   1180	rcu_read_lock();
   1181	policy = rcu_dereference(state->policy);
   1182	avd_init(policy, avd);
   1183	if (!selinux_initialized(state))
   1184		goto allow;
   1185
   1186	policydb = &policy->policydb;
   1187	sidtab = policy->sidtab;
   1188
   1189	scontext = sidtab_search(sidtab, ssid);
   1190	if (!scontext) {
   1191		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1192		       __func__, ssid);
   1193		goto out;
   1194	}
   1195
   1196	/* permissive domain? */
   1197	if (ebitmap_get_bit(&policydb->permissive_map, scontext->type))
   1198		avd->flags |= AVD_FLAGS_PERMISSIVE;
   1199
   1200	tcontext = sidtab_search(sidtab, tsid);
   1201	if (!tcontext) {
   1202		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1203		       __func__, tsid);
   1204		goto out;
   1205	}
   1206
   1207	if (unlikely(!tclass)) {
   1208		if (policydb->allow_unknown)
   1209			goto allow;
   1210		goto out;
   1211	}
   1212
   1213	context_struct_compute_av(policydb, scontext, tcontext, tclass, avd,
   1214				  NULL);
   1215 out:
   1216	rcu_read_unlock();
   1217	return;
   1218allow:
   1219	avd->allowed = 0xffffffff;
   1220	goto out;
   1221}
   1222
   1223/*
   1224 * Write the security context string representation of
   1225 * the context structure `context' into a dynamically
   1226 * allocated string of the correct size.  Set `*scontext'
   1227 * to point to this string and set `*scontext_len' to
   1228 * the length of the string.
   1229 */
   1230static int context_struct_to_string(struct policydb *p,
   1231				    struct context *context,
   1232				    char **scontext, u32 *scontext_len)
   1233{
   1234	char *scontextp;
   1235
   1236	if (scontext)
   1237		*scontext = NULL;
   1238	*scontext_len = 0;
   1239
   1240	if (context->len) {
   1241		*scontext_len = context->len;
   1242		if (scontext) {
   1243			*scontext = kstrdup(context->str, GFP_ATOMIC);
   1244			if (!(*scontext))
   1245				return -ENOMEM;
   1246		}
   1247		return 0;
   1248	}
   1249
   1250	/* Compute the size of the context. */
   1251	*scontext_len += strlen(sym_name(p, SYM_USERS, context->user - 1)) + 1;
   1252	*scontext_len += strlen(sym_name(p, SYM_ROLES, context->role - 1)) + 1;
   1253	*scontext_len += strlen(sym_name(p, SYM_TYPES, context->type - 1)) + 1;
   1254	*scontext_len += mls_compute_context_len(p, context);
   1255
   1256	if (!scontext)
   1257		return 0;
   1258
   1259	/* Allocate space for the context; caller must free this space. */
   1260	scontextp = kmalloc(*scontext_len, GFP_ATOMIC);
   1261	if (!scontextp)
   1262		return -ENOMEM;
   1263	*scontext = scontextp;
   1264
   1265	/*
   1266	 * Copy the user name, role name and type name into the context.
   1267	 */
   1268	scontextp += sprintf(scontextp, "%s:%s:%s",
   1269		sym_name(p, SYM_USERS, context->user - 1),
   1270		sym_name(p, SYM_ROLES, context->role - 1),
   1271		sym_name(p, SYM_TYPES, context->type - 1));
   1272
   1273	mls_sid_to_context(p, context, &scontextp);
   1274
   1275	*scontextp = 0;
   1276
   1277	return 0;
   1278}
   1279
   1280static int sidtab_entry_to_string(struct policydb *p,
   1281				  struct sidtab *sidtab,
   1282				  struct sidtab_entry *entry,
   1283				  char **scontext, u32 *scontext_len)
   1284{
   1285	int rc = sidtab_sid2str_get(sidtab, entry, scontext, scontext_len);
   1286
   1287	if (rc != -ENOENT)
   1288		return rc;
   1289
   1290	rc = context_struct_to_string(p, &entry->context, scontext,
   1291				      scontext_len);
   1292	if (!rc && scontext)
   1293		sidtab_sid2str_put(sidtab, entry, *scontext, *scontext_len);
   1294	return rc;
   1295}
   1296
   1297#include "initial_sid_to_string.h"
   1298
   1299int security_sidtab_hash_stats(struct selinux_state *state, char *page)
   1300{
   1301	struct selinux_policy *policy;
   1302	int rc;
   1303
   1304	if (!selinux_initialized(state)) {
   1305		pr_err("SELinux: %s:  called before initial load_policy\n",
   1306		       __func__);
   1307		return -EINVAL;
   1308	}
   1309
   1310	rcu_read_lock();
   1311	policy = rcu_dereference(state->policy);
   1312	rc = sidtab_hash_stats(policy->sidtab, page);
   1313	rcu_read_unlock();
   1314
   1315	return rc;
   1316}
   1317
   1318const char *security_get_initial_sid_context(u32 sid)
   1319{
   1320	if (unlikely(sid > SECINITSID_NUM))
   1321		return NULL;
   1322	return initial_sid_to_string[sid];
   1323}
   1324
   1325static int security_sid_to_context_core(struct selinux_state *state,
   1326					u32 sid, char **scontext,
   1327					u32 *scontext_len, int force,
   1328					int only_invalid)
   1329{
   1330	struct selinux_policy *policy;
   1331	struct policydb *policydb;
   1332	struct sidtab *sidtab;
   1333	struct sidtab_entry *entry;
   1334	int rc = 0;
   1335
   1336	if (scontext)
   1337		*scontext = NULL;
   1338	*scontext_len  = 0;
   1339
   1340	if (!selinux_initialized(state)) {
   1341		if (sid <= SECINITSID_NUM) {
   1342			char *scontextp;
   1343			const char *s = initial_sid_to_string[sid];
   1344
   1345			if (!s)
   1346				return -EINVAL;
   1347			*scontext_len = strlen(s) + 1;
   1348			if (!scontext)
   1349				return 0;
   1350			scontextp = kmemdup(s, *scontext_len, GFP_ATOMIC);
   1351			if (!scontextp)
   1352				return -ENOMEM;
   1353			*scontext = scontextp;
   1354			return 0;
   1355		}
   1356		pr_err("SELinux: %s:  called before initial "
   1357		       "load_policy on unknown SID %d\n", __func__, sid);
   1358		return -EINVAL;
   1359	}
   1360	rcu_read_lock();
   1361	policy = rcu_dereference(state->policy);
   1362	policydb = &policy->policydb;
   1363	sidtab = policy->sidtab;
   1364
   1365	if (force)
   1366		entry = sidtab_search_entry_force(sidtab, sid);
   1367	else
   1368		entry = sidtab_search_entry(sidtab, sid);
   1369	if (!entry) {
   1370		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1371			__func__, sid);
   1372		rc = -EINVAL;
   1373		goto out_unlock;
   1374	}
   1375	if (only_invalid && !entry->context.len)
   1376		goto out_unlock;
   1377
   1378	rc = sidtab_entry_to_string(policydb, sidtab, entry, scontext,
   1379				    scontext_len);
   1380
   1381out_unlock:
   1382	rcu_read_unlock();
   1383	return rc;
   1384
   1385}
   1386
   1387/**
   1388 * security_sid_to_context - Obtain a context for a given SID.
   1389 * @state: SELinux state
   1390 * @sid: security identifier, SID
   1391 * @scontext: security context
   1392 * @scontext_len: length in bytes
   1393 *
   1394 * Write the string representation of the context associated with @sid
   1395 * into a dynamically allocated string of the correct size.  Set @scontext
   1396 * to point to this string and set @scontext_len to the length of the string.
   1397 */
   1398int security_sid_to_context(struct selinux_state *state,
   1399			    u32 sid, char **scontext, u32 *scontext_len)
   1400{
   1401	return security_sid_to_context_core(state, sid, scontext,
   1402					    scontext_len, 0, 0);
   1403}
   1404
   1405int security_sid_to_context_force(struct selinux_state *state, u32 sid,
   1406				  char **scontext, u32 *scontext_len)
   1407{
   1408	return security_sid_to_context_core(state, sid, scontext,
   1409					    scontext_len, 1, 0);
   1410}
   1411
   1412/**
   1413 * security_sid_to_context_inval - Obtain a context for a given SID if it
   1414 *                                 is invalid.
   1415 * @state: SELinux state
   1416 * @sid: security identifier, SID
   1417 * @scontext: security context
   1418 * @scontext_len: length in bytes
   1419 *
   1420 * Write the string representation of the context associated with @sid
   1421 * into a dynamically allocated string of the correct size, but only if the
   1422 * context is invalid in the current policy.  Set @scontext to point to
   1423 * this string (or NULL if the context is valid) and set @scontext_len to
   1424 * the length of the string (or 0 if the context is valid).
   1425 */
   1426int security_sid_to_context_inval(struct selinux_state *state, u32 sid,
   1427				  char **scontext, u32 *scontext_len)
   1428{
   1429	return security_sid_to_context_core(state, sid, scontext,
   1430					    scontext_len, 1, 1);
   1431}
   1432
   1433/*
   1434 * Caveat:  Mutates scontext.
   1435 */
   1436static int string_to_context_struct(struct policydb *pol,
   1437				    struct sidtab *sidtabp,
   1438				    char *scontext,
   1439				    struct context *ctx,
   1440				    u32 def_sid)
   1441{
   1442	struct role_datum *role;
   1443	struct type_datum *typdatum;
   1444	struct user_datum *usrdatum;
   1445	char *scontextp, *p, oldc;
   1446	int rc = 0;
   1447
   1448	context_init(ctx);
   1449
   1450	/* Parse the security context. */
   1451
   1452	rc = -EINVAL;
   1453	scontextp = scontext;
   1454
   1455	/* Extract the user. */
   1456	p = scontextp;
   1457	while (*p && *p != ':')
   1458		p++;
   1459
   1460	if (*p == 0)
   1461		goto out;
   1462
   1463	*p++ = 0;
   1464
   1465	usrdatum = symtab_search(&pol->p_users, scontextp);
   1466	if (!usrdatum)
   1467		goto out;
   1468
   1469	ctx->user = usrdatum->value;
   1470
   1471	/* Extract role. */
   1472	scontextp = p;
   1473	while (*p && *p != ':')
   1474		p++;
   1475
   1476	if (*p == 0)
   1477		goto out;
   1478
   1479	*p++ = 0;
   1480
   1481	role = symtab_search(&pol->p_roles, scontextp);
   1482	if (!role)
   1483		goto out;
   1484	ctx->role = role->value;
   1485
   1486	/* Extract type. */
   1487	scontextp = p;
   1488	while (*p && *p != ':')
   1489		p++;
   1490	oldc = *p;
   1491	*p++ = 0;
   1492
   1493	typdatum = symtab_search(&pol->p_types, scontextp);
   1494	if (!typdatum || typdatum->attribute)
   1495		goto out;
   1496
   1497	ctx->type = typdatum->value;
   1498
   1499	rc = mls_context_to_sid(pol, oldc, p, ctx, sidtabp, def_sid);
   1500	if (rc)
   1501		goto out;
   1502
   1503	/* Check the validity of the new context. */
   1504	rc = -EINVAL;
   1505	if (!policydb_context_isvalid(pol, ctx))
   1506		goto out;
   1507	rc = 0;
   1508out:
   1509	if (rc)
   1510		context_destroy(ctx);
   1511	return rc;
   1512}
   1513
   1514static int security_context_to_sid_core(struct selinux_state *state,
   1515					const char *scontext, u32 scontext_len,
   1516					u32 *sid, u32 def_sid, gfp_t gfp_flags,
   1517					int force)
   1518{
   1519	struct selinux_policy *policy;
   1520	struct policydb *policydb;
   1521	struct sidtab *sidtab;
   1522	char *scontext2, *str = NULL;
   1523	struct context context;
   1524	int rc = 0;
   1525
   1526	/* An empty security context is never valid. */
   1527	if (!scontext_len)
   1528		return -EINVAL;
   1529
   1530	/* Copy the string to allow changes and ensure a NUL terminator */
   1531	scontext2 = kmemdup_nul(scontext, scontext_len, gfp_flags);
   1532	if (!scontext2)
   1533		return -ENOMEM;
   1534
   1535	if (!selinux_initialized(state)) {
   1536		int i;
   1537
   1538		for (i = 1; i < SECINITSID_NUM; i++) {
   1539			const char *s = initial_sid_to_string[i];
   1540
   1541			if (s && !strcmp(s, scontext2)) {
   1542				*sid = i;
   1543				goto out;
   1544			}
   1545		}
   1546		*sid = SECINITSID_KERNEL;
   1547		goto out;
   1548	}
   1549	*sid = SECSID_NULL;
   1550
   1551	if (force) {
   1552		/* Save another copy for storing in uninterpreted form */
   1553		rc = -ENOMEM;
   1554		str = kstrdup(scontext2, gfp_flags);
   1555		if (!str)
   1556			goto out;
   1557	}
   1558retry:
   1559	rcu_read_lock();
   1560	policy = rcu_dereference(state->policy);
   1561	policydb = &policy->policydb;
   1562	sidtab = policy->sidtab;
   1563	rc = string_to_context_struct(policydb, sidtab, scontext2,
   1564				      &context, def_sid);
   1565	if (rc == -EINVAL && force) {
   1566		context.str = str;
   1567		context.len = strlen(str) + 1;
   1568		str = NULL;
   1569	} else if (rc)
   1570		goto out_unlock;
   1571	rc = sidtab_context_to_sid(sidtab, &context, sid);
   1572	if (rc == -ESTALE) {
   1573		rcu_read_unlock();
   1574		if (context.str) {
   1575			str = context.str;
   1576			context.str = NULL;
   1577		}
   1578		context_destroy(&context);
   1579		goto retry;
   1580	}
   1581	context_destroy(&context);
   1582out_unlock:
   1583	rcu_read_unlock();
   1584out:
   1585	kfree(scontext2);
   1586	kfree(str);
   1587	return rc;
   1588}
   1589
   1590/**
   1591 * security_context_to_sid - Obtain a SID for a given security context.
   1592 * @state: SELinux state
   1593 * @scontext: security context
   1594 * @scontext_len: length in bytes
   1595 * @sid: security identifier, SID
   1596 * @gfp: context for the allocation
   1597 *
   1598 * Obtains a SID associated with the security context that
   1599 * has the string representation specified by @scontext.
   1600 * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
   1601 * memory is available, or 0 on success.
   1602 */
   1603int security_context_to_sid(struct selinux_state *state,
   1604			    const char *scontext, u32 scontext_len, u32 *sid,
   1605			    gfp_t gfp)
   1606{
   1607	return security_context_to_sid_core(state, scontext, scontext_len,
   1608					    sid, SECSID_NULL, gfp, 0);
   1609}
   1610
   1611int security_context_str_to_sid(struct selinux_state *state,
   1612				const char *scontext, u32 *sid, gfp_t gfp)
   1613{
   1614	return security_context_to_sid(state, scontext, strlen(scontext),
   1615				       sid, gfp);
   1616}
   1617
   1618/**
   1619 * security_context_to_sid_default - Obtain a SID for a given security context,
   1620 * falling back to specified default if needed.
   1621 *
   1622 * @state: SELinux state
   1623 * @scontext: security context
   1624 * @scontext_len: length in bytes
   1625 * @sid: security identifier, SID
   1626 * @def_sid: default SID to assign on error
   1627 * @gfp_flags: the allocator get-free-page (GFP) flags
   1628 *
   1629 * Obtains a SID associated with the security context that
   1630 * has the string representation specified by @scontext.
   1631 * The default SID is passed to the MLS layer to be used to allow
   1632 * kernel labeling of the MLS field if the MLS field is not present
   1633 * (for upgrading to MLS without full relabel).
   1634 * Implicitly forces adding of the context even if it cannot be mapped yet.
   1635 * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
   1636 * memory is available, or 0 on success.
   1637 */
   1638int security_context_to_sid_default(struct selinux_state *state,
   1639				    const char *scontext, u32 scontext_len,
   1640				    u32 *sid, u32 def_sid, gfp_t gfp_flags)
   1641{
   1642	return security_context_to_sid_core(state, scontext, scontext_len,
   1643					    sid, def_sid, gfp_flags, 1);
   1644}
   1645
   1646int security_context_to_sid_force(struct selinux_state *state,
   1647				  const char *scontext, u32 scontext_len,
   1648				  u32 *sid)
   1649{
   1650	return security_context_to_sid_core(state, scontext, scontext_len,
   1651					    sid, SECSID_NULL, GFP_KERNEL, 1);
   1652}
   1653
   1654static int compute_sid_handle_invalid_context(
   1655	struct selinux_state *state,
   1656	struct selinux_policy *policy,
   1657	struct sidtab_entry *sentry,
   1658	struct sidtab_entry *tentry,
   1659	u16 tclass,
   1660	struct context *newcontext)
   1661{
   1662	struct policydb *policydb = &policy->policydb;
   1663	struct sidtab *sidtab = policy->sidtab;
   1664	char *s = NULL, *t = NULL, *n = NULL;
   1665	u32 slen, tlen, nlen;
   1666	struct audit_buffer *ab;
   1667
   1668	if (sidtab_entry_to_string(policydb, sidtab, sentry, &s, &slen))
   1669		goto out;
   1670	if (sidtab_entry_to_string(policydb, sidtab, tentry, &t, &tlen))
   1671		goto out;
   1672	if (context_struct_to_string(policydb, newcontext, &n, &nlen))
   1673		goto out;
   1674	ab = audit_log_start(audit_context(), GFP_ATOMIC, AUDIT_SELINUX_ERR);
   1675	if (!ab)
   1676		goto out;
   1677	audit_log_format(ab,
   1678			 "op=security_compute_sid invalid_context=");
   1679	/* no need to record the NUL with untrusted strings */
   1680	audit_log_n_untrustedstring(ab, n, nlen - 1);
   1681	audit_log_format(ab, " scontext=%s tcontext=%s tclass=%s",
   1682			 s, t, sym_name(policydb, SYM_CLASSES, tclass-1));
   1683	audit_log_end(ab);
   1684out:
   1685	kfree(s);
   1686	kfree(t);
   1687	kfree(n);
   1688	if (!enforcing_enabled(state))
   1689		return 0;
   1690	return -EACCES;
   1691}
   1692
   1693static void filename_compute_type(struct policydb *policydb,
   1694				  struct context *newcontext,
   1695				  u32 stype, u32 ttype, u16 tclass,
   1696				  const char *objname)
   1697{
   1698	struct filename_trans_key ft;
   1699	struct filename_trans_datum *datum;
   1700
   1701	/*
   1702	 * Most filename trans rules are going to live in specific directories
   1703	 * like /dev or /var/run.  This bitmap will quickly skip rule searches
   1704	 * if the ttype does not contain any rules.
   1705	 */
   1706	if (!ebitmap_get_bit(&policydb->filename_trans_ttypes, ttype))
   1707		return;
   1708
   1709	ft.ttype = ttype;
   1710	ft.tclass = tclass;
   1711	ft.name = objname;
   1712
   1713	datum = policydb_filenametr_search(policydb, &ft);
   1714	while (datum) {
   1715		if (ebitmap_get_bit(&datum->stypes, stype - 1)) {
   1716			newcontext->type = datum->otype;
   1717			return;
   1718		}
   1719		datum = datum->next;
   1720	}
   1721}
   1722
   1723static int security_compute_sid(struct selinux_state *state,
   1724				u32 ssid,
   1725				u32 tsid,
   1726				u16 orig_tclass,
   1727				u32 specified,
   1728				const char *objname,
   1729				u32 *out_sid,
   1730				bool kern)
   1731{
   1732	struct selinux_policy *policy;
   1733	struct policydb *policydb;
   1734	struct sidtab *sidtab;
   1735	struct class_datum *cladatum;
   1736	struct context *scontext, *tcontext, newcontext;
   1737	struct sidtab_entry *sentry, *tentry;
   1738	struct avtab_key avkey;
   1739	struct avtab_datum *avdatum;
   1740	struct avtab_node *node;
   1741	u16 tclass;
   1742	int rc = 0;
   1743	bool sock;
   1744
   1745	if (!selinux_initialized(state)) {
   1746		switch (orig_tclass) {
   1747		case SECCLASS_PROCESS: /* kernel value */
   1748			*out_sid = ssid;
   1749			break;
   1750		default:
   1751			*out_sid = tsid;
   1752			break;
   1753		}
   1754		goto out;
   1755	}
   1756
   1757retry:
   1758	cladatum = NULL;
   1759	context_init(&newcontext);
   1760
   1761	rcu_read_lock();
   1762
   1763	policy = rcu_dereference(state->policy);
   1764
   1765	if (kern) {
   1766		tclass = unmap_class(&policy->map, orig_tclass);
   1767		sock = security_is_socket_class(orig_tclass);
   1768	} else {
   1769		tclass = orig_tclass;
   1770		sock = security_is_socket_class(map_class(&policy->map,
   1771							  tclass));
   1772	}
   1773
   1774	policydb = &policy->policydb;
   1775	sidtab = policy->sidtab;
   1776
   1777	sentry = sidtab_search_entry(sidtab, ssid);
   1778	if (!sentry) {
   1779		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1780		       __func__, ssid);
   1781		rc = -EINVAL;
   1782		goto out_unlock;
   1783	}
   1784	tentry = sidtab_search_entry(sidtab, tsid);
   1785	if (!tentry) {
   1786		pr_err("SELinux: %s:  unrecognized SID %d\n",
   1787		       __func__, tsid);
   1788		rc = -EINVAL;
   1789		goto out_unlock;
   1790	}
   1791
   1792	scontext = &sentry->context;
   1793	tcontext = &tentry->context;
   1794
   1795	if (tclass && tclass <= policydb->p_classes.nprim)
   1796		cladatum = policydb->class_val_to_struct[tclass - 1];
   1797
   1798	/* Set the user identity. */
   1799	switch (specified) {
   1800	case AVTAB_TRANSITION:
   1801	case AVTAB_CHANGE:
   1802		if (cladatum && cladatum->default_user == DEFAULT_TARGET) {
   1803			newcontext.user = tcontext->user;
   1804		} else {
   1805			/* notice this gets both DEFAULT_SOURCE and unset */
   1806			/* Use the process user identity. */
   1807			newcontext.user = scontext->user;
   1808		}
   1809		break;
   1810	case AVTAB_MEMBER:
   1811		/* Use the related object owner. */
   1812		newcontext.user = tcontext->user;
   1813		break;
   1814	}
   1815
   1816	/* Set the role to default values. */
   1817	if (cladatum && cladatum->default_role == DEFAULT_SOURCE) {
   1818		newcontext.role = scontext->role;
   1819	} else if (cladatum && cladatum->default_role == DEFAULT_TARGET) {
   1820		newcontext.role = tcontext->role;
   1821	} else {
   1822		if ((tclass == policydb->process_class) || sock)
   1823			newcontext.role = scontext->role;
   1824		else
   1825			newcontext.role = OBJECT_R_VAL;
   1826	}
   1827
   1828	/* Set the type to default values. */
   1829	if (cladatum && cladatum->default_type == DEFAULT_SOURCE) {
   1830		newcontext.type = scontext->type;
   1831	} else if (cladatum && cladatum->default_type == DEFAULT_TARGET) {
   1832		newcontext.type = tcontext->type;
   1833	} else {
   1834		if ((tclass == policydb->process_class) || sock) {
   1835			/* Use the type of process. */
   1836			newcontext.type = scontext->type;
   1837		} else {
   1838			/* Use the type of the related object. */
   1839			newcontext.type = tcontext->type;
   1840		}
   1841	}
   1842
   1843	/* Look for a type transition/member/change rule. */
   1844	avkey.source_type = scontext->type;
   1845	avkey.target_type = tcontext->type;
   1846	avkey.target_class = tclass;
   1847	avkey.specified = specified;
   1848	avdatum = avtab_search(&policydb->te_avtab, &avkey);
   1849
   1850	/* If no permanent rule, also check for enabled conditional rules */
   1851	if (!avdatum) {
   1852		node = avtab_search_node(&policydb->te_cond_avtab, &avkey);
   1853		for (; node; node = avtab_search_node_next(node, specified)) {
   1854			if (node->key.specified & AVTAB_ENABLED) {
   1855				avdatum = &node->datum;
   1856				break;
   1857			}
   1858		}
   1859	}
   1860
   1861	if (avdatum) {
   1862		/* Use the type from the type transition/member/change rule. */
   1863		newcontext.type = avdatum->u.data;
   1864	}
   1865
   1866	/* if we have a objname this is a file trans check so check those rules */
   1867	if (objname)
   1868		filename_compute_type(policydb, &newcontext, scontext->type,
   1869				      tcontext->type, tclass, objname);
   1870
   1871	/* Check for class-specific changes. */
   1872	if (specified & AVTAB_TRANSITION) {
   1873		/* Look for a role transition rule. */
   1874		struct role_trans_datum *rtd;
   1875		struct role_trans_key rtk = {
   1876			.role = scontext->role,
   1877			.type = tcontext->type,
   1878			.tclass = tclass,
   1879		};
   1880
   1881		rtd = policydb_roletr_search(policydb, &rtk);
   1882		if (rtd)
   1883			newcontext.role = rtd->new_role;
   1884	}
   1885
   1886	/* Set the MLS attributes.
   1887	   This is done last because it may allocate memory. */
   1888	rc = mls_compute_sid(policydb, scontext, tcontext, tclass, specified,
   1889			     &newcontext, sock);
   1890	if (rc)
   1891		goto out_unlock;
   1892
   1893	/* Check the validity of the context. */
   1894	if (!policydb_context_isvalid(policydb, &newcontext)) {
   1895		rc = compute_sid_handle_invalid_context(state, policy, sentry,
   1896							tentry, tclass,
   1897							&newcontext);
   1898		if (rc)
   1899			goto out_unlock;
   1900	}
   1901	/* Obtain the sid for the context. */
   1902	rc = sidtab_context_to_sid(sidtab, &newcontext, out_sid);
   1903	if (rc == -ESTALE) {
   1904		rcu_read_unlock();
   1905		context_destroy(&newcontext);
   1906		goto retry;
   1907	}
   1908out_unlock:
   1909	rcu_read_unlock();
   1910	context_destroy(&newcontext);
   1911out:
   1912	return rc;
   1913}
   1914
   1915/**
   1916 * security_transition_sid - Compute the SID for a new subject/object.
   1917 * @state: SELinux state
   1918 * @ssid: source security identifier
   1919 * @tsid: target security identifier
   1920 * @tclass: target security class
   1921 * @qstr: object name
   1922 * @out_sid: security identifier for new subject/object
   1923 *
   1924 * Compute a SID to use for labeling a new subject or object in the
   1925 * class @tclass based on a SID pair (@ssid, @tsid).
   1926 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
   1927 * if insufficient memory is available, or %0 if the new SID was
   1928 * computed successfully.
   1929 */
   1930int security_transition_sid(struct selinux_state *state,
   1931			    u32 ssid, u32 tsid, u16 tclass,
   1932			    const struct qstr *qstr, u32 *out_sid)
   1933{
   1934	return security_compute_sid(state, ssid, tsid, tclass,
   1935				    AVTAB_TRANSITION,
   1936				    qstr ? qstr->name : NULL, out_sid, true);
   1937}
   1938
   1939int security_transition_sid_user(struct selinux_state *state,
   1940				 u32 ssid, u32 tsid, u16 tclass,
   1941				 const char *objname, u32 *out_sid)
   1942{
   1943	return security_compute_sid(state, ssid, tsid, tclass,
   1944				    AVTAB_TRANSITION,
   1945				    objname, out_sid, false);
   1946}
   1947
   1948/**
   1949 * security_member_sid - Compute the SID for member selection.
   1950 * @state: SELinux state
   1951 * @ssid: source security identifier
   1952 * @tsid: target security identifier
   1953 * @tclass: target security class
   1954 * @out_sid: security identifier for selected member
   1955 *
   1956 * Compute a SID to use when selecting a member of a polyinstantiated
   1957 * object of class @tclass based on a SID pair (@ssid, @tsid).
   1958 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
   1959 * if insufficient memory is available, or %0 if the SID was
   1960 * computed successfully.
   1961 */
   1962int security_member_sid(struct selinux_state *state,
   1963			u32 ssid,
   1964			u32 tsid,
   1965			u16 tclass,
   1966			u32 *out_sid)
   1967{
   1968	return security_compute_sid(state, ssid, tsid, tclass,
   1969				    AVTAB_MEMBER, NULL,
   1970				    out_sid, false);
   1971}
   1972
   1973/**
   1974 * security_change_sid - Compute the SID for object relabeling.
   1975 * @state: SELinux state
   1976 * @ssid: source security identifier
   1977 * @tsid: target security identifier
   1978 * @tclass: target security class
   1979 * @out_sid: security identifier for selected member
   1980 *
   1981 * Compute a SID to use for relabeling an object of class @tclass
   1982 * based on a SID pair (@ssid, @tsid).
   1983 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
   1984 * if insufficient memory is available, or %0 if the SID was
   1985 * computed successfully.
   1986 */
   1987int security_change_sid(struct selinux_state *state,
   1988			u32 ssid,
   1989			u32 tsid,
   1990			u16 tclass,
   1991			u32 *out_sid)
   1992{
   1993	return security_compute_sid(state,
   1994				    ssid, tsid, tclass, AVTAB_CHANGE, NULL,
   1995				    out_sid, false);
   1996}
   1997
   1998static inline int convert_context_handle_invalid_context(
   1999	struct selinux_state *state,
   2000	struct policydb *policydb,
   2001	struct context *context)
   2002{
   2003	char *s;
   2004	u32 len;
   2005
   2006	if (enforcing_enabled(state))
   2007		return -EINVAL;
   2008
   2009	if (!context_struct_to_string(policydb, context, &s, &len)) {
   2010		pr_warn("SELinux:  Context %s would be invalid if enforcing\n",
   2011			s);
   2012		kfree(s);
   2013	}
   2014	return 0;
   2015}
   2016
   2017/*
   2018 * Convert the values in the security context
   2019 * structure `oldc' from the values specified
   2020 * in the policy `p->oldp' to the values specified
   2021 * in the policy `p->newp', storing the new context
   2022 * in `newc'.  Verify that the context is valid
   2023 * under the new policy.
   2024 */
   2025static int convert_context(struct context *oldc, struct context *newc, void *p)
   2026{
   2027	struct convert_context_args *args;
   2028	struct ocontext *oc;
   2029	struct role_datum *role;
   2030	struct type_datum *typdatum;
   2031	struct user_datum *usrdatum;
   2032	char *s;
   2033	u32 len;
   2034	int rc;
   2035
   2036	args = p;
   2037
   2038	if (oldc->str) {
   2039		s = kstrdup(oldc->str, GFP_KERNEL);
   2040		if (!s)
   2041			return -ENOMEM;
   2042
   2043		rc = string_to_context_struct(args->newp, NULL, s,
   2044					      newc, SECSID_NULL);
   2045		if (rc == -EINVAL) {
   2046			/*
   2047			 * Retain string representation for later mapping.
   2048			 *
   2049			 * IMPORTANT: We need to copy the contents of oldc->str
   2050			 * back into s again because string_to_context_struct()
   2051			 * may have garbled it.
   2052			 */
   2053			memcpy(s, oldc->str, oldc->len);
   2054			context_init(newc);
   2055			newc->str = s;
   2056			newc->len = oldc->len;
   2057			return 0;
   2058		}
   2059		kfree(s);
   2060		if (rc) {
   2061			/* Other error condition, e.g. ENOMEM. */
   2062			pr_err("SELinux:   Unable to map context %s, rc = %d.\n",
   2063			       oldc->str, -rc);
   2064			return rc;
   2065		}
   2066		pr_info("SELinux:  Context %s became valid (mapped).\n",
   2067			oldc->str);
   2068		return 0;
   2069	}
   2070
   2071	context_init(newc);
   2072
   2073	/* Convert the user. */
   2074	usrdatum = symtab_search(&args->newp->p_users,
   2075				 sym_name(args->oldp,
   2076					  SYM_USERS, oldc->user - 1));
   2077	if (!usrdatum)
   2078		goto bad;
   2079	newc->user = usrdatum->value;
   2080
   2081	/* Convert the role. */
   2082	role = symtab_search(&args->newp->p_roles,
   2083			     sym_name(args->oldp, SYM_ROLES, oldc->role - 1));
   2084	if (!role)
   2085		goto bad;
   2086	newc->role = role->value;
   2087
   2088	/* Convert the type. */
   2089	typdatum = symtab_search(&args->newp->p_types,
   2090				 sym_name(args->oldp,
   2091					  SYM_TYPES, oldc->type - 1));
   2092	if (!typdatum)
   2093		goto bad;
   2094	newc->type = typdatum->value;
   2095
   2096	/* Convert the MLS fields if dealing with MLS policies */
   2097	if (args->oldp->mls_enabled && args->newp->mls_enabled) {
   2098		rc = mls_convert_context(args->oldp, args->newp, oldc, newc);
   2099		if (rc)
   2100			goto bad;
   2101	} else if (!args->oldp->mls_enabled && args->newp->mls_enabled) {
   2102		/*
   2103		 * Switching between non-MLS and MLS policy:
   2104		 * ensure that the MLS fields of the context for all
   2105		 * existing entries in the sidtab are filled in with a
   2106		 * suitable default value, likely taken from one of the
   2107		 * initial SIDs.
   2108		 */
   2109		oc = args->newp->ocontexts[OCON_ISID];
   2110		while (oc && oc->sid[0] != SECINITSID_UNLABELED)
   2111			oc = oc->next;
   2112		if (!oc) {
   2113			pr_err("SELinux:  unable to look up"
   2114				" the initial SIDs list\n");
   2115			goto bad;
   2116		}
   2117		rc = mls_range_set(newc, &oc->context[0].range);
   2118		if (rc)
   2119			goto bad;
   2120	}
   2121
   2122	/* Check the validity of the new context. */
   2123	if (!policydb_context_isvalid(args->newp, newc)) {
   2124		rc = convert_context_handle_invalid_context(args->state,
   2125							args->oldp,
   2126							oldc);
   2127		if (rc)
   2128			goto bad;
   2129	}
   2130
   2131	return 0;
   2132bad:
   2133	/* Map old representation to string and save it. */
   2134	rc = context_struct_to_string(args->oldp, oldc, &s, &len);
   2135	if (rc)
   2136		return rc;
   2137	context_destroy(newc);
   2138	newc->str = s;
   2139	newc->len = len;
   2140	pr_info("SELinux:  Context %s became invalid (unmapped).\n",
   2141		newc->str);
   2142	return 0;
   2143}
   2144
   2145static void security_load_policycaps(struct selinux_state *state,
   2146				struct selinux_policy *policy)
   2147{
   2148	struct policydb *p;
   2149	unsigned int i;
   2150	struct ebitmap_node *node;
   2151
   2152	p = &policy->policydb;
   2153
   2154	for (i = 0; i < ARRAY_SIZE(state->policycap); i++)
   2155		WRITE_ONCE(state->policycap[i],
   2156			ebitmap_get_bit(&p->policycaps, i));
   2157
   2158	for (i = 0; i < ARRAY_SIZE(selinux_policycap_names); i++)
   2159		pr_info("SELinux:  policy capability %s=%d\n",
   2160			selinux_policycap_names[i],
   2161			ebitmap_get_bit(&p->policycaps, i));
   2162
   2163	ebitmap_for_each_positive_bit(&p->policycaps, node, i) {
   2164		if (i >= ARRAY_SIZE(selinux_policycap_names))
   2165			pr_info("SELinux:  unknown policy capability %u\n",
   2166				i);
   2167	}
   2168}
   2169
   2170static int security_preserve_bools(struct selinux_policy *oldpolicy,
   2171				struct selinux_policy *newpolicy);
   2172
   2173static void selinux_policy_free(struct selinux_policy *policy)
   2174{
   2175	if (!policy)
   2176		return;
   2177
   2178	sidtab_destroy(policy->sidtab);
   2179	kfree(policy->map.mapping);
   2180	policydb_destroy(&policy->policydb);
   2181	kfree(policy->sidtab);
   2182	kfree(policy);
   2183}
   2184
   2185static void selinux_policy_cond_free(struct selinux_policy *policy)
   2186{
   2187	cond_policydb_destroy_dup(&policy->policydb);
   2188	kfree(policy);
   2189}
   2190
   2191void selinux_policy_cancel(struct selinux_state *state,
   2192			   struct selinux_load_state *load_state)
   2193{
   2194	struct selinux_policy *oldpolicy;
   2195
   2196	oldpolicy = rcu_dereference_protected(state->policy,
   2197					lockdep_is_held(&state->policy_mutex));
   2198
   2199	sidtab_cancel_convert(oldpolicy->sidtab);
   2200	selinux_policy_free(load_state->policy);
   2201	kfree(load_state->convert_data);
   2202}
   2203
   2204static void selinux_notify_policy_change(struct selinux_state *state,
   2205					u32 seqno)
   2206{
   2207	/* Flush external caches and notify userspace of policy load */
   2208	avc_ss_reset(state->avc, seqno);
   2209	selnl_notify_policyload(seqno);
   2210	selinux_status_update_policyload(state, seqno);
   2211	selinux_netlbl_cache_invalidate();
   2212	selinux_xfrm_notify_policyload();
   2213	selinux_ima_measure_state_locked(state);
   2214}
   2215
   2216void selinux_policy_commit(struct selinux_state *state,
   2217			   struct selinux_load_state *load_state)
   2218{
   2219	struct selinux_policy *oldpolicy, *newpolicy = load_state->policy;
   2220	unsigned long flags;
   2221	u32 seqno;
   2222
   2223	oldpolicy = rcu_dereference_protected(state->policy,
   2224					lockdep_is_held(&state->policy_mutex));
   2225
   2226	/* If switching between different policy types, log MLS status */
   2227	if (oldpolicy) {
   2228		if (oldpolicy->policydb.mls_enabled && !newpolicy->policydb.mls_enabled)
   2229			pr_info("SELinux: Disabling MLS support...\n");
   2230		else if (!oldpolicy->policydb.mls_enabled && newpolicy->policydb.mls_enabled)
   2231			pr_info("SELinux: Enabling MLS support...\n");
   2232	}
   2233
   2234	/* Set latest granting seqno for new policy. */
   2235	if (oldpolicy)
   2236		newpolicy->latest_granting = oldpolicy->latest_granting + 1;
   2237	else
   2238		newpolicy->latest_granting = 1;
   2239	seqno = newpolicy->latest_granting;
   2240
   2241	/* Install the new policy. */
   2242	if (oldpolicy) {
   2243		sidtab_freeze_begin(oldpolicy->sidtab, &flags);
   2244		rcu_assign_pointer(state->policy, newpolicy);
   2245		sidtab_freeze_end(oldpolicy->sidtab, &flags);
   2246	} else {
   2247		rcu_assign_pointer(state->policy, newpolicy);
   2248	}
   2249
   2250	/* Load the policycaps from the new policy */
   2251	security_load_policycaps(state, newpolicy);
   2252
   2253	if (!selinux_initialized(state)) {
   2254		/*
   2255		 * After first policy load, the security server is
   2256		 * marked as initialized and ready to handle requests and
   2257		 * any objects created prior to policy load are then labeled.
   2258		 */
   2259		selinux_mark_initialized(state);
   2260		selinux_complete_init();
   2261	}
   2262
   2263	/* Free the old policy */
   2264	synchronize_rcu();
   2265	selinux_policy_free(oldpolicy);
   2266	kfree(load_state->convert_data);
   2267
   2268	/* Notify others of the policy change */
   2269	selinux_notify_policy_change(state, seqno);
   2270}
   2271
   2272/**
   2273 * security_load_policy - Load a security policy configuration.
   2274 * @state: SELinux state
   2275 * @data: binary policy data
   2276 * @len: length of data in bytes
   2277 * @load_state: policy load state
   2278 *
   2279 * Load a new set of security policy configuration data,
   2280 * validate it and convert the SID table as necessary.
   2281 * This function will flush the access vector cache after
   2282 * loading the new policy.
   2283 */
   2284int security_load_policy(struct selinux_state *state, void *data, size_t len,
   2285			 struct selinux_load_state *load_state)
   2286{
   2287	struct selinux_policy *newpolicy, *oldpolicy;
   2288	struct selinux_policy_convert_data *convert_data;
   2289	int rc = 0;
   2290	struct policy_file file = { data, len }, *fp = &file;
   2291
   2292	newpolicy = kzalloc(sizeof(*newpolicy), GFP_KERNEL);
   2293	if (!newpolicy)
   2294		return -ENOMEM;
   2295
   2296	newpolicy->sidtab = kzalloc(sizeof(*newpolicy->sidtab), GFP_KERNEL);
   2297	if (!newpolicy->sidtab) {
   2298		rc = -ENOMEM;
   2299		goto err_policy;
   2300	}
   2301
   2302	rc = policydb_read(&newpolicy->policydb, fp);
   2303	if (rc)
   2304		goto err_sidtab;
   2305
   2306	newpolicy->policydb.len = len;
   2307	rc = selinux_set_mapping(&newpolicy->policydb, secclass_map,
   2308				&newpolicy->map);
   2309	if (rc)
   2310		goto err_policydb;
   2311
   2312	rc = policydb_load_isids(&newpolicy->policydb, newpolicy->sidtab);
   2313	if (rc) {
   2314		pr_err("SELinux:  unable to load the initial SIDs\n");
   2315		goto err_mapping;
   2316	}
   2317
   2318	if (!selinux_initialized(state)) {
   2319		/* First policy load, so no need to preserve state from old policy */
   2320		load_state->policy = newpolicy;
   2321		load_state->convert_data = NULL;
   2322		return 0;
   2323	}
   2324
   2325	oldpolicy = rcu_dereference_protected(state->policy,
   2326					lockdep_is_held(&state->policy_mutex));
   2327
   2328	/* Preserve active boolean values from the old policy */
   2329	rc = security_preserve_bools(oldpolicy, newpolicy);
   2330	if (rc) {
   2331		pr_err("SELinux:  unable to preserve booleans\n");
   2332		goto err_free_isids;
   2333	}
   2334
   2335	convert_data = kmalloc(sizeof(*convert_data), GFP_KERNEL);
   2336	if (!convert_data) {
   2337		rc = -ENOMEM;
   2338		goto err_free_isids;
   2339	}
   2340
   2341	/*
   2342	 * Convert the internal representations of contexts
   2343	 * in the new SID table.
   2344	 */
   2345	convert_data->args.state = state;
   2346	convert_data->args.oldp = &oldpolicy->policydb;
   2347	convert_data->args.newp = &newpolicy->policydb;
   2348
   2349	convert_data->sidtab_params.func = convert_context;
   2350	convert_data->sidtab_params.args = &convert_data->args;
   2351	convert_data->sidtab_params.target = newpolicy->sidtab;
   2352
   2353	rc = sidtab_convert(oldpolicy->sidtab, &convert_data->sidtab_params);
   2354	if (rc) {
   2355		pr_err("SELinux:  unable to convert the internal"
   2356			" representation of contexts in the new SID"
   2357			" table\n");
   2358		goto err_free_convert_data;
   2359	}
   2360
   2361	load_state->policy = newpolicy;
   2362	load_state->convert_data = convert_data;
   2363	return 0;
   2364
   2365err_free_convert_data:
   2366	kfree(convert_data);
   2367err_free_isids:
   2368	sidtab_destroy(newpolicy->sidtab);
   2369err_mapping:
   2370	kfree(newpolicy->map.mapping);
   2371err_policydb:
   2372	policydb_destroy(&newpolicy->policydb);
   2373err_sidtab:
   2374	kfree(newpolicy->sidtab);
   2375err_policy:
   2376	kfree(newpolicy);
   2377
   2378	return rc;
   2379}
   2380
   2381/**
   2382 * ocontext_to_sid - Helper to safely get sid for an ocontext
   2383 * @sidtab: SID table
   2384 * @c: ocontext structure
   2385 * @index: index of the context entry (0 or 1)
   2386 * @out_sid: pointer to the resulting SID value
   2387 *
   2388 * For all ocontexts except OCON_ISID the SID fields are populated
   2389 * on-demand when needed. Since updating the SID value is an SMP-sensitive
   2390 * operation, this helper must be used to do that safely.
   2391 *
   2392 * WARNING: This function may return -ESTALE, indicating that the caller
   2393 * must retry the operation after re-acquiring the policy pointer!
   2394 */
   2395static int ocontext_to_sid(struct sidtab *sidtab, struct ocontext *c,
   2396			   size_t index, u32 *out_sid)
   2397{
   2398	int rc;
   2399	u32 sid;
   2400
   2401	/* Ensure the associated sidtab entry is visible to this thread. */
   2402	sid = smp_load_acquire(&c->sid[index]);
   2403	if (!sid) {
   2404		rc = sidtab_context_to_sid(sidtab, &c->context[index], &sid);
   2405		if (rc)
   2406			return rc;
   2407
   2408		/*
   2409		 * Ensure the new sidtab entry is visible to other threads
   2410		 * when they see the SID.
   2411		 */
   2412		smp_store_release(&c->sid[index], sid);
   2413	}
   2414	*out_sid = sid;
   2415	return 0;
   2416}
   2417
   2418/**
   2419 * security_port_sid - Obtain the SID for a port.
   2420 * @state: SELinux state
   2421 * @protocol: protocol number
   2422 * @port: port number
   2423 * @out_sid: security identifier
   2424 */
   2425int security_port_sid(struct selinux_state *state,
   2426		      u8 protocol, u16 port, u32 *out_sid)
   2427{
   2428	struct selinux_policy *policy;
   2429	struct policydb *policydb;
   2430	struct sidtab *sidtab;
   2431	struct ocontext *c;
   2432	int rc;
   2433
   2434	if (!selinux_initialized(state)) {
   2435		*out_sid = SECINITSID_PORT;
   2436		return 0;
   2437	}
   2438
   2439retry:
   2440	rc = 0;
   2441	rcu_read_lock();
   2442	policy = rcu_dereference(state->policy);
   2443	policydb = &policy->policydb;
   2444	sidtab = policy->sidtab;
   2445
   2446	c = policydb->ocontexts[OCON_PORT];
   2447	while (c) {
   2448		if (c->u.port.protocol == protocol &&
   2449		    c->u.port.low_port <= port &&
   2450		    c->u.port.high_port >= port)
   2451			break;
   2452		c = c->next;
   2453	}
   2454
   2455	if (c) {
   2456		rc = ocontext_to_sid(sidtab, c, 0, out_sid);
   2457		if (rc == -ESTALE) {
   2458			rcu_read_unlock();
   2459			goto retry;
   2460		}
   2461		if (rc)
   2462			goto out;
   2463	} else {
   2464		*out_sid = SECINITSID_PORT;
   2465	}
   2466
   2467out:
   2468	rcu_read_unlock();
   2469	return rc;
   2470}
   2471
   2472/**
   2473 * security_ib_pkey_sid - Obtain the SID for a pkey.
   2474 * @state: SELinux state
   2475 * @subnet_prefix: Subnet Prefix
   2476 * @pkey_num: pkey number
   2477 * @out_sid: security identifier
   2478 */
   2479int security_ib_pkey_sid(struct selinux_state *state,
   2480			 u64 subnet_prefix, u16 pkey_num, u32 *out_sid)
   2481{
   2482	struct selinux_policy *policy;
   2483	struct policydb *policydb;
   2484	struct sidtab *sidtab;
   2485	struct ocontext *c;
   2486	int rc;
   2487
   2488	if (!selinux_initialized(state)) {
   2489		*out_sid = SECINITSID_UNLABELED;
   2490		return 0;
   2491	}
   2492
   2493retry:
   2494	rc = 0;
   2495	rcu_read_lock();
   2496	policy = rcu_dereference(state->policy);
   2497	policydb = &policy->policydb;
   2498	sidtab = policy->sidtab;
   2499
   2500	c = policydb->ocontexts[OCON_IBPKEY];
   2501	while (c) {
   2502		if (c->u.ibpkey.low_pkey <= pkey_num &&
   2503		    c->u.ibpkey.high_pkey >= pkey_num &&
   2504		    c->u.ibpkey.subnet_prefix == subnet_prefix)
   2505			break;
   2506
   2507		c = c->next;
   2508	}
   2509
   2510	if (c) {
   2511		rc = ocontext_to_sid(sidtab, c, 0, out_sid);
   2512		if (rc == -ESTALE) {
   2513			rcu_read_unlock();
   2514			goto retry;
   2515		}
   2516		if (rc)
   2517			goto out;
   2518	} else
   2519		*out_sid = SECINITSID_UNLABELED;
   2520
   2521out:
   2522	rcu_read_unlock();
   2523	return rc;
   2524}
   2525
   2526/**
   2527 * security_ib_endport_sid - Obtain the SID for a subnet management interface.
   2528 * @state: SELinux state
   2529 * @dev_name: device name
   2530 * @port_num: port number
   2531 * @out_sid: security identifier
   2532 */
   2533int security_ib_endport_sid(struct selinux_state *state,
   2534			    const char *dev_name, u8 port_num, u32 *out_sid)
   2535{
   2536	struct selinux_policy *policy;
   2537	struct policydb *policydb;
   2538	struct sidtab *sidtab;
   2539	struct ocontext *c;
   2540	int rc;
   2541
   2542	if (!selinux_initialized(state)) {
   2543		*out_sid = SECINITSID_UNLABELED;
   2544		return 0;
   2545	}
   2546
   2547retry:
   2548	rc = 0;
   2549	rcu_read_lock();
   2550	policy = rcu_dereference(state->policy);
   2551	policydb = &policy->policydb;
   2552	sidtab = policy->sidtab;
   2553
   2554	c = policydb->ocontexts[OCON_IBENDPORT];
   2555	while (c) {
   2556		if (c->u.ibendport.port == port_num &&
   2557		    !strncmp(c->u.ibendport.dev_name,
   2558			     dev_name,
   2559			     IB_DEVICE_NAME_MAX))
   2560			break;
   2561
   2562		c = c->next;
   2563	}
   2564
   2565	if (c) {
   2566		rc = ocontext_to_sid(sidtab, c, 0, out_sid);
   2567		if (rc == -ESTALE) {
   2568			rcu_read_unlock();
   2569			goto retry;
   2570		}
   2571		if (rc)
   2572			goto out;
   2573	} else
   2574		*out_sid = SECINITSID_UNLABELED;
   2575
   2576out:
   2577	rcu_read_unlock();
   2578	return rc;
   2579}
   2580
   2581/**
   2582 * security_netif_sid - Obtain the SID for a network interface.
   2583 * @state: SELinux state
   2584 * @name: interface name
   2585 * @if_sid: interface SID
   2586 */
   2587int security_netif_sid(struct selinux_state *state,
   2588		       char *name, u32 *if_sid)
   2589{
   2590	struct selinux_policy *policy;
   2591	struct policydb *policydb;
   2592	struct sidtab *sidtab;
   2593	int rc;
   2594	struct ocontext *c;
   2595
   2596	if (!selinux_initialized(state)) {
   2597		*if_sid = SECINITSID_NETIF;
   2598		return 0;
   2599	}
   2600
   2601retry:
   2602	rc = 0;
   2603	rcu_read_lock();
   2604	policy = rcu_dereference(state->policy);
   2605	policydb = &policy->policydb;
   2606	sidtab = policy->sidtab;
   2607
   2608	c = policydb->ocontexts[OCON_NETIF];
   2609	while (c) {
   2610		if (strcmp(name, c->u.name) == 0)
   2611			break;
   2612		c = c->next;
   2613	}
   2614
   2615	if (c) {
   2616		rc = ocontext_to_sid(sidtab, c, 0, if_sid);
   2617		if (rc == -ESTALE) {
   2618			rcu_read_unlock();
   2619			goto retry;
   2620		}
   2621		if (rc)
   2622			goto out;
   2623	} else
   2624		*if_sid = SECINITSID_NETIF;
   2625
   2626out:
   2627	rcu_read_unlock();
   2628	return rc;
   2629}
   2630
   2631static int match_ipv6_addrmask(u32 *input, u32 *addr, u32 *mask)
   2632{
   2633	int i, fail = 0;
   2634
   2635	for (i = 0; i < 4; i++)
   2636		if (addr[i] != (input[i] & mask[i])) {
   2637			fail = 1;
   2638			break;
   2639		}
   2640
   2641	return !fail;
   2642}
   2643
   2644/**
   2645 * security_node_sid - Obtain the SID for a node (host).
   2646 * @state: SELinux state
   2647 * @domain: communication domain aka address family
   2648 * @addrp: address
   2649 * @addrlen: address length in bytes
   2650 * @out_sid: security identifier
   2651 */
   2652int security_node_sid(struct selinux_state *state,
   2653		      u16 domain,
   2654		      void *addrp,
   2655		      u32 addrlen,
   2656		      u32 *out_sid)
   2657{
   2658	struct selinux_policy *policy;
   2659	struct policydb *policydb;
   2660	struct sidtab *sidtab;
   2661	int rc;
   2662	struct ocontext *c;
   2663
   2664	if (!selinux_initialized(state)) {
   2665		*out_sid = SECINITSID_NODE;
   2666		return 0;
   2667	}
   2668
   2669retry:
   2670	rcu_read_lock();
   2671	policy = rcu_dereference(state->policy);
   2672	policydb = &policy->policydb;
   2673	sidtab = policy->sidtab;
   2674
   2675	switch (domain) {
   2676	case AF_INET: {
   2677		u32 addr;
   2678
   2679		rc = -EINVAL;
   2680		if (addrlen != sizeof(u32))
   2681			goto out;
   2682
   2683		addr = *((u32 *)addrp);
   2684
   2685		c = policydb->ocontexts[OCON_NODE];
   2686		while (c) {
   2687			if (c->u.node.addr == (addr & c->u.node.mask))
   2688				break;
   2689			c = c->next;
   2690		}
   2691		break;
   2692	}
   2693
   2694	case AF_INET6:
   2695		rc = -EINVAL;
   2696		if (addrlen != sizeof(u64) * 2)
   2697			goto out;
   2698		c = policydb->ocontexts[OCON_NODE6];
   2699		while (c) {
   2700			if (match_ipv6_addrmask(addrp, c->u.node6.addr,
   2701						c->u.node6.mask))
   2702				break;
   2703			c = c->next;
   2704		}
   2705		break;
   2706
   2707	default:
   2708		rc = 0;
   2709		*out_sid = SECINITSID_NODE;
   2710		goto out;
   2711	}
   2712
   2713	if (c) {
   2714		rc = ocontext_to_sid(sidtab, c, 0, out_sid);
   2715		if (rc == -ESTALE) {
   2716			rcu_read_unlock();
   2717			goto retry;
   2718		}
   2719		if (rc)
   2720			goto out;
   2721	} else {
   2722		*out_sid = SECINITSID_NODE;
   2723	}
   2724
   2725	rc = 0;
   2726out:
   2727	rcu_read_unlock();
   2728	return rc;
   2729}
   2730
   2731#define SIDS_NEL 25
   2732
   2733/**
   2734 * security_get_user_sids - Obtain reachable SIDs for a user.
   2735 * @state: SELinux state
   2736 * @fromsid: starting SID
   2737 * @username: username
   2738 * @sids: array of reachable SIDs for user
   2739 * @nel: number of elements in @sids
   2740 *
   2741 * Generate the set of SIDs for legal security contexts
   2742 * for a given user that can be reached by @fromsid.
   2743 * Set *@sids to point to a dynamically allocated
   2744 * array containing the set of SIDs.  Set *@nel to the
   2745 * number of elements in the array.
   2746 */
   2747
   2748int security_get_user_sids(struct selinux_state *state,
   2749			   u32 fromsid,
   2750			   char *username,
   2751			   u32 **sids,
   2752			   u32 *nel)
   2753{
   2754	struct selinux_policy *policy;
   2755	struct policydb *policydb;
   2756	struct sidtab *sidtab;
   2757	struct context *fromcon, usercon;
   2758	u32 *mysids = NULL, *mysids2, sid;
   2759	u32 i, j, mynel, maxnel = SIDS_NEL;
   2760	struct user_datum *user;
   2761	struct role_datum *role;
   2762	struct ebitmap_node *rnode, *tnode;
   2763	int rc;
   2764
   2765	*sids = NULL;
   2766	*nel = 0;
   2767
   2768	if (!selinux_initialized(state))
   2769		return 0;
   2770
   2771	mysids = kcalloc(maxnel, sizeof(*mysids), GFP_KERNEL);
   2772	if (!mysids)
   2773		return -ENOMEM;
   2774
   2775retry:
   2776	mynel = 0;
   2777	rcu_read_lock();
   2778	policy = rcu_dereference(state->policy);
   2779	policydb = &policy->policydb;
   2780	sidtab = policy->sidtab;
   2781
   2782	context_init(&usercon);
   2783
   2784	rc = -EINVAL;
   2785	fromcon = sidtab_search(sidtab, fromsid);
   2786	if (!fromcon)
   2787		goto out_unlock;
   2788
   2789	rc = -EINVAL;
   2790	user = symtab_search(&policydb->p_users, username);
   2791	if (!user)
   2792		goto out_unlock;
   2793
   2794	usercon.user = user->value;
   2795
   2796	ebitmap_for_each_positive_bit(&user->roles, rnode, i) {
   2797		role = policydb->role_val_to_struct[i];
   2798		usercon.role = i + 1;
   2799		ebitmap_for_each_positive_bit(&role->types, tnode, j) {
   2800			usercon.type = j + 1;
   2801
   2802			if (mls_setup_user_range(policydb, fromcon, user,
   2803						 &usercon))
   2804				continue;
   2805
   2806			rc = sidtab_context_to_sid(sidtab, &usercon, &sid);
   2807			if (rc == -ESTALE) {
   2808				rcu_read_unlock();
   2809				goto retry;
   2810			}
   2811			if (rc)
   2812				goto out_unlock;
   2813			if (mynel < maxnel) {
   2814				mysids[mynel++] = sid;
   2815			} else {
   2816				rc = -ENOMEM;
   2817				maxnel += SIDS_NEL;
   2818				mysids2 = kcalloc(maxnel, sizeof(*mysids2), GFP_ATOMIC);
   2819				if (!mysids2)
   2820					goto out_unlock;
   2821				memcpy(mysids2, mysids, mynel * sizeof(*mysids2));
   2822				kfree(mysids);
   2823				mysids = mysids2;
   2824				mysids[mynel++] = sid;
   2825			}
   2826		}
   2827	}
   2828	rc = 0;
   2829out_unlock:
   2830	rcu_read_unlock();
   2831	if (rc || !mynel) {
   2832		kfree(mysids);
   2833		return rc;
   2834	}
   2835
   2836	rc = -ENOMEM;
   2837	mysids2 = kcalloc(mynel, sizeof(*mysids2), GFP_KERNEL);
   2838	if (!mysids2) {
   2839		kfree(mysids);
   2840		return rc;
   2841	}
   2842	for (i = 0, j = 0; i < mynel; i++) {
   2843		struct av_decision dummy_avd;
   2844		rc = avc_has_perm_noaudit(state,
   2845					  fromsid, mysids[i],
   2846					  SECCLASS_PROCESS, /* kernel value */
   2847					  PROCESS__TRANSITION, AVC_STRICT,
   2848					  &dummy_avd);
   2849		if (!rc)
   2850			mysids2[j++] = mysids[i];
   2851		cond_resched();
   2852	}
   2853	kfree(mysids);
   2854	*sids = mysids2;
   2855	*nel = j;
   2856	return 0;
   2857}
   2858
   2859/**
   2860 * __security_genfs_sid - Helper to obtain a SID for a file in a filesystem
   2861 * @policy: policy
   2862 * @fstype: filesystem type
   2863 * @path: path from root of mount
   2864 * @orig_sclass: file security class
   2865 * @sid: SID for path
   2866 *
   2867 * Obtain a SID to use for a file in a filesystem that
   2868 * cannot support xattr or use a fixed labeling behavior like
   2869 * transition SIDs or task SIDs.
   2870 *
   2871 * WARNING: This function may return -ESTALE, indicating that the caller
   2872 * must retry the operation after re-acquiring the policy pointer!
   2873 */
   2874static inline int __security_genfs_sid(struct selinux_policy *policy,
   2875				       const char *fstype,
   2876				       const char *path,
   2877				       u16 orig_sclass,
   2878				       u32 *sid)
   2879{
   2880	struct policydb *policydb = &policy->policydb;
   2881	struct sidtab *sidtab = policy->sidtab;
   2882	int len;
   2883	u16 sclass;
   2884	struct genfs *genfs;
   2885	struct ocontext *c;
   2886	int cmp = 0;
   2887
   2888	while (path[0] == '/' && path[1] == '/')
   2889		path++;
   2890
   2891	sclass = unmap_class(&policy->map, orig_sclass);
   2892	*sid = SECINITSID_UNLABELED;
   2893
   2894	for (genfs = policydb->genfs; genfs; genfs = genfs->next) {
   2895		cmp = strcmp(fstype, genfs->fstype);
   2896		if (cmp <= 0)
   2897			break;
   2898	}
   2899
   2900	if (!genfs || cmp)
   2901		return -ENOENT;
   2902
   2903	for (c = genfs->head; c; c = c->next) {
   2904		len = strlen(c->u.name);
   2905		if ((!c->v.sclass || sclass == c->v.sclass) &&
   2906		    (strncmp(c->u.name, path, len) == 0))
   2907			break;
   2908	}
   2909
   2910	if (!c)
   2911		return -ENOENT;
   2912
   2913	return ocontext_to_sid(sidtab, c, 0, sid);
   2914}
   2915
   2916/**
   2917 * security_genfs_sid - Obtain a SID for a file in a filesystem
   2918 * @state: SELinux state
   2919 * @fstype: filesystem type
   2920 * @path: path from root of mount
   2921 * @orig_sclass: file security class
   2922 * @sid: SID for path
   2923 *
   2924 * Acquire policy_rwlock before calling __security_genfs_sid() and release
   2925 * it afterward.
   2926 */
   2927int security_genfs_sid(struct selinux_state *state,
   2928		       const char *fstype,
   2929		       const char *path,
   2930		       u16 orig_sclass,
   2931		       u32 *sid)
   2932{
   2933	struct selinux_policy *policy;
   2934	int retval;
   2935
   2936	if (!selinux_initialized(state)) {
   2937		*sid = SECINITSID_UNLABELED;
   2938		return 0;
   2939	}
   2940
   2941	do {
   2942		rcu_read_lock();
   2943		policy = rcu_dereference(state->policy);
   2944		retval = __security_genfs_sid(policy, fstype, path,
   2945					      orig_sclass, sid);
   2946		rcu_read_unlock();
   2947	} while (retval == -ESTALE);
   2948	return retval;
   2949}
   2950
   2951int selinux_policy_genfs_sid(struct selinux_policy *policy,
   2952			const char *fstype,
   2953			const char *path,
   2954			u16 orig_sclass,
   2955			u32 *sid)
   2956{
   2957	/* no lock required, policy is not yet accessible by other threads */
   2958	return __security_genfs_sid(policy, fstype, path, orig_sclass, sid);
   2959}
   2960
   2961/**
   2962 * security_fs_use - Determine how to handle labeling for a filesystem.
   2963 * @state: SELinux state
   2964 * @sb: superblock in question
   2965 */
   2966int security_fs_use(struct selinux_state *state, struct super_block *sb)
   2967{
   2968	struct selinux_policy *policy;
   2969	struct policydb *policydb;
   2970	struct sidtab *sidtab;
   2971	int rc;
   2972	struct ocontext *c;
   2973	struct superblock_security_struct *sbsec = selinux_superblock(sb);
   2974	const char *fstype = sb->s_type->name;
   2975
   2976	if (!selinux_initialized(state)) {
   2977		sbsec->behavior = SECURITY_FS_USE_NONE;
   2978		sbsec->sid = SECINITSID_UNLABELED;
   2979		return 0;
   2980	}
   2981
   2982retry:
   2983	rcu_read_lock();
   2984	policy = rcu_dereference(state->policy);
   2985	policydb = &policy->policydb;
   2986	sidtab = policy->sidtab;
   2987
   2988	c = policydb->ocontexts[OCON_FSUSE];
   2989	while (c) {
   2990		if (strcmp(fstype, c->u.name) == 0)
   2991			break;
   2992		c = c->next;
   2993	}
   2994
   2995	if (c) {
   2996		sbsec->behavior = c->v.behavior;
   2997		rc = ocontext_to_sid(sidtab, c, 0, &sbsec->sid);
   2998		if (rc == -ESTALE) {
   2999			rcu_read_unlock();
   3000			goto retry;
   3001		}
   3002		if (rc)
   3003			goto out;
   3004	} else {
   3005		rc = __security_genfs_sid(policy, fstype, "/",
   3006					SECCLASS_DIR, &sbsec->sid);
   3007		if (rc == -ESTALE) {
   3008			rcu_read_unlock();
   3009			goto retry;
   3010		}
   3011		if (rc) {
   3012			sbsec->behavior = SECURITY_FS_USE_NONE;
   3013			rc = 0;
   3014		} else {
   3015			sbsec->behavior = SECURITY_FS_USE_GENFS;
   3016		}
   3017	}
   3018
   3019out:
   3020	rcu_read_unlock();
   3021	return rc;
   3022}
   3023
   3024int security_get_bools(struct selinux_policy *policy,
   3025		       u32 *len, char ***names, int **values)
   3026{
   3027	struct policydb *policydb;
   3028	u32 i;
   3029	int rc;
   3030
   3031	policydb = &policy->policydb;
   3032
   3033	*names = NULL;
   3034	*values = NULL;
   3035
   3036	rc = 0;
   3037	*len = policydb->p_bools.nprim;
   3038	if (!*len)
   3039		goto out;
   3040
   3041	rc = -ENOMEM;
   3042	*names = kcalloc(*len, sizeof(char *), GFP_ATOMIC);
   3043	if (!*names)
   3044		goto err;
   3045
   3046	rc = -ENOMEM;
   3047	*values = kcalloc(*len, sizeof(int), GFP_ATOMIC);
   3048	if (!*values)
   3049		goto err;
   3050
   3051	for (i = 0; i < *len; i++) {
   3052		(*values)[i] = policydb->bool_val_to_struct[i]->state;
   3053
   3054		rc = -ENOMEM;
   3055		(*names)[i] = kstrdup(sym_name(policydb, SYM_BOOLS, i),
   3056				      GFP_ATOMIC);
   3057		if (!(*names)[i])
   3058			goto err;
   3059	}
   3060	rc = 0;
   3061out:
   3062	return rc;
   3063err:
   3064	if (*names) {
   3065		for (i = 0; i < *len; i++)
   3066			kfree((*names)[i]);
   3067		kfree(*names);
   3068	}
   3069	kfree(*values);
   3070	*len = 0;
   3071	*names = NULL;
   3072	*values = NULL;
   3073	goto out;
   3074}
   3075
   3076
   3077int security_set_bools(struct selinux_state *state, u32 len, int *values)
   3078{
   3079	struct selinux_policy *newpolicy, *oldpolicy;
   3080	int rc;
   3081	u32 i, seqno = 0;
   3082
   3083	if (!selinux_initialized(state))
   3084		return -EINVAL;
   3085
   3086	oldpolicy = rcu_dereference_protected(state->policy,
   3087					lockdep_is_held(&state->policy_mutex));
   3088
   3089	/* Consistency check on number of booleans, should never fail */
   3090	if (WARN_ON(len != oldpolicy->policydb.p_bools.nprim))
   3091		return -EINVAL;
   3092
   3093	newpolicy = kmemdup(oldpolicy, sizeof(*newpolicy), GFP_KERNEL);
   3094	if (!newpolicy)
   3095		return -ENOMEM;
   3096
   3097	/*
   3098	 * Deep copy only the parts of the policydb that might be
   3099	 * modified as a result of changing booleans.
   3100	 */
   3101	rc = cond_policydb_dup(&newpolicy->policydb, &oldpolicy->policydb);
   3102	if (rc) {
   3103		kfree(newpolicy);
   3104		return -ENOMEM;
   3105	}
   3106
   3107	/* Update the boolean states in the copy */
   3108	for (i = 0; i < len; i++) {
   3109		int new_state = !!values[i];
   3110		int old_state = newpolicy->policydb.bool_val_to_struct[i]->state;
   3111
   3112		if (new_state != old_state) {
   3113			audit_log(audit_context(), GFP_ATOMIC,
   3114				AUDIT_MAC_CONFIG_CHANGE,
   3115				"bool=%s val=%d old_val=%d auid=%u ses=%u",
   3116				sym_name(&newpolicy->policydb, SYM_BOOLS, i),
   3117				new_state,
   3118				old_state,
   3119				from_kuid(&init_user_ns, audit_get_loginuid(current)),
   3120				audit_get_sessionid(current));
   3121			newpolicy->policydb.bool_val_to_struct[i]->state = new_state;
   3122		}
   3123	}
   3124
   3125	/* Re-evaluate the conditional rules in the copy */
   3126	evaluate_cond_nodes(&newpolicy->policydb);
   3127
   3128	/* Set latest granting seqno for new policy */
   3129	newpolicy->latest_granting = oldpolicy->latest_granting + 1;
   3130	seqno = newpolicy->latest_granting;
   3131
   3132	/* Install the new policy */
   3133	rcu_assign_pointer(state->policy, newpolicy);
   3134
   3135	/*
   3136	 * Free the conditional portions of the old policydb
   3137	 * that were copied for the new policy, and the oldpolicy
   3138	 * structure itself but not what it references.
   3139	 */
   3140	synchronize_rcu();
   3141	selinux_policy_cond_free(oldpolicy);
   3142
   3143	/* Notify others of the policy change */
   3144	selinux_notify_policy_change(state, seqno);
   3145	return 0;
   3146}
   3147
   3148int security_get_bool_value(struct selinux_state *state,
   3149			    u32 index)
   3150{
   3151	struct selinux_policy *policy;
   3152	struct policydb *policydb;
   3153	int rc;
   3154	u32 len;
   3155
   3156	if (!selinux_initialized(state))
   3157		return 0;
   3158
   3159	rcu_read_lock();
   3160	policy = rcu_dereference(state->policy);
   3161	policydb = &policy->policydb;
   3162
   3163	rc = -EFAULT;
   3164	len = policydb->p_bools.nprim;
   3165	if (index >= len)
   3166		goto out;
   3167
   3168	rc = policydb->bool_val_to_struct[index]->state;
   3169out:
   3170	rcu_read_unlock();
   3171	return rc;
   3172}
   3173
   3174static int security_preserve_bools(struct selinux_policy *oldpolicy,
   3175				struct selinux_policy *newpolicy)
   3176{
   3177	int rc, *bvalues = NULL;
   3178	char **bnames = NULL;
   3179	struct cond_bool_datum *booldatum;
   3180	u32 i, nbools = 0;
   3181
   3182	rc = security_get_bools(oldpolicy, &nbools, &bnames, &bvalues);
   3183	if (rc)
   3184		goto out;
   3185	for (i = 0; i < nbools; i++) {
   3186		booldatum = symtab_search(&newpolicy->policydb.p_bools,
   3187					bnames[i]);
   3188		if (booldatum)
   3189			booldatum->state = bvalues[i];
   3190	}
   3191	evaluate_cond_nodes(&newpolicy->policydb);
   3192
   3193out:
   3194	if (bnames) {
   3195		for (i = 0; i < nbools; i++)
   3196			kfree(bnames[i]);
   3197	}
   3198	kfree(bnames);
   3199	kfree(bvalues);
   3200	return rc;
   3201}
   3202
   3203/*
   3204 * security_sid_mls_copy() - computes a new sid based on the given
   3205 * sid and the mls portion of mls_sid.
   3206 */
   3207int security_sid_mls_copy(struct selinux_state *state,
   3208			  u32 sid, u32 mls_sid, u32 *new_sid)
   3209{
   3210	struct selinux_policy *policy;
   3211	struct policydb *policydb;
   3212	struct sidtab *sidtab;
   3213	struct context *context1;
   3214	struct context *context2;
   3215	struct context newcon;
   3216	char *s;
   3217	u32 len;
   3218	int rc;
   3219
   3220	if (!selinux_initialized(state)) {
   3221		*new_sid = sid;
   3222		return 0;
   3223	}
   3224
   3225retry:
   3226	rc = 0;
   3227	context_init(&newcon);
   3228
   3229	rcu_read_lock();
   3230	policy = rcu_dereference(state->policy);
   3231	policydb = &policy->policydb;
   3232	sidtab = policy->sidtab;
   3233
   3234	if (!policydb->mls_enabled) {
   3235		*new_sid = sid;
   3236		goto out_unlock;
   3237	}
   3238
   3239	rc = -EINVAL;
   3240	context1 = sidtab_search(sidtab, sid);
   3241	if (!context1) {
   3242		pr_err("SELinux: %s:  unrecognized SID %d\n",
   3243			__func__, sid);
   3244		goto out_unlock;
   3245	}
   3246
   3247	rc = -EINVAL;
   3248	context2 = sidtab_search(sidtab, mls_sid);
   3249	if (!context2) {
   3250		pr_err("SELinux: %s:  unrecognized SID %d\n",
   3251			__func__, mls_sid);
   3252		goto out_unlock;
   3253	}
   3254
   3255	newcon.user = context1->user;
   3256	newcon.role = context1->role;
   3257	newcon.type = context1->type;
   3258	rc = mls_context_cpy(&newcon, context2);
   3259	if (rc)
   3260		goto out_unlock;
   3261
   3262	/* Check the validity of the new context. */
   3263	if (!policydb_context_isvalid(policydb, &newcon)) {
   3264		rc = convert_context_handle_invalid_context(state, policydb,
   3265							&newcon);
   3266		if (rc) {
   3267			if (!context_struct_to_string(policydb, &newcon, &s,
   3268						      &len)) {
   3269				struct audit_buffer *ab;
   3270
   3271				ab = audit_log_start(audit_context(),
   3272						     GFP_ATOMIC,
   3273						     AUDIT_SELINUX_ERR);
   3274				audit_log_format(ab,
   3275						 "op=security_sid_mls_copy invalid_context=");
   3276				/* don't record NUL with untrusted strings */
   3277				audit_log_n_untrustedstring(ab, s, len - 1);
   3278				audit_log_end(ab);
   3279				kfree(s);
   3280			}
   3281			goto out_unlock;
   3282		}
   3283	}
   3284	rc = sidtab_context_to_sid(sidtab, &newcon, new_sid);
   3285	if (rc == -ESTALE) {
   3286		rcu_read_unlock();
   3287		context_destroy(&newcon);
   3288		goto retry;
   3289	}
   3290out_unlock:
   3291	rcu_read_unlock();
   3292	context_destroy(&newcon);
   3293	return rc;
   3294}
   3295
   3296/**
   3297 * security_net_peersid_resolve - Compare and resolve two network peer SIDs
   3298 * @state: SELinux state
   3299 * @nlbl_sid: NetLabel SID
   3300 * @nlbl_type: NetLabel labeling protocol type
   3301 * @xfrm_sid: XFRM SID
   3302 * @peer_sid: network peer sid
   3303 *
   3304 * Description:
   3305 * Compare the @nlbl_sid and @xfrm_sid values and if the two SIDs can be
   3306 * resolved into a single SID it is returned via @peer_sid and the function
   3307 * returns zero.  Otherwise @peer_sid is set to SECSID_NULL and the function
   3308 * returns a negative value.  A table summarizing the behavior is below:
   3309 *
   3310 *                                 | function return |      @sid
   3311 *   ------------------------------+-----------------+-----------------
   3312 *   no peer labels                |        0        |    SECSID_NULL
   3313 *   single peer label             |        0        |    <peer_label>
   3314 *   multiple, consistent labels   |        0        |    <peer_label>
   3315 *   multiple, inconsistent labels |    -<errno>     |    SECSID_NULL
   3316 *
   3317 */
   3318int security_net_peersid_resolve(struct selinux_state *state,
   3319				 u32 nlbl_sid, u32 nlbl_type,
   3320				 u32 xfrm_sid,
   3321				 u32 *peer_sid)
   3322{
   3323	struct selinux_policy *policy;
   3324	struct policydb *policydb;
   3325	struct sidtab *sidtab;
   3326	int rc;
   3327	struct context *nlbl_ctx;
   3328	struct context *xfrm_ctx;
   3329
   3330	*peer_sid = SECSID_NULL;
   3331
   3332	/* handle the common (which also happens to be the set of easy) cases
   3333	 * right away, these two if statements catch everything involving a
   3334	 * single or absent peer SID/label */
   3335	if (xfrm_sid == SECSID_NULL) {
   3336		*peer_sid = nlbl_sid;
   3337		return 0;
   3338	}
   3339	/* NOTE: an nlbl_type == NETLBL_NLTYPE_UNLABELED is a "fallback" label
   3340	 * and is treated as if nlbl_sid == SECSID_NULL when a XFRM SID/label
   3341	 * is present */
   3342	if (nlbl_sid == SECSID_NULL || nlbl_type == NETLBL_NLTYPE_UNLABELED) {
   3343		*peer_sid = xfrm_sid;
   3344		return 0;
   3345	}
   3346
   3347	if (!selinux_initialized(state))
   3348		return 0;
   3349
   3350	rcu_read_lock();
   3351	policy = rcu_dereference(state->policy);
   3352	policydb = &policy->policydb;
   3353	sidtab = policy->sidtab;
   3354
   3355	/*
   3356	 * We don't need to check initialized here since the only way both
   3357	 * nlbl_sid and xfrm_sid are not equal to SECSID_NULL would be if the
   3358	 * security server was initialized and state->initialized was true.
   3359	 */
   3360	if (!policydb->mls_enabled) {
   3361		rc = 0;
   3362		goto out;
   3363	}
   3364
   3365	rc = -EINVAL;
   3366	nlbl_ctx = sidtab_search(sidtab, nlbl_sid);
   3367	if (!nlbl_ctx) {
   3368		pr_err("SELinux: %s:  unrecognized SID %d\n",
   3369		       __func__, nlbl_sid);
   3370		goto out;
   3371	}
   3372	rc = -EINVAL;
   3373	xfrm_ctx = sidtab_search(sidtab, xfrm_sid);
   3374	if (!xfrm_ctx) {
   3375		pr_err("SELinux: %s:  unrecognized SID %d\n",
   3376		       __func__, xfrm_sid);
   3377		goto out;
   3378	}
   3379	rc = (mls_context_cmp(nlbl_ctx, xfrm_ctx) ? 0 : -EACCES);
   3380	if (rc)
   3381		goto out;
   3382
   3383	/* at present NetLabel SIDs/labels really only carry MLS
   3384	 * information so if the MLS portion of the NetLabel SID
   3385	 * matches the MLS portion of the labeled XFRM SID/label
   3386	 * then pass along the XFRM SID as it is the most
   3387	 * expressive */
   3388	*peer_sid = xfrm_sid;
   3389out:
   3390	rcu_read_unlock();
   3391	return rc;
   3392}
   3393
   3394static int get_classes_callback(void *k, void *d, void *args)
   3395{
   3396	struct class_datum *datum = d;
   3397	char *name = k, **classes = args;
   3398	int value = datum->value - 1;
   3399
   3400	classes[value] = kstrdup(name, GFP_ATOMIC);
   3401	if (!classes[value])
   3402		return -ENOMEM;
   3403
   3404	return 0;
   3405}
   3406
   3407int security_get_classes(struct selinux_policy *policy,
   3408			 char ***classes, int *nclasses)
   3409{
   3410	struct policydb *policydb;
   3411	int rc;
   3412
   3413	policydb = &policy->policydb;
   3414
   3415	rc = -ENOMEM;
   3416	*nclasses = policydb->p_classes.nprim;
   3417	*classes = kcalloc(*nclasses, sizeof(**classes), GFP_ATOMIC);
   3418	if (!*classes)
   3419		goto out;
   3420
   3421	rc = hashtab_map(&policydb->p_classes.table, get_classes_callback,
   3422			 *classes);
   3423	if (rc) {
   3424		int i;
   3425		for (i = 0; i < *nclasses; i++)
   3426			kfree((*classes)[i]);
   3427		kfree(*classes);
   3428	}
   3429
   3430out:
   3431	return rc;
   3432}
   3433
   3434static int get_permissions_callback(void *k, void *d, void *args)
   3435{
   3436	struct perm_datum *datum = d;
   3437	char *name = k, **perms = args;
   3438	int value = datum->value - 1;
   3439
   3440	perms[value] = kstrdup(name, GFP_ATOMIC);
   3441	if (!perms[value])
   3442		return -ENOMEM;
   3443
   3444	return 0;
   3445}
   3446
   3447int security_get_permissions(struct selinux_policy *policy,
   3448			     char *class, char ***perms, int *nperms)
   3449{
   3450	struct policydb *policydb;
   3451	int rc, i;
   3452	struct class_datum *match;
   3453
   3454	policydb = &policy->policydb;
   3455
   3456	rc = -EINVAL;
   3457	match = symtab_search(&policydb->p_classes, class);
   3458	if (!match) {
   3459		pr_err("SELinux: %s:  unrecognized class %s\n",
   3460			__func__, class);
   3461		goto out;
   3462	}
   3463
   3464	rc = -ENOMEM;
   3465	*nperms = match->permissions.nprim;
   3466	*perms = kcalloc(*nperms, sizeof(**perms), GFP_ATOMIC);
   3467	if (!*perms)
   3468		goto out;
   3469
   3470	if (match->comdatum) {
   3471		rc = hashtab_map(&match->comdatum->permissions.table,
   3472				 get_permissions_callback, *perms);
   3473		if (rc)
   3474			goto err;
   3475	}
   3476
   3477	rc = hashtab_map(&match->permissions.table, get_permissions_callback,
   3478			 *perms);
   3479	if (rc)
   3480		goto err;
   3481
   3482out:
   3483	return rc;
   3484
   3485err:
   3486	for (i = 0; i < *nperms; i++)
   3487		kfree((*perms)[i]);
   3488	kfree(*perms);
   3489	return rc;
   3490}
   3491
   3492int security_get_reject_unknown(struct selinux_state *state)
   3493{
   3494	struct selinux_policy *policy;
   3495	int value;
   3496
   3497	if (!selinux_initialized(state))
   3498		return 0;
   3499
   3500	rcu_read_lock();
   3501	policy = rcu_dereference(state->policy);
   3502	value = policy->policydb.reject_unknown;
   3503	rcu_read_unlock();
   3504	return value;
   3505}
   3506
   3507int security_get_allow_unknown(struct selinux_state *state)
   3508{
   3509	struct selinux_policy *policy;
   3510	int value;
   3511
   3512	if (!selinux_initialized(state))
   3513		return 0;
   3514
   3515	rcu_read_lock();
   3516	policy = rcu_dereference(state->policy);
   3517	value = policy->policydb.allow_unknown;
   3518	rcu_read_unlock();
   3519	return value;
   3520}
   3521
   3522/**
   3523 * security_policycap_supported - Check for a specific policy capability
   3524 * @state: SELinux state
   3525 * @req_cap: capability
   3526 *
   3527 * Description:
   3528 * This function queries the currently loaded policy to see if it supports the
   3529 * capability specified by @req_cap.  Returns true (1) if the capability is
   3530 * supported, false (0) if it isn't supported.
   3531 *
   3532 */
   3533int security_policycap_supported(struct selinux_state *state,
   3534				 unsigned int req_cap)
   3535{
   3536	struct selinux_policy *policy;
   3537	int rc;
   3538
   3539	if (!selinux_initialized(state))
   3540		return 0;
   3541
   3542	rcu_read_lock();
   3543	policy = rcu_dereference(state->policy);
   3544	rc = ebitmap_get_bit(&policy->policydb.policycaps, req_cap);
   3545	rcu_read_unlock();
   3546
   3547	return rc;
   3548}
   3549
   3550struct selinux_audit_rule {
   3551	u32 au_seqno;
   3552	struct context au_ctxt;
   3553};
   3554
   3555void selinux_audit_rule_free(void *vrule)
   3556{
   3557	struct selinux_audit_rule *rule = vrule;
   3558
   3559	if (rule) {
   3560		context_destroy(&rule->au_ctxt);
   3561		kfree(rule);
   3562	}
   3563}
   3564
   3565int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
   3566{
   3567	struct selinux_state *state = &selinux_state;
   3568	struct selinux_policy *policy;
   3569	struct policydb *policydb;
   3570	struct selinux_audit_rule *tmprule;
   3571	struct role_datum *roledatum;
   3572	struct type_datum *typedatum;
   3573	struct user_datum *userdatum;
   3574	struct selinux_audit_rule **rule = (struct selinux_audit_rule **)vrule;
   3575	int rc = 0;
   3576
   3577	*rule = NULL;
   3578
   3579	if (!selinux_initialized(state))
   3580		return -EOPNOTSUPP;
   3581
   3582	switch (field) {
   3583	case AUDIT_SUBJ_USER:
   3584	case AUDIT_SUBJ_ROLE:
   3585	case AUDIT_SUBJ_TYPE:
   3586	case AUDIT_OBJ_USER:
   3587	case AUDIT_OBJ_ROLE:
   3588	case AUDIT_OBJ_TYPE:
   3589		/* only 'equals' and 'not equals' fit user, role, and type */
   3590		if (op != Audit_equal && op != Audit_not_equal)
   3591			return -EINVAL;
   3592		break;
   3593	case AUDIT_SUBJ_SEN:
   3594	case AUDIT_SUBJ_CLR:
   3595	case AUDIT_OBJ_LEV_LOW:
   3596	case AUDIT_OBJ_LEV_HIGH:
   3597		/* we do not allow a range, indicated by the presence of '-' */
   3598		if (strchr(rulestr, '-'))
   3599			return -EINVAL;
   3600		break;
   3601	default:
   3602		/* only the above fields are valid */
   3603		return -EINVAL;
   3604	}
   3605
   3606	tmprule = kzalloc(sizeof(struct selinux_audit_rule), GFP_KERNEL);
   3607	if (!tmprule)
   3608		return -ENOMEM;
   3609
   3610	context_init(&tmprule->au_ctxt);
   3611
   3612	rcu_read_lock();
   3613	policy = rcu_dereference(state->policy);
   3614	policydb = &policy->policydb;
   3615
   3616	tmprule->au_seqno = policy->latest_granting;
   3617
   3618	switch (field) {
   3619	case AUDIT_SUBJ_USER:
   3620	case AUDIT_OBJ_USER:
   3621		rc = -EINVAL;
   3622		userdatum = symtab_search(&policydb->p_users, rulestr);
   3623		if (!userdatum)
   3624			goto out;
   3625		tmprule->au_ctxt.user = userdatum->value;
   3626		break;
   3627	case AUDIT_SUBJ_ROLE:
   3628	case AUDIT_OBJ_ROLE:
   3629		rc = -EINVAL;
   3630		roledatum = symtab_search(&policydb->p_roles, rulestr);
   3631		if (!roledatum)
   3632			goto out;
   3633		tmprule->au_ctxt.role = roledatum->value;
   3634		break;
   3635	case AUDIT_SUBJ_TYPE:
   3636	case AUDIT_OBJ_TYPE:
   3637		rc = -EINVAL;
   3638		typedatum = symtab_search(&policydb->p_types, rulestr);
   3639		if (!typedatum)
   3640			goto out;
   3641		tmprule->au_ctxt.type = typedatum->value;
   3642		break;
   3643	case AUDIT_SUBJ_SEN:
   3644	case AUDIT_SUBJ_CLR:
   3645	case AUDIT_OBJ_LEV_LOW:
   3646	case AUDIT_OBJ_LEV_HIGH:
   3647		rc = mls_from_string(policydb, rulestr, &tmprule->au_ctxt,
   3648				     GFP_ATOMIC);
   3649		if (rc)
   3650			goto out;
   3651		break;
   3652	}
   3653	rc = 0;
   3654out:
   3655	rcu_read_unlock();
   3656
   3657	if (rc) {
   3658		selinux_audit_rule_free(tmprule);
   3659		tmprule = NULL;
   3660	}
   3661
   3662	*rule = tmprule;
   3663
   3664	return rc;
   3665}
   3666
   3667/* Check to see if the rule contains any selinux fields */
   3668int selinux_audit_rule_known(struct audit_krule *rule)
   3669{
   3670	int i;
   3671
   3672	for (i = 0; i < rule->field_count; i++) {
   3673		struct audit_field *f = &rule->fields[i];
   3674		switch (f->type) {
   3675		case AUDIT_SUBJ_USER:
   3676		case AUDIT_SUBJ_ROLE:
   3677		case AUDIT_SUBJ_TYPE:
   3678		case AUDIT_SUBJ_SEN:
   3679		case AUDIT_SUBJ_CLR:
   3680		case AUDIT_OBJ_USER:
   3681		case AUDIT_OBJ_ROLE:
   3682		case AUDIT_OBJ_TYPE:
   3683		case AUDIT_OBJ_LEV_LOW:
   3684		case AUDIT_OBJ_LEV_HIGH:
   3685			return 1;
   3686		}
   3687	}
   3688
   3689	return 0;
   3690}
   3691
   3692int selinux_audit_rule_match(u32 sid, u32 field, u32 op, void *vrule)
   3693{
   3694	struct selinux_state *state = &selinux_state;
   3695	struct selinux_policy *policy;
   3696	struct context *ctxt;
   3697	struct mls_level *level;
   3698	struct selinux_audit_rule *rule = vrule;
   3699	int match = 0;
   3700
   3701	if (unlikely(!rule)) {
   3702		WARN_ONCE(1, "selinux_audit_rule_match: missing rule\n");
   3703		return -ENOENT;
   3704	}
   3705
   3706	if (!selinux_initialized(state))
   3707		return 0;
   3708
   3709	rcu_read_lock();
   3710
   3711	policy = rcu_dereference(state->policy);
   3712
   3713	if (rule->au_seqno < policy->latest_granting) {
   3714		match = -ESTALE;
   3715		goto out;
   3716	}
   3717
   3718	ctxt = sidtab_search(policy->sidtab, sid);
   3719	if (unlikely(!ctxt)) {
   3720		WARN_ONCE(1, "selinux_audit_rule_match: unrecognized SID %d\n",
   3721			  sid);
   3722		match = -ENOENT;
   3723		goto out;
   3724	}
   3725
   3726	/* a field/op pair that is not caught here will simply fall through
   3727	   without a match */
   3728	switch (field) {
   3729	case AUDIT_SUBJ_USER:
   3730	case AUDIT_OBJ_USER:
   3731		switch (op) {
   3732		case Audit_equal:
   3733			match = (ctxt->user == rule->au_ctxt.user);
   3734			break;
   3735		case Audit_not_equal:
   3736			match = (ctxt->user != rule->au_ctxt.user);
   3737			break;
   3738		}
   3739		break;
   3740	case AUDIT_SUBJ_ROLE:
   3741	case AUDIT_OBJ_ROLE:
   3742		switch (op) {
   3743		case Audit_equal:
   3744			match = (ctxt->role == rule->au_ctxt.role);
   3745			break;
   3746		case Audit_not_equal:
   3747			match = (ctxt->role != rule->au_ctxt.role);
   3748			break;
   3749		}
   3750		break;
   3751	case AUDIT_SUBJ_TYPE:
   3752	case AUDIT_OBJ_TYPE:
   3753		switch (op) {
   3754		case Audit_equal:
   3755			match = (ctxt->type == rule->au_ctxt.type);
   3756			break;
   3757		case Audit_not_equal:
   3758			match = (ctxt->type != rule->au_ctxt.type);
   3759			break;
   3760		}
   3761		break;
   3762	case AUDIT_SUBJ_SEN:
   3763	case AUDIT_SUBJ_CLR:
   3764	case AUDIT_OBJ_LEV_LOW:
   3765	case AUDIT_OBJ_LEV_HIGH:
   3766		level = ((field == AUDIT_SUBJ_SEN ||
   3767			  field == AUDIT_OBJ_LEV_LOW) ?
   3768			 &ctxt->range.level[0] : &ctxt->range.level[1]);
   3769		switch (op) {
   3770		case Audit_equal:
   3771			match = mls_level_eq(&rule->au_ctxt.range.level[0],
   3772					     level);
   3773			break;
   3774		case Audit_not_equal:
   3775			match = !mls_level_eq(&rule->au_ctxt.range.level[0],
   3776					      level);
   3777			break;
   3778		case Audit_lt:
   3779			match = (mls_level_dom(&rule->au_ctxt.range.level[0],
   3780					       level) &&
   3781				 !mls_level_eq(&rule->au_ctxt.range.level[0],
   3782					       level));
   3783			break;
   3784		case Audit_le:
   3785			match = mls_level_dom(&rule->au_ctxt.range.level[0],
   3786					      level);
   3787			break;
   3788		case Audit_gt:
   3789			match = (mls_level_dom(level,
   3790					      &rule->au_ctxt.range.level[0]) &&
   3791				 !mls_level_eq(level,
   3792					       &rule->au_ctxt.range.level[0]));
   3793			break;
   3794		case Audit_ge:
   3795			match = mls_level_dom(level,
   3796					      &rule->au_ctxt.range.level[0]);
   3797			break;
   3798		}
   3799	}
   3800
   3801out:
   3802	rcu_read_unlock();
   3803	return match;
   3804}
   3805
   3806static int aurule_avc_callback(u32 event)
   3807{
   3808	if (event == AVC_CALLBACK_RESET)
   3809		return audit_update_lsm_rules();
   3810	return 0;
   3811}
   3812
   3813static int __init aurule_init(void)
   3814{
   3815	int err;
   3816
   3817	err = avc_add_callback(aurule_avc_callback, AVC_CALLBACK_RESET);
   3818	if (err)
   3819		panic("avc_add_callback() failed, error %d\n", err);
   3820
   3821	return err;
   3822}
   3823__initcall(aurule_init);
   3824
   3825#ifdef CONFIG_NETLABEL
   3826/**
   3827 * security_netlbl_cache_add - Add an entry to the NetLabel cache
   3828 * @secattr: the NetLabel packet security attributes
   3829 * @sid: the SELinux SID
   3830 *
   3831 * Description:
   3832 * Attempt to cache the context in @ctx, which was derived from the packet in
   3833 * @skb, in the NetLabel subsystem cache.  This function assumes @secattr has
   3834 * already been initialized.
   3835 *
   3836 */
   3837static void security_netlbl_cache_add(struct netlbl_lsm_secattr *secattr,
   3838				      u32 sid)
   3839{
   3840	u32 *sid_cache;
   3841
   3842	sid_cache = kmalloc(sizeof(*sid_cache), GFP_ATOMIC);
   3843	if (sid_cache == NULL)
   3844		return;
   3845	secattr->cache = netlbl_secattr_cache_alloc(GFP_ATOMIC);
   3846	if (secattr->cache == NULL) {
   3847		kfree(sid_cache);
   3848		return;
   3849	}
   3850
   3851	*sid_cache = sid;
   3852	secattr->cache->free = kfree;
   3853	secattr->cache->data = sid_cache;
   3854	secattr->flags |= NETLBL_SECATTR_CACHE;
   3855}
   3856
   3857/**
   3858 * security_netlbl_secattr_to_sid - Convert a NetLabel secattr to a SELinux SID
   3859 * @state: SELinux state
   3860 * @secattr: the NetLabel packet security attributes
   3861 * @sid: the SELinux SID
   3862 *
   3863 * Description:
   3864 * Convert the given NetLabel security attributes in @secattr into a
   3865 * SELinux SID.  If the @secattr field does not contain a full SELinux
   3866 * SID/context then use SECINITSID_NETMSG as the foundation.  If possible the
   3867 * 'cache' field of @secattr is set and the CACHE flag is set; this is to
   3868 * allow the @secattr to be used by NetLabel to cache the secattr to SID
   3869 * conversion for future lookups.  Returns zero on success, negative values on
   3870 * failure.
   3871 *
   3872 */
   3873int security_netlbl_secattr_to_sid(struct selinux_state *state,
   3874				   struct netlbl_lsm_secattr *secattr,
   3875				   u32 *sid)
   3876{
   3877	struct selinux_policy *policy;
   3878	struct policydb *policydb;
   3879	struct sidtab *sidtab;
   3880	int rc;
   3881	struct context *ctx;
   3882	struct context ctx_new;
   3883
   3884	if (!selinux_initialized(state)) {
   3885		*sid = SECSID_NULL;
   3886		return 0;
   3887	}
   3888
   3889retry:
   3890	rc = 0;
   3891	rcu_read_lock();
   3892	policy = rcu_dereference(state->policy);
   3893	policydb = &policy->policydb;
   3894	sidtab = policy->sidtab;
   3895
   3896	if (secattr->flags & NETLBL_SECATTR_CACHE)
   3897		*sid = *(u32 *)secattr->cache->data;
   3898	else if (secattr->flags & NETLBL_SECATTR_SECID)
   3899		*sid = secattr->attr.secid;
   3900	else if (secattr->flags & NETLBL_SECATTR_MLS_LVL) {
   3901		rc = -EIDRM;
   3902		ctx = sidtab_search(sidtab, SECINITSID_NETMSG);
   3903		if (ctx == NULL)
   3904			goto out;
   3905
   3906		context_init(&ctx_new);
   3907		ctx_new.user = ctx->user;
   3908		ctx_new.role = ctx->role;
   3909		ctx_new.type = ctx->type;
   3910		mls_import_netlbl_lvl(policydb, &ctx_new, secattr);
   3911		if (secattr->flags & NETLBL_SECATTR_MLS_CAT) {
   3912			rc = mls_import_netlbl_cat(policydb, &ctx_new, secattr);
   3913			if (rc)
   3914				goto out;
   3915		}
   3916		rc = -EIDRM;
   3917		if (!mls_context_isvalid(policydb, &ctx_new)) {
   3918			ebitmap_destroy(&ctx_new.range.level[0].cat);
   3919			goto out;
   3920		}
   3921
   3922		rc = sidtab_context_to_sid(sidtab, &ctx_new, sid);
   3923		ebitmap_destroy(&ctx_new.range.level[0].cat);
   3924		if (rc == -ESTALE) {
   3925			rcu_read_unlock();
   3926			goto retry;
   3927		}
   3928		if (rc)
   3929			goto out;
   3930
   3931		security_netlbl_cache_add(secattr, *sid);
   3932	} else
   3933		*sid = SECSID_NULL;
   3934
   3935out:
   3936	rcu_read_unlock();
   3937	return rc;
   3938}
   3939
   3940/**
   3941 * security_netlbl_sid_to_secattr - Convert a SELinux SID to a NetLabel secattr
   3942 * @state: SELinux state
   3943 * @sid: the SELinux SID
   3944 * @secattr: the NetLabel packet security attributes
   3945 *
   3946 * Description:
   3947 * Convert the given SELinux SID in @sid into a NetLabel security attribute.
   3948 * Returns zero on success, negative values on failure.
   3949 *
   3950 */
   3951int security_netlbl_sid_to_secattr(struct selinux_state *state,
   3952				   u32 sid, struct netlbl_lsm_secattr *secattr)
   3953{
   3954	struct selinux_policy *policy;
   3955	struct policydb *policydb;
   3956	int rc;
   3957	struct context *ctx;
   3958
   3959	if (!selinux_initialized(state))
   3960		return 0;
   3961
   3962	rcu_read_lock();
   3963	policy = rcu_dereference(state->policy);
   3964	policydb = &policy->policydb;
   3965
   3966	rc = -ENOENT;
   3967	ctx = sidtab_search(policy->sidtab, sid);
   3968	if (ctx == NULL)
   3969		goto out;
   3970
   3971	rc = -ENOMEM;
   3972	secattr->domain = kstrdup(sym_name(policydb, SYM_TYPES, ctx->type - 1),
   3973				  GFP_ATOMIC);
   3974	if (secattr->domain == NULL)
   3975		goto out;
   3976
   3977	secattr->attr.secid = sid;
   3978	secattr->flags |= NETLBL_SECATTR_DOMAIN_CPY | NETLBL_SECATTR_SECID;
   3979	mls_export_netlbl_lvl(policydb, ctx, secattr);
   3980	rc = mls_export_netlbl_cat(policydb, ctx, secattr);
   3981out:
   3982	rcu_read_unlock();
   3983	return rc;
   3984}
   3985#endif /* CONFIG_NETLABEL */
   3986
   3987/**
   3988 * __security_read_policy - read the policy.
   3989 * @policy: SELinux policy
   3990 * @data: binary policy data
   3991 * @len: length of data in bytes
   3992 *
   3993 */
   3994static int __security_read_policy(struct selinux_policy *policy,
   3995				  void *data, size_t *len)
   3996{
   3997	int rc;
   3998	struct policy_file fp;
   3999
   4000	fp.data = data;
   4001	fp.len = *len;
   4002
   4003	rc = policydb_write(&policy->policydb, &fp);
   4004	if (rc)
   4005		return rc;
   4006
   4007	*len = (unsigned long)fp.data - (unsigned long)data;
   4008	return 0;
   4009}
   4010
   4011/**
   4012 * security_read_policy - read the policy.
   4013 * @state: selinux_state
   4014 * @data: binary policy data
   4015 * @len: length of data in bytes
   4016 *
   4017 */
   4018int security_read_policy(struct selinux_state *state,
   4019			 void **data, size_t *len)
   4020{
   4021	struct selinux_policy *policy;
   4022
   4023	policy = rcu_dereference_protected(
   4024			state->policy, lockdep_is_held(&state->policy_mutex));
   4025	if (!policy)
   4026		return -EINVAL;
   4027
   4028	*len = policy->policydb.len;
   4029	*data = vmalloc_user(*len);
   4030	if (!*data)
   4031		return -ENOMEM;
   4032
   4033	return __security_read_policy(policy, *data, len);
   4034}
   4035
   4036/**
   4037 * security_read_state_kernel - read the policy.
   4038 * @state: selinux_state
   4039 * @data: binary policy data
   4040 * @len: length of data in bytes
   4041 *
   4042 * Allocates kernel memory for reading SELinux policy.
   4043 * This function is for internal use only and should not
   4044 * be used for returning data to user space.
   4045 *
   4046 * This function must be called with policy_mutex held.
   4047 */
   4048int security_read_state_kernel(struct selinux_state *state,
   4049			       void **data, size_t *len)
   4050{
   4051	struct selinux_policy *policy;
   4052
   4053	policy = rcu_dereference_protected(
   4054			state->policy, lockdep_is_held(&state->policy_mutex));
   4055	if (!policy)
   4056		return -EINVAL;
   4057
   4058	*len = policy->policydb.len;
   4059	*data = vmalloc(*len);
   4060	if (!*data)
   4061		return -ENOMEM;
   4062
   4063	return __security_read_policy(policy, *data, len);
   4064}