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