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