xref: /openbmc/linux/security/selinux/hooks.c (revision 293d5b43)
1 /*
2  *  NSA Security-Enhanced Linux (SELinux) security module
3  *
4  *  This file contains the SELinux hook function implementations.
5  *
6  *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
7  *	      Chris Vance, <cvance@nai.com>
8  *	      Wayne Salamon, <wsalamon@nai.com>
9  *	      James Morris <jmorris@redhat.com>
10  *
11  *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
12  *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
13  *					   Eric Paris <eparis@redhat.com>
14  *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
15  *			    <dgoeddel@trustedcs.com>
16  *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
17  *	Paul Moore <paul@paul-moore.com>
18  *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
19  *		       Yuichi Nakamura <ynakam@hitachisoft.jp>
20  *
21  *	This program is free software; you can redistribute it and/or modify
22  *	it under the terms of the GNU General Public License version 2,
23  *	as published by the Free Software Foundation.
24  */
25 
26 #include <linux/init.h>
27 #include <linux/kd.h>
28 #include <linux/kernel.h>
29 #include <linux/tracehook.h>
30 #include <linux/errno.h>
31 #include <linux/sched.h>
32 #include <linux/lsm_hooks.h>
33 #include <linux/xattr.h>
34 #include <linux/capability.h>
35 #include <linux/unistd.h>
36 #include <linux/mm.h>
37 #include <linux/mman.h>
38 #include <linux/slab.h>
39 #include <linux/pagemap.h>
40 #include <linux/proc_fs.h>
41 #include <linux/swap.h>
42 #include <linux/spinlock.h>
43 #include <linux/syscalls.h>
44 #include <linux/dcache.h>
45 #include <linux/file.h>
46 #include <linux/fdtable.h>
47 #include <linux/namei.h>
48 #include <linux/mount.h>
49 #include <linux/netfilter_ipv4.h>
50 #include <linux/netfilter_ipv6.h>
51 #include <linux/tty.h>
52 #include <net/icmp.h>
53 #include <net/ip.h>		/* for local_port_range[] */
54 #include <net/tcp.h>		/* struct or_callable used in sock_rcv_skb */
55 #include <net/inet_connection_sock.h>
56 #include <net/net_namespace.h>
57 #include <net/netlabel.h>
58 #include <linux/uaccess.h>
59 #include <asm/ioctls.h>
60 #include <linux/atomic.h>
61 #include <linux/bitops.h>
62 #include <linux/interrupt.h>
63 #include <linux/netdevice.h>	/* for network interface checks */
64 #include <net/netlink.h>
65 #include <linux/tcp.h>
66 #include <linux/udp.h>
67 #include <linux/dccp.h>
68 #include <linux/quota.h>
69 #include <linux/un.h>		/* for Unix socket types */
70 #include <net/af_unix.h>	/* for Unix socket types */
71 #include <linux/parser.h>
72 #include <linux/nfs_mount.h>
73 #include <net/ipv6.h>
74 #include <linux/hugetlb.h>
75 #include <linux/personality.h>
76 #include <linux/audit.h>
77 #include <linux/string.h>
78 #include <linux/selinux.h>
79 #include <linux/mutex.h>
80 #include <linux/posix-timers.h>
81 #include <linux/syslog.h>
82 #include <linux/user_namespace.h>
83 #include <linux/export.h>
84 #include <linux/msg.h>
85 #include <linux/shm.h>
86 
87 #include "avc.h"
88 #include "objsec.h"
89 #include "netif.h"
90 #include "netnode.h"
91 #include "netport.h"
92 #include "xfrm.h"
93 #include "netlabel.h"
94 #include "audit.h"
95 #include "avc_ss.h"
96 
97 /* SECMARK reference count */
98 static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
99 
100 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
101 int selinux_enforcing;
102 
103 static int __init enforcing_setup(char *str)
104 {
105 	unsigned long enforcing;
106 	if (!kstrtoul(str, 0, &enforcing))
107 		selinux_enforcing = enforcing ? 1 : 0;
108 	return 1;
109 }
110 __setup("enforcing=", enforcing_setup);
111 #endif
112 
113 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
114 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
115 
116 static int __init selinux_enabled_setup(char *str)
117 {
118 	unsigned long enabled;
119 	if (!kstrtoul(str, 0, &enabled))
120 		selinux_enabled = enabled ? 1 : 0;
121 	return 1;
122 }
123 __setup("selinux=", selinux_enabled_setup);
124 #else
125 int selinux_enabled = 1;
126 #endif
127 
128 static struct kmem_cache *sel_inode_cache;
129 static struct kmem_cache *file_security_cache;
130 
131 /**
132  * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
133  *
134  * Description:
135  * This function checks the SECMARK reference counter to see if any SECMARK
136  * targets are currently configured, if the reference counter is greater than
137  * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
138  * enabled, false (0) if SECMARK is disabled.  If the always_check_network
139  * policy capability is enabled, SECMARK is always considered enabled.
140  *
141  */
142 static int selinux_secmark_enabled(void)
143 {
144 	return (selinux_policycap_alwaysnetwork || atomic_read(&selinux_secmark_refcount));
145 }
146 
147 /**
148  * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
149  *
150  * Description:
151  * This function checks if NetLabel or labeled IPSEC is enabled.  Returns true
152  * (1) if any are enabled or false (0) if neither are enabled.  If the
153  * always_check_network policy capability is enabled, peer labeling
154  * is always considered enabled.
155  *
156  */
157 static int selinux_peerlbl_enabled(void)
158 {
159 	return (selinux_policycap_alwaysnetwork || netlbl_enabled() || selinux_xfrm_enabled());
160 }
161 
162 static int selinux_netcache_avc_callback(u32 event)
163 {
164 	if (event == AVC_CALLBACK_RESET) {
165 		sel_netif_flush();
166 		sel_netnode_flush();
167 		sel_netport_flush();
168 		synchronize_net();
169 	}
170 	return 0;
171 }
172 
173 /*
174  * initialise the security for the init task
175  */
176 static void cred_init_security(void)
177 {
178 	struct cred *cred = (struct cred *) current->real_cred;
179 	struct task_security_struct *tsec;
180 
181 	tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
182 	if (!tsec)
183 		panic("SELinux:  Failed to initialize initial task.\n");
184 
185 	tsec->osid = tsec->sid = SECINITSID_KERNEL;
186 	cred->security = tsec;
187 }
188 
189 /*
190  * get the security ID of a set of credentials
191  */
192 static inline u32 cred_sid(const struct cred *cred)
193 {
194 	const struct task_security_struct *tsec;
195 
196 	tsec = cred->security;
197 	return tsec->sid;
198 }
199 
200 /*
201  * get the objective security ID of a task
202  */
203 static inline u32 task_sid(const struct task_struct *task)
204 {
205 	u32 sid;
206 
207 	rcu_read_lock();
208 	sid = cred_sid(__task_cred(task));
209 	rcu_read_unlock();
210 	return sid;
211 }
212 
213 /*
214  * get the subjective security ID of the current task
215  */
216 static inline u32 current_sid(void)
217 {
218 	const struct task_security_struct *tsec = current_security();
219 
220 	return tsec->sid;
221 }
222 
223 /* Allocate and free functions for each kind of security blob. */
224 
225 static int inode_alloc_security(struct inode *inode)
226 {
227 	struct inode_security_struct *isec;
228 	u32 sid = current_sid();
229 
230 	isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
231 	if (!isec)
232 		return -ENOMEM;
233 
234 	mutex_init(&isec->lock);
235 	INIT_LIST_HEAD(&isec->list);
236 	isec->inode = inode;
237 	isec->sid = SECINITSID_UNLABELED;
238 	isec->sclass = SECCLASS_FILE;
239 	isec->task_sid = sid;
240 	inode->i_security = isec;
241 
242 	return 0;
243 }
244 
245 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
246 
247 /*
248  * Try reloading inode security labels that have been marked as invalid.  The
249  * @may_sleep parameter indicates when sleeping and thus reloading labels is
250  * allowed; when set to false, returns ERR_PTR(-ECHILD) when the label is
251  * invalid.  The @opt_dentry parameter should be set to a dentry of the inode;
252  * when no dentry is available, set it to NULL instead.
253  */
254 static int __inode_security_revalidate(struct inode *inode,
255 				       struct dentry *opt_dentry,
256 				       bool may_sleep)
257 {
258 	struct inode_security_struct *isec = inode->i_security;
259 
260 	might_sleep_if(may_sleep);
261 
262 	if (ss_initialized && isec->initialized != LABEL_INITIALIZED) {
263 		if (!may_sleep)
264 			return -ECHILD;
265 
266 		/*
267 		 * Try reloading the inode security label.  This will fail if
268 		 * @opt_dentry is NULL and no dentry for this inode can be
269 		 * found; in that case, continue using the old label.
270 		 */
271 		inode_doinit_with_dentry(inode, opt_dentry);
272 	}
273 	return 0;
274 }
275 
276 static struct inode_security_struct *inode_security_novalidate(struct inode *inode)
277 {
278 	return inode->i_security;
279 }
280 
281 static struct inode_security_struct *inode_security_rcu(struct inode *inode, bool rcu)
282 {
283 	int error;
284 
285 	error = __inode_security_revalidate(inode, NULL, !rcu);
286 	if (error)
287 		return ERR_PTR(error);
288 	return inode->i_security;
289 }
290 
291 /*
292  * Get the security label of an inode.
293  */
294 static struct inode_security_struct *inode_security(struct inode *inode)
295 {
296 	__inode_security_revalidate(inode, NULL, true);
297 	return inode->i_security;
298 }
299 
300 static struct inode_security_struct *backing_inode_security_novalidate(struct dentry *dentry)
301 {
302 	struct inode *inode = d_backing_inode(dentry);
303 
304 	return inode->i_security;
305 }
306 
307 /*
308  * Get the security label of a dentry's backing inode.
309  */
310 static struct inode_security_struct *backing_inode_security(struct dentry *dentry)
311 {
312 	struct inode *inode = d_backing_inode(dentry);
313 
314 	__inode_security_revalidate(inode, dentry, true);
315 	return inode->i_security;
316 }
317 
318 static void inode_free_rcu(struct rcu_head *head)
319 {
320 	struct inode_security_struct *isec;
321 
322 	isec = container_of(head, struct inode_security_struct, rcu);
323 	kmem_cache_free(sel_inode_cache, isec);
324 }
325 
326 static void inode_free_security(struct inode *inode)
327 {
328 	struct inode_security_struct *isec = inode->i_security;
329 	struct superblock_security_struct *sbsec = inode->i_sb->s_security;
330 
331 	/*
332 	 * As not all inode security structures are in a list, we check for
333 	 * empty list outside of the lock to make sure that we won't waste
334 	 * time taking a lock doing nothing.
335 	 *
336 	 * The list_del_init() function can be safely called more than once.
337 	 * It should not be possible for this function to be called with
338 	 * concurrent list_add(), but for better safety against future changes
339 	 * in the code, we use list_empty_careful() here.
340 	 */
341 	if (!list_empty_careful(&isec->list)) {
342 		spin_lock(&sbsec->isec_lock);
343 		list_del_init(&isec->list);
344 		spin_unlock(&sbsec->isec_lock);
345 	}
346 
347 	/*
348 	 * The inode may still be referenced in a path walk and
349 	 * a call to selinux_inode_permission() can be made
350 	 * after inode_free_security() is called. Ideally, the VFS
351 	 * wouldn't do this, but fixing that is a much harder
352 	 * job. For now, simply free the i_security via RCU, and
353 	 * leave the current inode->i_security pointer intact.
354 	 * The inode will be freed after the RCU grace period too.
355 	 */
356 	call_rcu(&isec->rcu, inode_free_rcu);
357 }
358 
359 static int file_alloc_security(struct file *file)
360 {
361 	struct file_security_struct *fsec;
362 	u32 sid = current_sid();
363 
364 	fsec = kmem_cache_zalloc(file_security_cache, GFP_KERNEL);
365 	if (!fsec)
366 		return -ENOMEM;
367 
368 	fsec->sid = sid;
369 	fsec->fown_sid = sid;
370 	file->f_security = fsec;
371 
372 	return 0;
373 }
374 
375 static void file_free_security(struct file *file)
376 {
377 	struct file_security_struct *fsec = file->f_security;
378 	file->f_security = NULL;
379 	kmem_cache_free(file_security_cache, fsec);
380 }
381 
382 static int superblock_alloc_security(struct super_block *sb)
383 {
384 	struct superblock_security_struct *sbsec;
385 
386 	sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
387 	if (!sbsec)
388 		return -ENOMEM;
389 
390 	mutex_init(&sbsec->lock);
391 	INIT_LIST_HEAD(&sbsec->isec_head);
392 	spin_lock_init(&sbsec->isec_lock);
393 	sbsec->sb = sb;
394 	sbsec->sid = SECINITSID_UNLABELED;
395 	sbsec->def_sid = SECINITSID_FILE;
396 	sbsec->mntpoint_sid = SECINITSID_UNLABELED;
397 	sb->s_security = sbsec;
398 
399 	return 0;
400 }
401 
402 static void superblock_free_security(struct super_block *sb)
403 {
404 	struct superblock_security_struct *sbsec = sb->s_security;
405 	sb->s_security = NULL;
406 	kfree(sbsec);
407 }
408 
409 /* The file system's label must be initialized prior to use. */
410 
411 static const char *labeling_behaviors[7] = {
412 	"uses xattr",
413 	"uses transition SIDs",
414 	"uses task SIDs",
415 	"uses genfs_contexts",
416 	"not configured for labeling",
417 	"uses mountpoint labeling",
418 	"uses native labeling",
419 };
420 
421 static inline int inode_doinit(struct inode *inode)
422 {
423 	return inode_doinit_with_dentry(inode, NULL);
424 }
425 
426 enum {
427 	Opt_error = -1,
428 	Opt_context = 1,
429 	Opt_fscontext = 2,
430 	Opt_defcontext = 3,
431 	Opt_rootcontext = 4,
432 	Opt_labelsupport = 5,
433 	Opt_nextmntopt = 6,
434 };
435 
436 #define NUM_SEL_MNT_OPTS	(Opt_nextmntopt - 1)
437 
438 static const match_table_t tokens = {
439 	{Opt_context, CONTEXT_STR "%s"},
440 	{Opt_fscontext, FSCONTEXT_STR "%s"},
441 	{Opt_defcontext, DEFCONTEXT_STR "%s"},
442 	{Opt_rootcontext, ROOTCONTEXT_STR "%s"},
443 	{Opt_labelsupport, LABELSUPP_STR},
444 	{Opt_error, NULL},
445 };
446 
447 #define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
448 
449 static int may_context_mount_sb_relabel(u32 sid,
450 			struct superblock_security_struct *sbsec,
451 			const struct cred *cred)
452 {
453 	const struct task_security_struct *tsec = cred->security;
454 	int rc;
455 
456 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
457 			  FILESYSTEM__RELABELFROM, NULL);
458 	if (rc)
459 		return rc;
460 
461 	rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
462 			  FILESYSTEM__RELABELTO, NULL);
463 	return rc;
464 }
465 
466 static int may_context_mount_inode_relabel(u32 sid,
467 			struct superblock_security_struct *sbsec,
468 			const struct cred *cred)
469 {
470 	const struct task_security_struct *tsec = cred->security;
471 	int rc;
472 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
473 			  FILESYSTEM__RELABELFROM, NULL);
474 	if (rc)
475 		return rc;
476 
477 	rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
478 			  FILESYSTEM__ASSOCIATE, NULL);
479 	return rc;
480 }
481 
482 static int selinux_is_sblabel_mnt(struct super_block *sb)
483 {
484 	struct superblock_security_struct *sbsec = sb->s_security;
485 
486 	return sbsec->behavior == SECURITY_FS_USE_XATTR ||
487 		sbsec->behavior == SECURITY_FS_USE_TRANS ||
488 		sbsec->behavior == SECURITY_FS_USE_TASK ||
489 		sbsec->behavior == SECURITY_FS_USE_NATIVE ||
490 		/* Special handling. Genfs but also in-core setxattr handler */
491 		!strcmp(sb->s_type->name, "sysfs") ||
492 		!strcmp(sb->s_type->name, "pstore") ||
493 		!strcmp(sb->s_type->name, "debugfs") ||
494 		!strcmp(sb->s_type->name, "rootfs");
495 }
496 
497 static int sb_finish_set_opts(struct super_block *sb)
498 {
499 	struct superblock_security_struct *sbsec = sb->s_security;
500 	struct dentry *root = sb->s_root;
501 	struct inode *root_inode = d_backing_inode(root);
502 	int rc = 0;
503 
504 	if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
505 		/* Make sure that the xattr handler exists and that no
506 		   error other than -ENODATA is returned by getxattr on
507 		   the root directory.  -ENODATA is ok, as this may be
508 		   the first boot of the SELinux kernel before we have
509 		   assigned xattr values to the filesystem. */
510 		if (!root_inode->i_op->getxattr) {
511 			printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
512 			       "xattr support\n", sb->s_id, sb->s_type->name);
513 			rc = -EOPNOTSUPP;
514 			goto out;
515 		}
516 		rc = root_inode->i_op->getxattr(root, root_inode,
517 						XATTR_NAME_SELINUX, NULL, 0);
518 		if (rc < 0 && rc != -ENODATA) {
519 			if (rc == -EOPNOTSUPP)
520 				printk(KERN_WARNING "SELinux: (dev %s, type "
521 				       "%s) has no security xattr handler\n",
522 				       sb->s_id, sb->s_type->name);
523 			else
524 				printk(KERN_WARNING "SELinux: (dev %s, type "
525 				       "%s) getxattr errno %d\n", sb->s_id,
526 				       sb->s_type->name, -rc);
527 			goto out;
528 		}
529 	}
530 
531 	if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
532 		printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
533 		       sb->s_id, sb->s_type->name);
534 
535 	sbsec->flags |= SE_SBINITIALIZED;
536 	if (selinux_is_sblabel_mnt(sb))
537 		sbsec->flags |= SBLABEL_MNT;
538 
539 	/* Initialize the root inode. */
540 	rc = inode_doinit_with_dentry(root_inode, root);
541 
542 	/* Initialize any other inodes associated with the superblock, e.g.
543 	   inodes created prior to initial policy load or inodes created
544 	   during get_sb by a pseudo filesystem that directly
545 	   populates itself. */
546 	spin_lock(&sbsec->isec_lock);
547 next_inode:
548 	if (!list_empty(&sbsec->isec_head)) {
549 		struct inode_security_struct *isec =
550 				list_entry(sbsec->isec_head.next,
551 					   struct inode_security_struct, list);
552 		struct inode *inode = isec->inode;
553 		list_del_init(&isec->list);
554 		spin_unlock(&sbsec->isec_lock);
555 		inode = igrab(inode);
556 		if (inode) {
557 			if (!IS_PRIVATE(inode))
558 				inode_doinit(inode);
559 			iput(inode);
560 		}
561 		spin_lock(&sbsec->isec_lock);
562 		goto next_inode;
563 	}
564 	spin_unlock(&sbsec->isec_lock);
565 out:
566 	return rc;
567 }
568 
569 /*
570  * This function should allow an FS to ask what it's mount security
571  * options were so it can use those later for submounts, displaying
572  * mount options, or whatever.
573  */
574 static int selinux_get_mnt_opts(const struct super_block *sb,
575 				struct security_mnt_opts *opts)
576 {
577 	int rc = 0, i;
578 	struct superblock_security_struct *sbsec = sb->s_security;
579 	char *context = NULL;
580 	u32 len;
581 	char tmp;
582 
583 	security_init_mnt_opts(opts);
584 
585 	if (!(sbsec->flags & SE_SBINITIALIZED))
586 		return -EINVAL;
587 
588 	if (!ss_initialized)
589 		return -EINVAL;
590 
591 	/* make sure we always check enough bits to cover the mask */
592 	BUILD_BUG_ON(SE_MNTMASK >= (1 << NUM_SEL_MNT_OPTS));
593 
594 	tmp = sbsec->flags & SE_MNTMASK;
595 	/* count the number of mount options for this sb */
596 	for (i = 0; i < NUM_SEL_MNT_OPTS; i++) {
597 		if (tmp & 0x01)
598 			opts->num_mnt_opts++;
599 		tmp >>= 1;
600 	}
601 	/* Check if the Label support flag is set */
602 	if (sbsec->flags & SBLABEL_MNT)
603 		opts->num_mnt_opts++;
604 
605 	opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
606 	if (!opts->mnt_opts) {
607 		rc = -ENOMEM;
608 		goto out_free;
609 	}
610 
611 	opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
612 	if (!opts->mnt_opts_flags) {
613 		rc = -ENOMEM;
614 		goto out_free;
615 	}
616 
617 	i = 0;
618 	if (sbsec->flags & FSCONTEXT_MNT) {
619 		rc = security_sid_to_context(sbsec->sid, &context, &len);
620 		if (rc)
621 			goto out_free;
622 		opts->mnt_opts[i] = context;
623 		opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
624 	}
625 	if (sbsec->flags & CONTEXT_MNT) {
626 		rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
627 		if (rc)
628 			goto out_free;
629 		opts->mnt_opts[i] = context;
630 		opts->mnt_opts_flags[i++] = CONTEXT_MNT;
631 	}
632 	if (sbsec->flags & DEFCONTEXT_MNT) {
633 		rc = security_sid_to_context(sbsec->def_sid, &context, &len);
634 		if (rc)
635 			goto out_free;
636 		opts->mnt_opts[i] = context;
637 		opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
638 	}
639 	if (sbsec->flags & ROOTCONTEXT_MNT) {
640 		struct dentry *root = sbsec->sb->s_root;
641 		struct inode_security_struct *isec = backing_inode_security(root);
642 
643 		rc = security_sid_to_context(isec->sid, &context, &len);
644 		if (rc)
645 			goto out_free;
646 		opts->mnt_opts[i] = context;
647 		opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
648 	}
649 	if (sbsec->flags & SBLABEL_MNT) {
650 		opts->mnt_opts[i] = NULL;
651 		opts->mnt_opts_flags[i++] = SBLABEL_MNT;
652 	}
653 
654 	BUG_ON(i != opts->num_mnt_opts);
655 
656 	return 0;
657 
658 out_free:
659 	security_free_mnt_opts(opts);
660 	return rc;
661 }
662 
663 static int bad_option(struct superblock_security_struct *sbsec, char flag,
664 		      u32 old_sid, u32 new_sid)
665 {
666 	char mnt_flags = sbsec->flags & SE_MNTMASK;
667 
668 	/* check if the old mount command had the same options */
669 	if (sbsec->flags & SE_SBINITIALIZED)
670 		if (!(sbsec->flags & flag) ||
671 		    (old_sid != new_sid))
672 			return 1;
673 
674 	/* check if we were passed the same options twice,
675 	 * aka someone passed context=a,context=b
676 	 */
677 	if (!(sbsec->flags & SE_SBINITIALIZED))
678 		if (mnt_flags & flag)
679 			return 1;
680 	return 0;
681 }
682 
683 /*
684  * Allow filesystems with binary mount data to explicitly set mount point
685  * labeling information.
686  */
687 static int selinux_set_mnt_opts(struct super_block *sb,
688 				struct security_mnt_opts *opts,
689 				unsigned long kern_flags,
690 				unsigned long *set_kern_flags)
691 {
692 	const struct cred *cred = current_cred();
693 	int rc = 0, i;
694 	struct superblock_security_struct *sbsec = sb->s_security;
695 	const char *name = sb->s_type->name;
696 	struct dentry *root = sbsec->sb->s_root;
697 	struct inode_security_struct *root_isec;
698 	u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
699 	u32 defcontext_sid = 0;
700 	char **mount_options = opts->mnt_opts;
701 	int *flags = opts->mnt_opts_flags;
702 	int num_opts = opts->num_mnt_opts;
703 
704 	mutex_lock(&sbsec->lock);
705 
706 	if (!ss_initialized) {
707 		if (!num_opts) {
708 			/* Defer initialization until selinux_complete_init,
709 			   after the initial policy is loaded and the security
710 			   server is ready to handle calls. */
711 			goto out;
712 		}
713 		rc = -EINVAL;
714 		printk(KERN_WARNING "SELinux: Unable to set superblock options "
715 			"before the security server is initialized\n");
716 		goto out;
717 	}
718 	if (kern_flags && !set_kern_flags) {
719 		/* Specifying internal flags without providing a place to
720 		 * place the results is not allowed */
721 		rc = -EINVAL;
722 		goto out;
723 	}
724 
725 	/*
726 	 * Binary mount data FS will come through this function twice.  Once
727 	 * from an explicit call and once from the generic calls from the vfs.
728 	 * Since the generic VFS calls will not contain any security mount data
729 	 * we need to skip the double mount verification.
730 	 *
731 	 * This does open a hole in which we will not notice if the first
732 	 * mount using this sb set explict options and a second mount using
733 	 * this sb does not set any security options.  (The first options
734 	 * will be used for both mounts)
735 	 */
736 	if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
737 	    && (num_opts == 0))
738 		goto out;
739 
740 	root_isec = backing_inode_security_novalidate(root);
741 
742 	/*
743 	 * parse the mount options, check if they are valid sids.
744 	 * also check if someone is trying to mount the same sb more
745 	 * than once with different security options.
746 	 */
747 	for (i = 0; i < num_opts; i++) {
748 		u32 sid;
749 
750 		if (flags[i] == SBLABEL_MNT)
751 			continue;
752 		rc = security_context_str_to_sid(mount_options[i], &sid, GFP_KERNEL);
753 		if (rc) {
754 			printk(KERN_WARNING "SELinux: security_context_str_to_sid"
755 			       "(%s) failed for (dev %s, type %s) errno=%d\n",
756 			       mount_options[i], sb->s_id, name, rc);
757 			goto out;
758 		}
759 		switch (flags[i]) {
760 		case FSCONTEXT_MNT:
761 			fscontext_sid = sid;
762 
763 			if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
764 					fscontext_sid))
765 				goto out_double_mount;
766 
767 			sbsec->flags |= FSCONTEXT_MNT;
768 			break;
769 		case CONTEXT_MNT:
770 			context_sid = sid;
771 
772 			if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
773 					context_sid))
774 				goto out_double_mount;
775 
776 			sbsec->flags |= CONTEXT_MNT;
777 			break;
778 		case ROOTCONTEXT_MNT:
779 			rootcontext_sid = sid;
780 
781 			if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
782 					rootcontext_sid))
783 				goto out_double_mount;
784 
785 			sbsec->flags |= ROOTCONTEXT_MNT;
786 
787 			break;
788 		case DEFCONTEXT_MNT:
789 			defcontext_sid = sid;
790 
791 			if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
792 					defcontext_sid))
793 				goto out_double_mount;
794 
795 			sbsec->flags |= DEFCONTEXT_MNT;
796 
797 			break;
798 		default:
799 			rc = -EINVAL;
800 			goto out;
801 		}
802 	}
803 
804 	if (sbsec->flags & SE_SBINITIALIZED) {
805 		/* previously mounted with options, but not on this attempt? */
806 		if ((sbsec->flags & SE_MNTMASK) && !num_opts)
807 			goto out_double_mount;
808 		rc = 0;
809 		goto out;
810 	}
811 
812 	if (strcmp(sb->s_type->name, "proc") == 0)
813 		sbsec->flags |= SE_SBPROC | SE_SBGENFS;
814 
815 	if (!strcmp(sb->s_type->name, "debugfs") ||
816 	    !strcmp(sb->s_type->name, "sysfs") ||
817 	    !strcmp(sb->s_type->name, "pstore"))
818 		sbsec->flags |= SE_SBGENFS;
819 
820 	if (!sbsec->behavior) {
821 		/*
822 		 * Determine the labeling behavior to use for this
823 		 * filesystem type.
824 		 */
825 		rc = security_fs_use(sb);
826 		if (rc) {
827 			printk(KERN_WARNING
828 				"%s: security_fs_use(%s) returned %d\n",
829 					__func__, sb->s_type->name, rc);
830 			goto out;
831 		}
832 	}
833 
834 	/*
835 	 * If this is a user namespace mount, no contexts are allowed
836 	 * on the command line and security labels must be ignored.
837 	 */
838 	if (sb->s_user_ns != &init_user_ns) {
839 		if (context_sid || fscontext_sid || rootcontext_sid ||
840 		    defcontext_sid) {
841 			rc = -EACCES;
842 			goto out;
843 		}
844 		if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
845 			sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
846 			rc = security_transition_sid(current_sid(), current_sid(),
847 						     SECCLASS_FILE, NULL,
848 						     &sbsec->mntpoint_sid);
849 			if (rc)
850 				goto out;
851 		}
852 		goto out_set_opts;
853 	}
854 
855 	/* sets the context of the superblock for the fs being mounted. */
856 	if (fscontext_sid) {
857 		rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
858 		if (rc)
859 			goto out;
860 
861 		sbsec->sid = fscontext_sid;
862 	}
863 
864 	/*
865 	 * Switch to using mount point labeling behavior.
866 	 * sets the label used on all file below the mountpoint, and will set
867 	 * the superblock context if not already set.
868 	 */
869 	if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !context_sid) {
870 		sbsec->behavior = SECURITY_FS_USE_NATIVE;
871 		*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
872 	}
873 
874 	if (context_sid) {
875 		if (!fscontext_sid) {
876 			rc = may_context_mount_sb_relabel(context_sid, sbsec,
877 							  cred);
878 			if (rc)
879 				goto out;
880 			sbsec->sid = context_sid;
881 		} else {
882 			rc = may_context_mount_inode_relabel(context_sid, sbsec,
883 							     cred);
884 			if (rc)
885 				goto out;
886 		}
887 		if (!rootcontext_sid)
888 			rootcontext_sid = context_sid;
889 
890 		sbsec->mntpoint_sid = context_sid;
891 		sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
892 	}
893 
894 	if (rootcontext_sid) {
895 		rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
896 						     cred);
897 		if (rc)
898 			goto out;
899 
900 		root_isec->sid = rootcontext_sid;
901 		root_isec->initialized = LABEL_INITIALIZED;
902 	}
903 
904 	if (defcontext_sid) {
905 		if (sbsec->behavior != SECURITY_FS_USE_XATTR &&
906 			sbsec->behavior != SECURITY_FS_USE_NATIVE) {
907 			rc = -EINVAL;
908 			printk(KERN_WARNING "SELinux: defcontext option is "
909 			       "invalid for this filesystem type\n");
910 			goto out;
911 		}
912 
913 		if (defcontext_sid != sbsec->def_sid) {
914 			rc = may_context_mount_inode_relabel(defcontext_sid,
915 							     sbsec, cred);
916 			if (rc)
917 				goto out;
918 		}
919 
920 		sbsec->def_sid = defcontext_sid;
921 	}
922 
923 out_set_opts:
924 	rc = sb_finish_set_opts(sb);
925 out:
926 	mutex_unlock(&sbsec->lock);
927 	return rc;
928 out_double_mount:
929 	rc = -EINVAL;
930 	printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, different "
931 	       "security settings for (dev %s, type %s)\n", sb->s_id, name);
932 	goto out;
933 }
934 
935 static int selinux_cmp_sb_context(const struct super_block *oldsb,
936 				    const struct super_block *newsb)
937 {
938 	struct superblock_security_struct *old = oldsb->s_security;
939 	struct superblock_security_struct *new = newsb->s_security;
940 	char oldflags = old->flags & SE_MNTMASK;
941 	char newflags = new->flags & SE_MNTMASK;
942 
943 	if (oldflags != newflags)
944 		goto mismatch;
945 	if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
946 		goto mismatch;
947 	if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
948 		goto mismatch;
949 	if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
950 		goto mismatch;
951 	if (oldflags & ROOTCONTEXT_MNT) {
952 		struct inode_security_struct *oldroot = backing_inode_security(oldsb->s_root);
953 		struct inode_security_struct *newroot = backing_inode_security(newsb->s_root);
954 		if (oldroot->sid != newroot->sid)
955 			goto mismatch;
956 	}
957 	return 0;
958 mismatch:
959 	printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, "
960 			    "different security settings for (dev %s, "
961 			    "type %s)\n", newsb->s_id, newsb->s_type->name);
962 	return -EBUSY;
963 }
964 
965 static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
966 					struct super_block *newsb)
967 {
968 	const struct superblock_security_struct *oldsbsec = oldsb->s_security;
969 	struct superblock_security_struct *newsbsec = newsb->s_security;
970 
971 	int set_fscontext =	(oldsbsec->flags & FSCONTEXT_MNT);
972 	int set_context =	(oldsbsec->flags & CONTEXT_MNT);
973 	int set_rootcontext =	(oldsbsec->flags & ROOTCONTEXT_MNT);
974 
975 	/*
976 	 * if the parent was able to be mounted it clearly had no special lsm
977 	 * mount options.  thus we can safely deal with this superblock later
978 	 */
979 	if (!ss_initialized)
980 		return 0;
981 
982 	/* how can we clone if the old one wasn't set up?? */
983 	BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
984 
985 	/* if fs is reusing a sb, make sure that the contexts match */
986 	if (newsbsec->flags & SE_SBINITIALIZED)
987 		return selinux_cmp_sb_context(oldsb, newsb);
988 
989 	mutex_lock(&newsbsec->lock);
990 
991 	newsbsec->flags = oldsbsec->flags;
992 
993 	newsbsec->sid = oldsbsec->sid;
994 	newsbsec->def_sid = oldsbsec->def_sid;
995 	newsbsec->behavior = oldsbsec->behavior;
996 
997 	if (set_context) {
998 		u32 sid = oldsbsec->mntpoint_sid;
999 
1000 		if (!set_fscontext)
1001 			newsbsec->sid = sid;
1002 		if (!set_rootcontext) {
1003 			struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
1004 			newisec->sid = sid;
1005 		}
1006 		newsbsec->mntpoint_sid = sid;
1007 	}
1008 	if (set_rootcontext) {
1009 		const struct inode_security_struct *oldisec = backing_inode_security(oldsb->s_root);
1010 		struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
1011 
1012 		newisec->sid = oldisec->sid;
1013 	}
1014 
1015 	sb_finish_set_opts(newsb);
1016 	mutex_unlock(&newsbsec->lock);
1017 	return 0;
1018 }
1019 
1020 static int selinux_parse_opts_str(char *options,
1021 				  struct security_mnt_opts *opts)
1022 {
1023 	char *p;
1024 	char *context = NULL, *defcontext = NULL;
1025 	char *fscontext = NULL, *rootcontext = NULL;
1026 	int rc, num_mnt_opts = 0;
1027 
1028 	opts->num_mnt_opts = 0;
1029 
1030 	/* Standard string-based options. */
1031 	while ((p = strsep(&options, "|")) != NULL) {
1032 		int token;
1033 		substring_t args[MAX_OPT_ARGS];
1034 
1035 		if (!*p)
1036 			continue;
1037 
1038 		token = match_token(p, tokens, args);
1039 
1040 		switch (token) {
1041 		case Opt_context:
1042 			if (context || defcontext) {
1043 				rc = -EINVAL;
1044 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1045 				goto out_err;
1046 			}
1047 			context = match_strdup(&args[0]);
1048 			if (!context) {
1049 				rc = -ENOMEM;
1050 				goto out_err;
1051 			}
1052 			break;
1053 
1054 		case Opt_fscontext:
1055 			if (fscontext) {
1056 				rc = -EINVAL;
1057 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1058 				goto out_err;
1059 			}
1060 			fscontext = match_strdup(&args[0]);
1061 			if (!fscontext) {
1062 				rc = -ENOMEM;
1063 				goto out_err;
1064 			}
1065 			break;
1066 
1067 		case Opt_rootcontext:
1068 			if (rootcontext) {
1069 				rc = -EINVAL;
1070 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1071 				goto out_err;
1072 			}
1073 			rootcontext = match_strdup(&args[0]);
1074 			if (!rootcontext) {
1075 				rc = -ENOMEM;
1076 				goto out_err;
1077 			}
1078 			break;
1079 
1080 		case Opt_defcontext:
1081 			if (context || defcontext) {
1082 				rc = -EINVAL;
1083 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1084 				goto out_err;
1085 			}
1086 			defcontext = match_strdup(&args[0]);
1087 			if (!defcontext) {
1088 				rc = -ENOMEM;
1089 				goto out_err;
1090 			}
1091 			break;
1092 		case Opt_labelsupport:
1093 			break;
1094 		default:
1095 			rc = -EINVAL;
1096 			printk(KERN_WARNING "SELinux:  unknown mount option\n");
1097 			goto out_err;
1098 
1099 		}
1100 	}
1101 
1102 	rc = -ENOMEM;
1103 	opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
1104 	if (!opts->mnt_opts)
1105 		goto out_err;
1106 
1107 	opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
1108 	if (!opts->mnt_opts_flags) {
1109 		kfree(opts->mnt_opts);
1110 		goto out_err;
1111 	}
1112 
1113 	if (fscontext) {
1114 		opts->mnt_opts[num_mnt_opts] = fscontext;
1115 		opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
1116 	}
1117 	if (context) {
1118 		opts->mnt_opts[num_mnt_opts] = context;
1119 		opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
1120 	}
1121 	if (rootcontext) {
1122 		opts->mnt_opts[num_mnt_opts] = rootcontext;
1123 		opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
1124 	}
1125 	if (defcontext) {
1126 		opts->mnt_opts[num_mnt_opts] = defcontext;
1127 		opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
1128 	}
1129 
1130 	opts->num_mnt_opts = num_mnt_opts;
1131 	return 0;
1132 
1133 out_err:
1134 	kfree(context);
1135 	kfree(defcontext);
1136 	kfree(fscontext);
1137 	kfree(rootcontext);
1138 	return rc;
1139 }
1140 /*
1141  * string mount options parsing and call set the sbsec
1142  */
1143 static int superblock_doinit(struct super_block *sb, void *data)
1144 {
1145 	int rc = 0;
1146 	char *options = data;
1147 	struct security_mnt_opts opts;
1148 
1149 	security_init_mnt_opts(&opts);
1150 
1151 	if (!data)
1152 		goto out;
1153 
1154 	BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
1155 
1156 	rc = selinux_parse_opts_str(options, &opts);
1157 	if (rc)
1158 		goto out_err;
1159 
1160 out:
1161 	rc = selinux_set_mnt_opts(sb, &opts, 0, NULL);
1162 
1163 out_err:
1164 	security_free_mnt_opts(&opts);
1165 	return rc;
1166 }
1167 
1168 static void selinux_write_opts(struct seq_file *m,
1169 			       struct security_mnt_opts *opts)
1170 {
1171 	int i;
1172 	char *prefix;
1173 
1174 	for (i = 0; i < opts->num_mnt_opts; i++) {
1175 		char *has_comma;
1176 
1177 		if (opts->mnt_opts[i])
1178 			has_comma = strchr(opts->mnt_opts[i], ',');
1179 		else
1180 			has_comma = NULL;
1181 
1182 		switch (opts->mnt_opts_flags[i]) {
1183 		case CONTEXT_MNT:
1184 			prefix = CONTEXT_STR;
1185 			break;
1186 		case FSCONTEXT_MNT:
1187 			prefix = FSCONTEXT_STR;
1188 			break;
1189 		case ROOTCONTEXT_MNT:
1190 			prefix = ROOTCONTEXT_STR;
1191 			break;
1192 		case DEFCONTEXT_MNT:
1193 			prefix = DEFCONTEXT_STR;
1194 			break;
1195 		case SBLABEL_MNT:
1196 			seq_putc(m, ',');
1197 			seq_puts(m, LABELSUPP_STR);
1198 			continue;
1199 		default:
1200 			BUG();
1201 			return;
1202 		};
1203 		/* we need a comma before each option */
1204 		seq_putc(m, ',');
1205 		seq_puts(m, prefix);
1206 		if (has_comma)
1207 			seq_putc(m, '\"');
1208 		seq_escape(m, opts->mnt_opts[i], "\"\n\\");
1209 		if (has_comma)
1210 			seq_putc(m, '\"');
1211 	}
1212 }
1213 
1214 static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1215 {
1216 	struct security_mnt_opts opts;
1217 	int rc;
1218 
1219 	rc = selinux_get_mnt_opts(sb, &opts);
1220 	if (rc) {
1221 		/* before policy load we may get EINVAL, don't show anything */
1222 		if (rc == -EINVAL)
1223 			rc = 0;
1224 		return rc;
1225 	}
1226 
1227 	selinux_write_opts(m, &opts);
1228 
1229 	security_free_mnt_opts(&opts);
1230 
1231 	return rc;
1232 }
1233 
1234 static inline u16 inode_mode_to_security_class(umode_t mode)
1235 {
1236 	switch (mode & S_IFMT) {
1237 	case S_IFSOCK:
1238 		return SECCLASS_SOCK_FILE;
1239 	case S_IFLNK:
1240 		return SECCLASS_LNK_FILE;
1241 	case S_IFREG:
1242 		return SECCLASS_FILE;
1243 	case S_IFBLK:
1244 		return SECCLASS_BLK_FILE;
1245 	case S_IFDIR:
1246 		return SECCLASS_DIR;
1247 	case S_IFCHR:
1248 		return SECCLASS_CHR_FILE;
1249 	case S_IFIFO:
1250 		return SECCLASS_FIFO_FILE;
1251 
1252 	}
1253 
1254 	return SECCLASS_FILE;
1255 }
1256 
1257 static inline int default_protocol_stream(int protocol)
1258 {
1259 	return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1260 }
1261 
1262 static inline int default_protocol_dgram(int protocol)
1263 {
1264 	return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1265 }
1266 
1267 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1268 {
1269 	switch (family) {
1270 	case PF_UNIX:
1271 		switch (type) {
1272 		case SOCK_STREAM:
1273 		case SOCK_SEQPACKET:
1274 			return SECCLASS_UNIX_STREAM_SOCKET;
1275 		case SOCK_DGRAM:
1276 			return SECCLASS_UNIX_DGRAM_SOCKET;
1277 		}
1278 		break;
1279 	case PF_INET:
1280 	case PF_INET6:
1281 		switch (type) {
1282 		case SOCK_STREAM:
1283 			if (default_protocol_stream(protocol))
1284 				return SECCLASS_TCP_SOCKET;
1285 			else
1286 				return SECCLASS_RAWIP_SOCKET;
1287 		case SOCK_DGRAM:
1288 			if (default_protocol_dgram(protocol))
1289 				return SECCLASS_UDP_SOCKET;
1290 			else
1291 				return SECCLASS_RAWIP_SOCKET;
1292 		case SOCK_DCCP:
1293 			return SECCLASS_DCCP_SOCKET;
1294 		default:
1295 			return SECCLASS_RAWIP_SOCKET;
1296 		}
1297 		break;
1298 	case PF_NETLINK:
1299 		switch (protocol) {
1300 		case NETLINK_ROUTE:
1301 			return SECCLASS_NETLINK_ROUTE_SOCKET;
1302 		case NETLINK_SOCK_DIAG:
1303 			return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1304 		case NETLINK_NFLOG:
1305 			return SECCLASS_NETLINK_NFLOG_SOCKET;
1306 		case NETLINK_XFRM:
1307 			return SECCLASS_NETLINK_XFRM_SOCKET;
1308 		case NETLINK_SELINUX:
1309 			return SECCLASS_NETLINK_SELINUX_SOCKET;
1310 		case NETLINK_ISCSI:
1311 			return SECCLASS_NETLINK_ISCSI_SOCKET;
1312 		case NETLINK_AUDIT:
1313 			return SECCLASS_NETLINK_AUDIT_SOCKET;
1314 		case NETLINK_FIB_LOOKUP:
1315 			return SECCLASS_NETLINK_FIB_LOOKUP_SOCKET;
1316 		case NETLINK_CONNECTOR:
1317 			return SECCLASS_NETLINK_CONNECTOR_SOCKET;
1318 		case NETLINK_NETFILTER:
1319 			return SECCLASS_NETLINK_NETFILTER_SOCKET;
1320 		case NETLINK_DNRTMSG:
1321 			return SECCLASS_NETLINK_DNRT_SOCKET;
1322 		case NETLINK_KOBJECT_UEVENT:
1323 			return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1324 		case NETLINK_GENERIC:
1325 			return SECCLASS_NETLINK_GENERIC_SOCKET;
1326 		case NETLINK_SCSITRANSPORT:
1327 			return SECCLASS_NETLINK_SCSITRANSPORT_SOCKET;
1328 		case NETLINK_RDMA:
1329 			return SECCLASS_NETLINK_RDMA_SOCKET;
1330 		case NETLINK_CRYPTO:
1331 			return SECCLASS_NETLINK_CRYPTO_SOCKET;
1332 		default:
1333 			return SECCLASS_NETLINK_SOCKET;
1334 		}
1335 	case PF_PACKET:
1336 		return SECCLASS_PACKET_SOCKET;
1337 	case PF_KEY:
1338 		return SECCLASS_KEY_SOCKET;
1339 	case PF_APPLETALK:
1340 		return SECCLASS_APPLETALK_SOCKET;
1341 	}
1342 
1343 	return SECCLASS_SOCKET;
1344 }
1345 
1346 static int selinux_genfs_get_sid(struct dentry *dentry,
1347 				 u16 tclass,
1348 				 u16 flags,
1349 				 u32 *sid)
1350 {
1351 	int rc;
1352 	struct super_block *sb = dentry->d_sb;
1353 	char *buffer, *path;
1354 
1355 	buffer = (char *)__get_free_page(GFP_KERNEL);
1356 	if (!buffer)
1357 		return -ENOMEM;
1358 
1359 	path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1360 	if (IS_ERR(path))
1361 		rc = PTR_ERR(path);
1362 	else {
1363 		if (flags & SE_SBPROC) {
1364 			/* each process gets a /proc/PID/ entry. Strip off the
1365 			 * PID part to get a valid selinux labeling.
1366 			 * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1367 			while (path[1] >= '0' && path[1] <= '9') {
1368 				path[1] = '/';
1369 				path++;
1370 			}
1371 		}
1372 		rc = security_genfs_sid(sb->s_type->name, path, tclass, sid);
1373 	}
1374 	free_page((unsigned long)buffer);
1375 	return rc;
1376 }
1377 
1378 /* The inode's security attributes must be initialized before first use. */
1379 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1380 {
1381 	struct superblock_security_struct *sbsec = NULL;
1382 	struct inode_security_struct *isec = inode->i_security;
1383 	u32 sid;
1384 	struct dentry *dentry;
1385 #define INITCONTEXTLEN 255
1386 	char *context = NULL;
1387 	unsigned len = 0;
1388 	int rc = 0;
1389 
1390 	if (isec->initialized == LABEL_INITIALIZED)
1391 		goto out;
1392 
1393 	mutex_lock(&isec->lock);
1394 	if (isec->initialized == LABEL_INITIALIZED)
1395 		goto out_unlock;
1396 
1397 	sbsec = inode->i_sb->s_security;
1398 	if (!(sbsec->flags & SE_SBINITIALIZED)) {
1399 		/* Defer initialization until selinux_complete_init,
1400 		   after the initial policy is loaded and the security
1401 		   server is ready to handle calls. */
1402 		spin_lock(&sbsec->isec_lock);
1403 		if (list_empty(&isec->list))
1404 			list_add(&isec->list, &sbsec->isec_head);
1405 		spin_unlock(&sbsec->isec_lock);
1406 		goto out_unlock;
1407 	}
1408 
1409 	switch (sbsec->behavior) {
1410 	case SECURITY_FS_USE_NATIVE:
1411 		break;
1412 	case SECURITY_FS_USE_XATTR:
1413 		if (!inode->i_op->getxattr) {
1414 			isec->sid = sbsec->def_sid;
1415 			break;
1416 		}
1417 
1418 		/* Need a dentry, since the xattr API requires one.
1419 		   Life would be simpler if we could just pass the inode. */
1420 		if (opt_dentry) {
1421 			/* Called from d_instantiate or d_splice_alias. */
1422 			dentry = dget(opt_dentry);
1423 		} else {
1424 			/* Called from selinux_complete_init, try to find a dentry. */
1425 			dentry = d_find_alias(inode);
1426 		}
1427 		if (!dentry) {
1428 			/*
1429 			 * this is can be hit on boot when a file is accessed
1430 			 * before the policy is loaded.  When we load policy we
1431 			 * may find inodes that have no dentry on the
1432 			 * sbsec->isec_head list.  No reason to complain as these
1433 			 * will get fixed up the next time we go through
1434 			 * inode_doinit with a dentry, before these inodes could
1435 			 * be used again by userspace.
1436 			 */
1437 			goto out_unlock;
1438 		}
1439 
1440 		len = INITCONTEXTLEN;
1441 		context = kmalloc(len+1, GFP_NOFS);
1442 		if (!context) {
1443 			rc = -ENOMEM;
1444 			dput(dentry);
1445 			goto out_unlock;
1446 		}
1447 		context[len] = '\0';
1448 		rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX,
1449 					   context, len);
1450 		if (rc == -ERANGE) {
1451 			kfree(context);
1452 
1453 			/* Need a larger buffer.  Query for the right size. */
1454 			rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX,
1455 						   NULL, 0);
1456 			if (rc < 0) {
1457 				dput(dentry);
1458 				goto out_unlock;
1459 			}
1460 			len = rc;
1461 			context = kmalloc(len+1, GFP_NOFS);
1462 			if (!context) {
1463 				rc = -ENOMEM;
1464 				dput(dentry);
1465 				goto out_unlock;
1466 			}
1467 			context[len] = '\0';
1468 			rc = inode->i_op->getxattr(dentry, inode,
1469 						   XATTR_NAME_SELINUX,
1470 						   context, len);
1471 		}
1472 		dput(dentry);
1473 		if (rc < 0) {
1474 			if (rc != -ENODATA) {
1475 				printk(KERN_WARNING "SELinux: %s:  getxattr returned "
1476 				       "%d for dev=%s ino=%ld\n", __func__,
1477 				       -rc, inode->i_sb->s_id, inode->i_ino);
1478 				kfree(context);
1479 				goto out_unlock;
1480 			}
1481 			/* Map ENODATA to the default file SID */
1482 			sid = sbsec->def_sid;
1483 			rc = 0;
1484 		} else {
1485 			rc = security_context_to_sid_default(context, rc, &sid,
1486 							     sbsec->def_sid,
1487 							     GFP_NOFS);
1488 			if (rc) {
1489 				char *dev = inode->i_sb->s_id;
1490 				unsigned long ino = inode->i_ino;
1491 
1492 				if (rc == -EINVAL) {
1493 					if (printk_ratelimit())
1494 						printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1495 							"context=%s.  This indicates you may need to relabel the inode or the "
1496 							"filesystem in question.\n", ino, dev, context);
1497 				} else {
1498 					printk(KERN_WARNING "SELinux: %s:  context_to_sid(%s) "
1499 					       "returned %d for dev=%s ino=%ld\n",
1500 					       __func__, context, -rc, dev, ino);
1501 				}
1502 				kfree(context);
1503 				/* Leave with the unlabeled SID */
1504 				rc = 0;
1505 				break;
1506 			}
1507 		}
1508 		kfree(context);
1509 		isec->sid = sid;
1510 		break;
1511 	case SECURITY_FS_USE_TASK:
1512 		isec->sid = isec->task_sid;
1513 		break;
1514 	case SECURITY_FS_USE_TRANS:
1515 		/* Default to the fs SID. */
1516 		isec->sid = sbsec->sid;
1517 
1518 		/* Try to obtain a transition SID. */
1519 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
1520 		rc = security_transition_sid(isec->task_sid, sbsec->sid,
1521 					     isec->sclass, NULL, &sid);
1522 		if (rc)
1523 			goto out_unlock;
1524 		isec->sid = sid;
1525 		break;
1526 	case SECURITY_FS_USE_MNTPOINT:
1527 		isec->sid = sbsec->mntpoint_sid;
1528 		break;
1529 	default:
1530 		/* Default to the fs superblock SID. */
1531 		isec->sid = sbsec->sid;
1532 
1533 		if ((sbsec->flags & SE_SBGENFS) && !S_ISLNK(inode->i_mode)) {
1534 			/* We must have a dentry to determine the label on
1535 			 * procfs inodes */
1536 			if (opt_dentry)
1537 				/* Called from d_instantiate or
1538 				 * d_splice_alias. */
1539 				dentry = dget(opt_dentry);
1540 			else
1541 				/* Called from selinux_complete_init, try to
1542 				 * find a dentry. */
1543 				dentry = d_find_alias(inode);
1544 			/*
1545 			 * This can be hit on boot when a file is accessed
1546 			 * before the policy is loaded.  When we load policy we
1547 			 * may find inodes that have no dentry on the
1548 			 * sbsec->isec_head list.  No reason to complain as
1549 			 * these will get fixed up the next time we go through
1550 			 * inode_doinit() with a dentry, before these inodes
1551 			 * could be used again by userspace.
1552 			 */
1553 			if (!dentry)
1554 				goto out_unlock;
1555 			isec->sclass = inode_mode_to_security_class(inode->i_mode);
1556 			rc = selinux_genfs_get_sid(dentry, isec->sclass,
1557 						   sbsec->flags, &sid);
1558 			dput(dentry);
1559 			if (rc)
1560 				goto out_unlock;
1561 			isec->sid = sid;
1562 		}
1563 		break;
1564 	}
1565 
1566 	isec->initialized = LABEL_INITIALIZED;
1567 
1568 out_unlock:
1569 	mutex_unlock(&isec->lock);
1570 out:
1571 	if (isec->sclass == SECCLASS_FILE)
1572 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
1573 	return rc;
1574 }
1575 
1576 /* Convert a Linux signal to an access vector. */
1577 static inline u32 signal_to_av(int sig)
1578 {
1579 	u32 perm = 0;
1580 
1581 	switch (sig) {
1582 	case SIGCHLD:
1583 		/* Commonly granted from child to parent. */
1584 		perm = PROCESS__SIGCHLD;
1585 		break;
1586 	case SIGKILL:
1587 		/* Cannot be caught or ignored */
1588 		perm = PROCESS__SIGKILL;
1589 		break;
1590 	case SIGSTOP:
1591 		/* Cannot be caught or ignored */
1592 		perm = PROCESS__SIGSTOP;
1593 		break;
1594 	default:
1595 		/* All other signals. */
1596 		perm = PROCESS__SIGNAL;
1597 		break;
1598 	}
1599 
1600 	return perm;
1601 }
1602 
1603 /*
1604  * Check permission between a pair of credentials
1605  * fork check, ptrace check, etc.
1606  */
1607 static int cred_has_perm(const struct cred *actor,
1608 			 const struct cred *target,
1609 			 u32 perms)
1610 {
1611 	u32 asid = cred_sid(actor), tsid = cred_sid(target);
1612 
1613 	return avc_has_perm(asid, tsid, SECCLASS_PROCESS, perms, NULL);
1614 }
1615 
1616 /*
1617  * Check permission between a pair of tasks, e.g. signal checks,
1618  * fork check, ptrace check, etc.
1619  * tsk1 is the actor and tsk2 is the target
1620  * - this uses the default subjective creds of tsk1
1621  */
1622 static int task_has_perm(const struct task_struct *tsk1,
1623 			 const struct task_struct *tsk2,
1624 			 u32 perms)
1625 {
1626 	const struct task_security_struct *__tsec1, *__tsec2;
1627 	u32 sid1, sid2;
1628 
1629 	rcu_read_lock();
1630 	__tsec1 = __task_cred(tsk1)->security;	sid1 = __tsec1->sid;
1631 	__tsec2 = __task_cred(tsk2)->security;	sid2 = __tsec2->sid;
1632 	rcu_read_unlock();
1633 	return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms, NULL);
1634 }
1635 
1636 /*
1637  * Check permission between current and another task, e.g. signal checks,
1638  * fork check, ptrace check, etc.
1639  * current is the actor and tsk2 is the target
1640  * - this uses current's subjective creds
1641  */
1642 static int current_has_perm(const struct task_struct *tsk,
1643 			    u32 perms)
1644 {
1645 	u32 sid, tsid;
1646 
1647 	sid = current_sid();
1648 	tsid = task_sid(tsk);
1649 	return avc_has_perm(sid, tsid, SECCLASS_PROCESS, perms, NULL);
1650 }
1651 
1652 #if CAP_LAST_CAP > 63
1653 #error Fix SELinux to handle capabilities > 63.
1654 #endif
1655 
1656 /* Check whether a task is allowed to use a capability. */
1657 static int cred_has_capability(const struct cred *cred,
1658 			       int cap, int audit, bool initns)
1659 {
1660 	struct common_audit_data ad;
1661 	struct av_decision avd;
1662 	u16 sclass;
1663 	u32 sid = cred_sid(cred);
1664 	u32 av = CAP_TO_MASK(cap);
1665 	int rc;
1666 
1667 	ad.type = LSM_AUDIT_DATA_CAP;
1668 	ad.u.cap = cap;
1669 
1670 	switch (CAP_TO_INDEX(cap)) {
1671 	case 0:
1672 		sclass = initns ? SECCLASS_CAPABILITY : SECCLASS_CAP_USERNS;
1673 		break;
1674 	case 1:
1675 		sclass = initns ? SECCLASS_CAPABILITY2 : SECCLASS_CAP2_USERNS;
1676 		break;
1677 	default:
1678 		printk(KERN_ERR
1679 		       "SELinux:  out of range capability %d\n", cap);
1680 		BUG();
1681 		return -EINVAL;
1682 	}
1683 
1684 	rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1685 	if (audit == SECURITY_CAP_AUDIT) {
1686 		int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad, 0);
1687 		if (rc2)
1688 			return rc2;
1689 	}
1690 	return rc;
1691 }
1692 
1693 /* Check whether a task is allowed to use a system operation. */
1694 static int task_has_system(struct task_struct *tsk,
1695 			   u32 perms)
1696 {
1697 	u32 sid = task_sid(tsk);
1698 
1699 	return avc_has_perm(sid, SECINITSID_KERNEL,
1700 			    SECCLASS_SYSTEM, perms, NULL);
1701 }
1702 
1703 /* Check whether a task has a particular permission to an inode.
1704    The 'adp' parameter is optional and allows other audit
1705    data to be passed (e.g. the dentry). */
1706 static int inode_has_perm(const struct cred *cred,
1707 			  struct inode *inode,
1708 			  u32 perms,
1709 			  struct common_audit_data *adp)
1710 {
1711 	struct inode_security_struct *isec;
1712 	u32 sid;
1713 
1714 	validate_creds(cred);
1715 
1716 	if (unlikely(IS_PRIVATE(inode)))
1717 		return 0;
1718 
1719 	sid = cred_sid(cred);
1720 	isec = inode->i_security;
1721 
1722 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
1723 }
1724 
1725 /* Same as inode_has_perm, but pass explicit audit data containing
1726    the dentry to help the auditing code to more easily generate the
1727    pathname if needed. */
1728 static inline int dentry_has_perm(const struct cred *cred,
1729 				  struct dentry *dentry,
1730 				  u32 av)
1731 {
1732 	struct inode *inode = d_backing_inode(dentry);
1733 	struct common_audit_data ad;
1734 
1735 	ad.type = LSM_AUDIT_DATA_DENTRY;
1736 	ad.u.dentry = dentry;
1737 	__inode_security_revalidate(inode, dentry, true);
1738 	return inode_has_perm(cred, inode, av, &ad);
1739 }
1740 
1741 /* Same as inode_has_perm, but pass explicit audit data containing
1742    the path to help the auditing code to more easily generate the
1743    pathname if needed. */
1744 static inline int path_has_perm(const struct cred *cred,
1745 				const struct path *path,
1746 				u32 av)
1747 {
1748 	struct inode *inode = d_backing_inode(path->dentry);
1749 	struct common_audit_data ad;
1750 
1751 	ad.type = LSM_AUDIT_DATA_PATH;
1752 	ad.u.path = *path;
1753 	__inode_security_revalidate(inode, path->dentry, true);
1754 	return inode_has_perm(cred, inode, av, &ad);
1755 }
1756 
1757 /* Same as path_has_perm, but uses the inode from the file struct. */
1758 static inline int file_path_has_perm(const struct cred *cred,
1759 				     struct file *file,
1760 				     u32 av)
1761 {
1762 	struct common_audit_data ad;
1763 
1764 	ad.type = LSM_AUDIT_DATA_PATH;
1765 	ad.u.path = file->f_path;
1766 	return inode_has_perm(cred, file_inode(file), av, &ad);
1767 }
1768 
1769 /* Check whether a task can use an open file descriptor to
1770    access an inode in a given way.  Check access to the
1771    descriptor itself, and then use dentry_has_perm to
1772    check a particular permission to the file.
1773    Access to the descriptor is implicitly granted if it
1774    has the same SID as the process.  If av is zero, then
1775    access to the file is not checked, e.g. for cases
1776    where only the descriptor is affected like seek. */
1777 static int file_has_perm(const struct cred *cred,
1778 			 struct file *file,
1779 			 u32 av)
1780 {
1781 	struct file_security_struct *fsec = file->f_security;
1782 	struct inode *inode = file_inode(file);
1783 	struct common_audit_data ad;
1784 	u32 sid = cred_sid(cred);
1785 	int rc;
1786 
1787 	ad.type = LSM_AUDIT_DATA_PATH;
1788 	ad.u.path = file->f_path;
1789 
1790 	if (sid != fsec->sid) {
1791 		rc = avc_has_perm(sid, fsec->sid,
1792 				  SECCLASS_FD,
1793 				  FD__USE,
1794 				  &ad);
1795 		if (rc)
1796 			goto out;
1797 	}
1798 
1799 	/* av is zero if only checking access to the descriptor. */
1800 	rc = 0;
1801 	if (av)
1802 		rc = inode_has_perm(cred, inode, av, &ad);
1803 
1804 out:
1805 	return rc;
1806 }
1807 
1808 /*
1809  * Determine the label for an inode that might be unioned.
1810  */
1811 static int selinux_determine_inode_label(struct inode *dir,
1812 					 const struct qstr *name,
1813 					 u16 tclass,
1814 					 u32 *_new_isid)
1815 {
1816 	const struct superblock_security_struct *sbsec = dir->i_sb->s_security;
1817 	const struct task_security_struct *tsec = current_security();
1818 
1819 	if ((sbsec->flags & SE_SBINITIALIZED) &&
1820 	    (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)) {
1821 		*_new_isid = sbsec->mntpoint_sid;
1822 	} else if ((sbsec->flags & SBLABEL_MNT) &&
1823 		   tsec->create_sid) {
1824 		*_new_isid = tsec->create_sid;
1825 	} else {
1826 		const struct inode_security_struct *dsec = inode_security(dir);
1827 		return security_transition_sid(tsec->sid, dsec->sid, tclass,
1828 					       name, _new_isid);
1829 	}
1830 
1831 	return 0;
1832 }
1833 
1834 /* Check whether a task can create a file. */
1835 static int may_create(struct inode *dir,
1836 		      struct dentry *dentry,
1837 		      u16 tclass)
1838 {
1839 	const struct task_security_struct *tsec = current_security();
1840 	struct inode_security_struct *dsec;
1841 	struct superblock_security_struct *sbsec;
1842 	u32 sid, newsid;
1843 	struct common_audit_data ad;
1844 	int rc;
1845 
1846 	dsec = inode_security(dir);
1847 	sbsec = dir->i_sb->s_security;
1848 
1849 	sid = tsec->sid;
1850 
1851 	ad.type = LSM_AUDIT_DATA_DENTRY;
1852 	ad.u.dentry = dentry;
1853 
1854 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1855 			  DIR__ADD_NAME | DIR__SEARCH,
1856 			  &ad);
1857 	if (rc)
1858 		return rc;
1859 
1860 	rc = selinux_determine_inode_label(dir, &dentry->d_name, tclass,
1861 					   &newsid);
1862 	if (rc)
1863 		return rc;
1864 
1865 	rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1866 	if (rc)
1867 		return rc;
1868 
1869 	return avc_has_perm(newsid, sbsec->sid,
1870 			    SECCLASS_FILESYSTEM,
1871 			    FILESYSTEM__ASSOCIATE, &ad);
1872 }
1873 
1874 /* Check whether a task can create a key. */
1875 static int may_create_key(u32 ksid,
1876 			  struct task_struct *ctx)
1877 {
1878 	u32 sid = task_sid(ctx);
1879 
1880 	return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
1881 }
1882 
1883 #define MAY_LINK	0
1884 #define MAY_UNLINK	1
1885 #define MAY_RMDIR	2
1886 
1887 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1888 static int may_link(struct inode *dir,
1889 		    struct dentry *dentry,
1890 		    int kind)
1891 
1892 {
1893 	struct inode_security_struct *dsec, *isec;
1894 	struct common_audit_data ad;
1895 	u32 sid = current_sid();
1896 	u32 av;
1897 	int rc;
1898 
1899 	dsec = inode_security(dir);
1900 	isec = backing_inode_security(dentry);
1901 
1902 	ad.type = LSM_AUDIT_DATA_DENTRY;
1903 	ad.u.dentry = dentry;
1904 
1905 	av = DIR__SEARCH;
1906 	av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1907 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1908 	if (rc)
1909 		return rc;
1910 
1911 	switch (kind) {
1912 	case MAY_LINK:
1913 		av = FILE__LINK;
1914 		break;
1915 	case MAY_UNLINK:
1916 		av = FILE__UNLINK;
1917 		break;
1918 	case MAY_RMDIR:
1919 		av = DIR__RMDIR;
1920 		break;
1921 	default:
1922 		printk(KERN_WARNING "SELinux: %s:  unrecognized kind %d\n",
1923 			__func__, kind);
1924 		return 0;
1925 	}
1926 
1927 	rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1928 	return rc;
1929 }
1930 
1931 static inline int may_rename(struct inode *old_dir,
1932 			     struct dentry *old_dentry,
1933 			     struct inode *new_dir,
1934 			     struct dentry *new_dentry)
1935 {
1936 	struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1937 	struct common_audit_data ad;
1938 	u32 sid = current_sid();
1939 	u32 av;
1940 	int old_is_dir, new_is_dir;
1941 	int rc;
1942 
1943 	old_dsec = inode_security(old_dir);
1944 	old_isec = backing_inode_security(old_dentry);
1945 	old_is_dir = d_is_dir(old_dentry);
1946 	new_dsec = inode_security(new_dir);
1947 
1948 	ad.type = LSM_AUDIT_DATA_DENTRY;
1949 
1950 	ad.u.dentry = old_dentry;
1951 	rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1952 			  DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1953 	if (rc)
1954 		return rc;
1955 	rc = avc_has_perm(sid, old_isec->sid,
1956 			  old_isec->sclass, FILE__RENAME, &ad);
1957 	if (rc)
1958 		return rc;
1959 	if (old_is_dir && new_dir != old_dir) {
1960 		rc = avc_has_perm(sid, old_isec->sid,
1961 				  old_isec->sclass, DIR__REPARENT, &ad);
1962 		if (rc)
1963 			return rc;
1964 	}
1965 
1966 	ad.u.dentry = new_dentry;
1967 	av = DIR__ADD_NAME | DIR__SEARCH;
1968 	if (d_is_positive(new_dentry))
1969 		av |= DIR__REMOVE_NAME;
1970 	rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1971 	if (rc)
1972 		return rc;
1973 	if (d_is_positive(new_dentry)) {
1974 		new_isec = backing_inode_security(new_dentry);
1975 		new_is_dir = d_is_dir(new_dentry);
1976 		rc = avc_has_perm(sid, new_isec->sid,
1977 				  new_isec->sclass,
1978 				  (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1979 		if (rc)
1980 			return rc;
1981 	}
1982 
1983 	return 0;
1984 }
1985 
1986 /* Check whether a task can perform a filesystem operation. */
1987 static int superblock_has_perm(const struct cred *cred,
1988 			       struct super_block *sb,
1989 			       u32 perms,
1990 			       struct common_audit_data *ad)
1991 {
1992 	struct superblock_security_struct *sbsec;
1993 	u32 sid = cred_sid(cred);
1994 
1995 	sbsec = sb->s_security;
1996 	return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1997 }
1998 
1999 /* Convert a Linux mode and permission mask to an access vector. */
2000 static inline u32 file_mask_to_av(int mode, int mask)
2001 {
2002 	u32 av = 0;
2003 
2004 	if (!S_ISDIR(mode)) {
2005 		if (mask & MAY_EXEC)
2006 			av |= FILE__EXECUTE;
2007 		if (mask & MAY_READ)
2008 			av |= FILE__READ;
2009 
2010 		if (mask & MAY_APPEND)
2011 			av |= FILE__APPEND;
2012 		else if (mask & MAY_WRITE)
2013 			av |= FILE__WRITE;
2014 
2015 	} else {
2016 		if (mask & MAY_EXEC)
2017 			av |= DIR__SEARCH;
2018 		if (mask & MAY_WRITE)
2019 			av |= DIR__WRITE;
2020 		if (mask & MAY_READ)
2021 			av |= DIR__READ;
2022 	}
2023 
2024 	return av;
2025 }
2026 
2027 /* Convert a Linux file to an access vector. */
2028 static inline u32 file_to_av(struct file *file)
2029 {
2030 	u32 av = 0;
2031 
2032 	if (file->f_mode & FMODE_READ)
2033 		av |= FILE__READ;
2034 	if (file->f_mode & FMODE_WRITE) {
2035 		if (file->f_flags & O_APPEND)
2036 			av |= FILE__APPEND;
2037 		else
2038 			av |= FILE__WRITE;
2039 	}
2040 	if (!av) {
2041 		/*
2042 		 * Special file opened with flags 3 for ioctl-only use.
2043 		 */
2044 		av = FILE__IOCTL;
2045 	}
2046 
2047 	return av;
2048 }
2049 
2050 /*
2051  * Convert a file to an access vector and include the correct open
2052  * open permission.
2053  */
2054 static inline u32 open_file_to_av(struct file *file)
2055 {
2056 	u32 av = file_to_av(file);
2057 
2058 	if (selinux_policycap_openperm)
2059 		av |= FILE__OPEN;
2060 
2061 	return av;
2062 }
2063 
2064 /* Hook functions begin here. */
2065 
2066 static int selinux_binder_set_context_mgr(struct task_struct *mgr)
2067 {
2068 	u32 mysid = current_sid();
2069 	u32 mgrsid = task_sid(mgr);
2070 
2071 	return avc_has_perm(mysid, mgrsid, SECCLASS_BINDER,
2072 			    BINDER__SET_CONTEXT_MGR, NULL);
2073 }
2074 
2075 static int selinux_binder_transaction(struct task_struct *from,
2076 				      struct task_struct *to)
2077 {
2078 	u32 mysid = current_sid();
2079 	u32 fromsid = task_sid(from);
2080 	u32 tosid = task_sid(to);
2081 	int rc;
2082 
2083 	if (mysid != fromsid) {
2084 		rc = avc_has_perm(mysid, fromsid, SECCLASS_BINDER,
2085 				  BINDER__IMPERSONATE, NULL);
2086 		if (rc)
2087 			return rc;
2088 	}
2089 
2090 	return avc_has_perm(fromsid, tosid, SECCLASS_BINDER, BINDER__CALL,
2091 			    NULL);
2092 }
2093 
2094 static int selinux_binder_transfer_binder(struct task_struct *from,
2095 					  struct task_struct *to)
2096 {
2097 	u32 fromsid = task_sid(from);
2098 	u32 tosid = task_sid(to);
2099 
2100 	return avc_has_perm(fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER,
2101 			    NULL);
2102 }
2103 
2104 static int selinux_binder_transfer_file(struct task_struct *from,
2105 					struct task_struct *to,
2106 					struct file *file)
2107 {
2108 	u32 sid = task_sid(to);
2109 	struct file_security_struct *fsec = file->f_security;
2110 	struct dentry *dentry = file->f_path.dentry;
2111 	struct inode_security_struct *isec;
2112 	struct common_audit_data ad;
2113 	int rc;
2114 
2115 	ad.type = LSM_AUDIT_DATA_PATH;
2116 	ad.u.path = file->f_path;
2117 
2118 	if (sid != fsec->sid) {
2119 		rc = avc_has_perm(sid, fsec->sid,
2120 				  SECCLASS_FD,
2121 				  FD__USE,
2122 				  &ad);
2123 		if (rc)
2124 			return rc;
2125 	}
2126 
2127 	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
2128 		return 0;
2129 
2130 	isec = backing_inode_security(dentry);
2131 	return avc_has_perm(sid, isec->sid, isec->sclass, file_to_av(file),
2132 			    &ad);
2133 }
2134 
2135 static int selinux_ptrace_access_check(struct task_struct *child,
2136 				     unsigned int mode)
2137 {
2138 	if (mode & PTRACE_MODE_READ) {
2139 		u32 sid = current_sid();
2140 		u32 csid = task_sid(child);
2141 		return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
2142 	}
2143 
2144 	return current_has_perm(child, PROCESS__PTRACE);
2145 }
2146 
2147 static int selinux_ptrace_traceme(struct task_struct *parent)
2148 {
2149 	return task_has_perm(parent, current, PROCESS__PTRACE);
2150 }
2151 
2152 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
2153 			  kernel_cap_t *inheritable, kernel_cap_t *permitted)
2154 {
2155 	return current_has_perm(target, PROCESS__GETCAP);
2156 }
2157 
2158 static int selinux_capset(struct cred *new, const struct cred *old,
2159 			  const kernel_cap_t *effective,
2160 			  const kernel_cap_t *inheritable,
2161 			  const kernel_cap_t *permitted)
2162 {
2163 	return cred_has_perm(old, new, PROCESS__SETCAP);
2164 }
2165 
2166 /*
2167  * (This comment used to live with the selinux_task_setuid hook,
2168  * which was removed).
2169  *
2170  * Since setuid only affects the current process, and since the SELinux
2171  * controls are not based on the Linux identity attributes, SELinux does not
2172  * need to control this operation.  However, SELinux does control the use of
2173  * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
2174  */
2175 
2176 static int selinux_capable(const struct cred *cred, struct user_namespace *ns,
2177 			   int cap, int audit)
2178 {
2179 	return cred_has_capability(cred, cap, audit, ns == &init_user_ns);
2180 }
2181 
2182 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
2183 {
2184 	const struct cred *cred = current_cred();
2185 	int rc = 0;
2186 
2187 	if (!sb)
2188 		return 0;
2189 
2190 	switch (cmds) {
2191 	case Q_SYNC:
2192 	case Q_QUOTAON:
2193 	case Q_QUOTAOFF:
2194 	case Q_SETINFO:
2195 	case Q_SETQUOTA:
2196 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2197 		break;
2198 	case Q_GETFMT:
2199 	case Q_GETINFO:
2200 	case Q_GETQUOTA:
2201 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2202 		break;
2203 	default:
2204 		rc = 0;  /* let the kernel handle invalid cmds */
2205 		break;
2206 	}
2207 	return rc;
2208 }
2209 
2210 static int selinux_quota_on(struct dentry *dentry)
2211 {
2212 	const struct cred *cred = current_cred();
2213 
2214 	return dentry_has_perm(cred, dentry, FILE__QUOTAON);
2215 }
2216 
2217 static int selinux_syslog(int type)
2218 {
2219 	int rc;
2220 
2221 	switch (type) {
2222 	case SYSLOG_ACTION_READ_ALL:	/* Read last kernel messages */
2223 	case SYSLOG_ACTION_SIZE_BUFFER:	/* Return size of the log buffer */
2224 		rc = task_has_system(current, SYSTEM__SYSLOG_READ);
2225 		break;
2226 	case SYSLOG_ACTION_CONSOLE_OFF:	/* Disable logging to console */
2227 	case SYSLOG_ACTION_CONSOLE_ON:	/* Enable logging to console */
2228 	/* Set level of messages printed to console */
2229 	case SYSLOG_ACTION_CONSOLE_LEVEL:
2230 		rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
2231 		break;
2232 	case SYSLOG_ACTION_CLOSE:	/* Close log */
2233 	case SYSLOG_ACTION_OPEN:	/* Open log */
2234 	case SYSLOG_ACTION_READ:	/* Read from log */
2235 	case SYSLOG_ACTION_READ_CLEAR:	/* Read/clear last kernel messages */
2236 	case SYSLOG_ACTION_CLEAR:	/* Clear ring buffer */
2237 	default:
2238 		rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
2239 		break;
2240 	}
2241 	return rc;
2242 }
2243 
2244 /*
2245  * Check that a process has enough memory to allocate a new virtual
2246  * mapping. 0 means there is enough memory for the allocation to
2247  * succeed and -ENOMEM implies there is not.
2248  *
2249  * Do not audit the selinux permission check, as this is applied to all
2250  * processes that allocate mappings.
2251  */
2252 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2253 {
2254 	int rc, cap_sys_admin = 0;
2255 
2256 	rc = cred_has_capability(current_cred(), CAP_SYS_ADMIN,
2257 				 SECURITY_CAP_NOAUDIT, true);
2258 	if (rc == 0)
2259 		cap_sys_admin = 1;
2260 
2261 	return cap_sys_admin;
2262 }
2263 
2264 /* binprm security operations */
2265 
2266 static u32 ptrace_parent_sid(struct task_struct *task)
2267 {
2268 	u32 sid = 0;
2269 	struct task_struct *tracer;
2270 
2271 	rcu_read_lock();
2272 	tracer = ptrace_parent(task);
2273 	if (tracer)
2274 		sid = task_sid(tracer);
2275 	rcu_read_unlock();
2276 
2277 	return sid;
2278 }
2279 
2280 static int check_nnp_nosuid(const struct linux_binprm *bprm,
2281 			    const struct task_security_struct *old_tsec,
2282 			    const struct task_security_struct *new_tsec)
2283 {
2284 	int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
2285 	int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
2286 	int rc;
2287 
2288 	if (!nnp && !nosuid)
2289 		return 0; /* neither NNP nor nosuid */
2290 
2291 	if (new_tsec->sid == old_tsec->sid)
2292 		return 0; /* No change in credentials */
2293 
2294 	/*
2295 	 * The only transitions we permit under NNP or nosuid
2296 	 * are transitions to bounded SIDs, i.e. SIDs that are
2297 	 * guaranteed to only be allowed a subset of the permissions
2298 	 * of the current SID.
2299 	 */
2300 	rc = security_bounded_transition(old_tsec->sid, new_tsec->sid);
2301 	if (rc) {
2302 		/*
2303 		 * On failure, preserve the errno values for NNP vs nosuid.
2304 		 * NNP:  Operation not permitted for caller.
2305 		 * nosuid:  Permission denied to file.
2306 		 */
2307 		if (nnp)
2308 			return -EPERM;
2309 		else
2310 			return -EACCES;
2311 	}
2312 	return 0;
2313 }
2314 
2315 static int selinux_bprm_set_creds(struct linux_binprm *bprm)
2316 {
2317 	const struct task_security_struct *old_tsec;
2318 	struct task_security_struct *new_tsec;
2319 	struct inode_security_struct *isec;
2320 	struct common_audit_data ad;
2321 	struct inode *inode = file_inode(bprm->file);
2322 	int rc;
2323 
2324 	/* SELinux context only depends on initial program or script and not
2325 	 * the script interpreter */
2326 	if (bprm->cred_prepared)
2327 		return 0;
2328 
2329 	old_tsec = current_security();
2330 	new_tsec = bprm->cred->security;
2331 	isec = inode_security(inode);
2332 
2333 	/* Default to the current task SID. */
2334 	new_tsec->sid = old_tsec->sid;
2335 	new_tsec->osid = old_tsec->sid;
2336 
2337 	/* Reset fs, key, and sock SIDs on execve. */
2338 	new_tsec->create_sid = 0;
2339 	new_tsec->keycreate_sid = 0;
2340 	new_tsec->sockcreate_sid = 0;
2341 
2342 	if (old_tsec->exec_sid) {
2343 		new_tsec->sid = old_tsec->exec_sid;
2344 		/* Reset exec SID on execve. */
2345 		new_tsec->exec_sid = 0;
2346 
2347 		/* Fail on NNP or nosuid if not an allowed transition. */
2348 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2349 		if (rc)
2350 			return rc;
2351 	} else {
2352 		/* Check for a default transition on this program. */
2353 		rc = security_transition_sid(old_tsec->sid, isec->sid,
2354 					     SECCLASS_PROCESS, NULL,
2355 					     &new_tsec->sid);
2356 		if (rc)
2357 			return rc;
2358 
2359 		/*
2360 		 * Fallback to old SID on NNP or nosuid if not an allowed
2361 		 * transition.
2362 		 */
2363 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2364 		if (rc)
2365 			new_tsec->sid = old_tsec->sid;
2366 	}
2367 
2368 	ad.type = LSM_AUDIT_DATA_PATH;
2369 	ad.u.path = bprm->file->f_path;
2370 
2371 	if (new_tsec->sid == old_tsec->sid) {
2372 		rc = avc_has_perm(old_tsec->sid, isec->sid,
2373 				  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2374 		if (rc)
2375 			return rc;
2376 	} else {
2377 		/* Check permissions for the transition. */
2378 		rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2379 				  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2380 		if (rc)
2381 			return rc;
2382 
2383 		rc = avc_has_perm(new_tsec->sid, isec->sid,
2384 				  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2385 		if (rc)
2386 			return rc;
2387 
2388 		/* Check for shared state */
2389 		if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2390 			rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2391 					  SECCLASS_PROCESS, PROCESS__SHARE,
2392 					  NULL);
2393 			if (rc)
2394 				return -EPERM;
2395 		}
2396 
2397 		/* Make sure that anyone attempting to ptrace over a task that
2398 		 * changes its SID has the appropriate permit */
2399 		if (bprm->unsafe &
2400 		    (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2401 			u32 ptsid = ptrace_parent_sid(current);
2402 			if (ptsid != 0) {
2403 				rc = avc_has_perm(ptsid, new_tsec->sid,
2404 						  SECCLASS_PROCESS,
2405 						  PROCESS__PTRACE, NULL);
2406 				if (rc)
2407 					return -EPERM;
2408 			}
2409 		}
2410 
2411 		/* Clear any possibly unsafe personality bits on exec: */
2412 		bprm->per_clear |= PER_CLEAR_ON_SETID;
2413 	}
2414 
2415 	return 0;
2416 }
2417 
2418 static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2419 {
2420 	const struct task_security_struct *tsec = current_security();
2421 	u32 sid, osid;
2422 	int atsecure = 0;
2423 
2424 	sid = tsec->sid;
2425 	osid = tsec->osid;
2426 
2427 	if (osid != sid) {
2428 		/* Enable secure mode for SIDs transitions unless
2429 		   the noatsecure permission is granted between
2430 		   the two SIDs, i.e. ahp returns 0. */
2431 		atsecure = avc_has_perm(osid, sid,
2432 					SECCLASS_PROCESS,
2433 					PROCESS__NOATSECURE, NULL);
2434 	}
2435 
2436 	return !!atsecure;
2437 }
2438 
2439 static int match_file(const void *p, struct file *file, unsigned fd)
2440 {
2441 	return file_has_perm(p, file, file_to_av(file)) ? fd + 1 : 0;
2442 }
2443 
2444 /* Derived from fs/exec.c:flush_old_files. */
2445 static inline void flush_unauthorized_files(const struct cred *cred,
2446 					    struct files_struct *files)
2447 {
2448 	struct file *file, *devnull = NULL;
2449 	struct tty_struct *tty;
2450 	int drop_tty = 0;
2451 	unsigned n;
2452 
2453 	tty = get_current_tty();
2454 	if (tty) {
2455 		spin_lock(&tty->files_lock);
2456 		if (!list_empty(&tty->tty_files)) {
2457 			struct tty_file_private *file_priv;
2458 
2459 			/* Revalidate access to controlling tty.
2460 			   Use file_path_has_perm on the tty path directly
2461 			   rather than using file_has_perm, as this particular
2462 			   open file may belong to another process and we are
2463 			   only interested in the inode-based check here. */
2464 			file_priv = list_first_entry(&tty->tty_files,
2465 						struct tty_file_private, list);
2466 			file = file_priv->file;
2467 			if (file_path_has_perm(cred, file, FILE__READ | FILE__WRITE))
2468 				drop_tty = 1;
2469 		}
2470 		spin_unlock(&tty->files_lock);
2471 		tty_kref_put(tty);
2472 	}
2473 	/* Reset controlling tty. */
2474 	if (drop_tty)
2475 		no_tty();
2476 
2477 	/* Revalidate access to inherited open files. */
2478 	n = iterate_fd(files, 0, match_file, cred);
2479 	if (!n) /* none found? */
2480 		return;
2481 
2482 	devnull = dentry_open(&selinux_null, O_RDWR, cred);
2483 	if (IS_ERR(devnull))
2484 		devnull = NULL;
2485 	/* replace all the matching ones with this */
2486 	do {
2487 		replace_fd(n - 1, devnull, 0);
2488 	} while ((n = iterate_fd(files, n, match_file, cred)) != 0);
2489 	if (devnull)
2490 		fput(devnull);
2491 }
2492 
2493 /*
2494  * Prepare a process for imminent new credential changes due to exec
2495  */
2496 static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2497 {
2498 	struct task_security_struct *new_tsec;
2499 	struct rlimit *rlim, *initrlim;
2500 	int rc, i;
2501 
2502 	new_tsec = bprm->cred->security;
2503 	if (new_tsec->sid == new_tsec->osid)
2504 		return;
2505 
2506 	/* Close files for which the new task SID is not authorized. */
2507 	flush_unauthorized_files(bprm->cred, current->files);
2508 
2509 	/* Always clear parent death signal on SID transitions. */
2510 	current->pdeath_signal = 0;
2511 
2512 	/* Check whether the new SID can inherit resource limits from the old
2513 	 * SID.  If not, reset all soft limits to the lower of the current
2514 	 * task's hard limit and the init task's soft limit.
2515 	 *
2516 	 * Note that the setting of hard limits (even to lower them) can be
2517 	 * controlled by the setrlimit check.  The inclusion of the init task's
2518 	 * soft limit into the computation is to avoid resetting soft limits
2519 	 * higher than the default soft limit for cases where the default is
2520 	 * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2521 	 */
2522 	rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2523 			  PROCESS__RLIMITINH, NULL);
2524 	if (rc) {
2525 		/* protect against do_prlimit() */
2526 		task_lock(current);
2527 		for (i = 0; i < RLIM_NLIMITS; i++) {
2528 			rlim = current->signal->rlim + i;
2529 			initrlim = init_task.signal->rlim + i;
2530 			rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2531 		}
2532 		task_unlock(current);
2533 		update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2534 	}
2535 }
2536 
2537 /*
2538  * Clean up the process immediately after the installation of new credentials
2539  * due to exec
2540  */
2541 static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2542 {
2543 	const struct task_security_struct *tsec = current_security();
2544 	struct itimerval itimer;
2545 	u32 osid, sid;
2546 	int rc, i;
2547 
2548 	osid = tsec->osid;
2549 	sid = tsec->sid;
2550 
2551 	if (sid == osid)
2552 		return;
2553 
2554 	/* Check whether the new SID can inherit signal state from the old SID.
2555 	 * If not, clear itimers to avoid subsequent signal generation and
2556 	 * flush and unblock signals.
2557 	 *
2558 	 * This must occur _after_ the task SID has been updated so that any
2559 	 * kill done after the flush will be checked against the new SID.
2560 	 */
2561 	rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2562 	if (rc) {
2563 		memset(&itimer, 0, sizeof itimer);
2564 		for (i = 0; i < 3; i++)
2565 			do_setitimer(i, &itimer, NULL);
2566 		spin_lock_irq(&current->sighand->siglock);
2567 		if (!fatal_signal_pending(current)) {
2568 			flush_sigqueue(&current->pending);
2569 			flush_sigqueue(&current->signal->shared_pending);
2570 			flush_signal_handlers(current, 1);
2571 			sigemptyset(&current->blocked);
2572 			recalc_sigpending();
2573 		}
2574 		spin_unlock_irq(&current->sighand->siglock);
2575 	}
2576 
2577 	/* Wake up the parent if it is waiting so that it can recheck
2578 	 * wait permission to the new task SID. */
2579 	read_lock(&tasklist_lock);
2580 	__wake_up_parent(current, current->real_parent);
2581 	read_unlock(&tasklist_lock);
2582 }
2583 
2584 /* superblock security operations */
2585 
2586 static int selinux_sb_alloc_security(struct super_block *sb)
2587 {
2588 	return superblock_alloc_security(sb);
2589 }
2590 
2591 static void selinux_sb_free_security(struct super_block *sb)
2592 {
2593 	superblock_free_security(sb);
2594 }
2595 
2596 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2597 {
2598 	if (plen > olen)
2599 		return 0;
2600 
2601 	return !memcmp(prefix, option, plen);
2602 }
2603 
2604 static inline int selinux_option(char *option, int len)
2605 {
2606 	return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2607 		match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2608 		match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2609 		match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2610 		match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2611 }
2612 
2613 static inline void take_option(char **to, char *from, int *first, int len)
2614 {
2615 	if (!*first) {
2616 		**to = ',';
2617 		*to += 1;
2618 	} else
2619 		*first = 0;
2620 	memcpy(*to, from, len);
2621 	*to += len;
2622 }
2623 
2624 static inline void take_selinux_option(char **to, char *from, int *first,
2625 				       int len)
2626 {
2627 	int current_size = 0;
2628 
2629 	if (!*first) {
2630 		**to = '|';
2631 		*to += 1;
2632 	} else
2633 		*first = 0;
2634 
2635 	while (current_size < len) {
2636 		if (*from != '"') {
2637 			**to = *from;
2638 			*to += 1;
2639 		}
2640 		from += 1;
2641 		current_size += 1;
2642 	}
2643 }
2644 
2645 static int selinux_sb_copy_data(char *orig, char *copy)
2646 {
2647 	int fnosec, fsec, rc = 0;
2648 	char *in_save, *in_curr, *in_end;
2649 	char *sec_curr, *nosec_save, *nosec;
2650 	int open_quote = 0;
2651 
2652 	in_curr = orig;
2653 	sec_curr = copy;
2654 
2655 	nosec = (char *)get_zeroed_page(GFP_KERNEL);
2656 	if (!nosec) {
2657 		rc = -ENOMEM;
2658 		goto out;
2659 	}
2660 
2661 	nosec_save = nosec;
2662 	fnosec = fsec = 1;
2663 	in_save = in_end = orig;
2664 
2665 	do {
2666 		if (*in_end == '"')
2667 			open_quote = !open_quote;
2668 		if ((*in_end == ',' && open_quote == 0) ||
2669 				*in_end == '\0') {
2670 			int len = in_end - in_curr;
2671 
2672 			if (selinux_option(in_curr, len))
2673 				take_selinux_option(&sec_curr, in_curr, &fsec, len);
2674 			else
2675 				take_option(&nosec, in_curr, &fnosec, len);
2676 
2677 			in_curr = in_end + 1;
2678 		}
2679 	} while (*in_end++);
2680 
2681 	strcpy(in_save, nosec_save);
2682 	free_page((unsigned long)nosec_save);
2683 out:
2684 	return rc;
2685 }
2686 
2687 static int selinux_sb_remount(struct super_block *sb, void *data)
2688 {
2689 	int rc, i, *flags;
2690 	struct security_mnt_opts opts;
2691 	char *secdata, **mount_options;
2692 	struct superblock_security_struct *sbsec = sb->s_security;
2693 
2694 	if (!(sbsec->flags & SE_SBINITIALIZED))
2695 		return 0;
2696 
2697 	if (!data)
2698 		return 0;
2699 
2700 	if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
2701 		return 0;
2702 
2703 	security_init_mnt_opts(&opts);
2704 	secdata = alloc_secdata();
2705 	if (!secdata)
2706 		return -ENOMEM;
2707 	rc = selinux_sb_copy_data(data, secdata);
2708 	if (rc)
2709 		goto out_free_secdata;
2710 
2711 	rc = selinux_parse_opts_str(secdata, &opts);
2712 	if (rc)
2713 		goto out_free_secdata;
2714 
2715 	mount_options = opts.mnt_opts;
2716 	flags = opts.mnt_opts_flags;
2717 
2718 	for (i = 0; i < opts.num_mnt_opts; i++) {
2719 		u32 sid;
2720 
2721 		if (flags[i] == SBLABEL_MNT)
2722 			continue;
2723 		rc = security_context_str_to_sid(mount_options[i], &sid, GFP_KERNEL);
2724 		if (rc) {
2725 			printk(KERN_WARNING "SELinux: security_context_str_to_sid"
2726 			       "(%s) failed for (dev %s, type %s) errno=%d\n",
2727 			       mount_options[i], sb->s_id, sb->s_type->name, rc);
2728 			goto out_free_opts;
2729 		}
2730 		rc = -EINVAL;
2731 		switch (flags[i]) {
2732 		case FSCONTEXT_MNT:
2733 			if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2734 				goto out_bad_option;
2735 			break;
2736 		case CONTEXT_MNT:
2737 			if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2738 				goto out_bad_option;
2739 			break;
2740 		case ROOTCONTEXT_MNT: {
2741 			struct inode_security_struct *root_isec;
2742 			root_isec = backing_inode_security(sb->s_root);
2743 
2744 			if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2745 				goto out_bad_option;
2746 			break;
2747 		}
2748 		case DEFCONTEXT_MNT:
2749 			if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2750 				goto out_bad_option;
2751 			break;
2752 		default:
2753 			goto out_free_opts;
2754 		}
2755 	}
2756 
2757 	rc = 0;
2758 out_free_opts:
2759 	security_free_mnt_opts(&opts);
2760 out_free_secdata:
2761 	free_secdata(secdata);
2762 	return rc;
2763 out_bad_option:
2764 	printk(KERN_WARNING "SELinux: unable to change security options "
2765 	       "during remount (dev %s, type=%s)\n", sb->s_id,
2766 	       sb->s_type->name);
2767 	goto out_free_opts;
2768 }
2769 
2770 static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2771 {
2772 	const struct cred *cred = current_cred();
2773 	struct common_audit_data ad;
2774 	int rc;
2775 
2776 	rc = superblock_doinit(sb, data);
2777 	if (rc)
2778 		return rc;
2779 
2780 	/* Allow all mounts performed by the kernel */
2781 	if (flags & MS_KERNMOUNT)
2782 		return 0;
2783 
2784 	ad.type = LSM_AUDIT_DATA_DENTRY;
2785 	ad.u.dentry = sb->s_root;
2786 	return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2787 }
2788 
2789 static int selinux_sb_statfs(struct dentry *dentry)
2790 {
2791 	const struct cred *cred = current_cred();
2792 	struct common_audit_data ad;
2793 
2794 	ad.type = LSM_AUDIT_DATA_DENTRY;
2795 	ad.u.dentry = dentry->d_sb->s_root;
2796 	return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2797 }
2798 
2799 static int selinux_mount(const char *dev_name,
2800 			 const struct path *path,
2801 			 const char *type,
2802 			 unsigned long flags,
2803 			 void *data)
2804 {
2805 	const struct cred *cred = current_cred();
2806 
2807 	if (flags & MS_REMOUNT)
2808 		return superblock_has_perm(cred, path->dentry->d_sb,
2809 					   FILESYSTEM__REMOUNT, NULL);
2810 	else
2811 		return path_has_perm(cred, path, FILE__MOUNTON);
2812 }
2813 
2814 static int selinux_umount(struct vfsmount *mnt, int flags)
2815 {
2816 	const struct cred *cred = current_cred();
2817 
2818 	return superblock_has_perm(cred, mnt->mnt_sb,
2819 				   FILESYSTEM__UNMOUNT, NULL);
2820 }
2821 
2822 /* inode security operations */
2823 
2824 static int selinux_inode_alloc_security(struct inode *inode)
2825 {
2826 	return inode_alloc_security(inode);
2827 }
2828 
2829 static void selinux_inode_free_security(struct inode *inode)
2830 {
2831 	inode_free_security(inode);
2832 }
2833 
2834 static int selinux_dentry_init_security(struct dentry *dentry, int mode,
2835 					const struct qstr *name, void **ctx,
2836 					u32 *ctxlen)
2837 {
2838 	u32 newsid;
2839 	int rc;
2840 
2841 	rc = selinux_determine_inode_label(d_inode(dentry->d_parent), name,
2842 					   inode_mode_to_security_class(mode),
2843 					   &newsid);
2844 	if (rc)
2845 		return rc;
2846 
2847 	return security_sid_to_context(newsid, (char **)ctx, ctxlen);
2848 }
2849 
2850 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2851 				       const struct qstr *qstr,
2852 				       const char **name,
2853 				       void **value, size_t *len)
2854 {
2855 	const struct task_security_struct *tsec = current_security();
2856 	struct superblock_security_struct *sbsec;
2857 	u32 sid, newsid, clen;
2858 	int rc;
2859 	char *context;
2860 
2861 	sbsec = dir->i_sb->s_security;
2862 
2863 	sid = tsec->sid;
2864 	newsid = tsec->create_sid;
2865 
2866 	rc = selinux_determine_inode_label(
2867 		dir, qstr,
2868 		inode_mode_to_security_class(inode->i_mode),
2869 		&newsid);
2870 	if (rc)
2871 		return rc;
2872 
2873 	/* Possibly defer initialization to selinux_complete_init. */
2874 	if (sbsec->flags & SE_SBINITIALIZED) {
2875 		struct inode_security_struct *isec = inode->i_security;
2876 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
2877 		isec->sid = newsid;
2878 		isec->initialized = LABEL_INITIALIZED;
2879 	}
2880 
2881 	if (!ss_initialized || !(sbsec->flags & SBLABEL_MNT))
2882 		return -EOPNOTSUPP;
2883 
2884 	if (name)
2885 		*name = XATTR_SELINUX_SUFFIX;
2886 
2887 	if (value && len) {
2888 		rc = security_sid_to_context_force(newsid, &context, &clen);
2889 		if (rc)
2890 			return rc;
2891 		*value = context;
2892 		*len = clen;
2893 	}
2894 
2895 	return 0;
2896 }
2897 
2898 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
2899 {
2900 	return may_create(dir, dentry, SECCLASS_FILE);
2901 }
2902 
2903 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2904 {
2905 	return may_link(dir, old_dentry, MAY_LINK);
2906 }
2907 
2908 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2909 {
2910 	return may_link(dir, dentry, MAY_UNLINK);
2911 }
2912 
2913 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2914 {
2915 	return may_create(dir, dentry, SECCLASS_LNK_FILE);
2916 }
2917 
2918 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mask)
2919 {
2920 	return may_create(dir, dentry, SECCLASS_DIR);
2921 }
2922 
2923 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2924 {
2925 	return may_link(dir, dentry, MAY_RMDIR);
2926 }
2927 
2928 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
2929 {
2930 	return may_create(dir, dentry, inode_mode_to_security_class(mode));
2931 }
2932 
2933 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2934 				struct inode *new_inode, struct dentry *new_dentry)
2935 {
2936 	return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2937 }
2938 
2939 static int selinux_inode_readlink(struct dentry *dentry)
2940 {
2941 	const struct cred *cred = current_cred();
2942 
2943 	return dentry_has_perm(cred, dentry, FILE__READ);
2944 }
2945 
2946 static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode,
2947 				     bool rcu)
2948 {
2949 	const struct cred *cred = current_cred();
2950 	struct common_audit_data ad;
2951 	struct inode_security_struct *isec;
2952 	u32 sid;
2953 
2954 	validate_creds(cred);
2955 
2956 	ad.type = LSM_AUDIT_DATA_DENTRY;
2957 	ad.u.dentry = dentry;
2958 	sid = cred_sid(cred);
2959 	isec = inode_security_rcu(inode, rcu);
2960 	if (IS_ERR(isec))
2961 		return PTR_ERR(isec);
2962 
2963 	return avc_has_perm_flags(sid, isec->sid, isec->sclass, FILE__READ, &ad,
2964 				  rcu ? MAY_NOT_BLOCK : 0);
2965 }
2966 
2967 static noinline int audit_inode_permission(struct inode *inode,
2968 					   u32 perms, u32 audited, u32 denied,
2969 					   int result,
2970 					   unsigned flags)
2971 {
2972 	struct common_audit_data ad;
2973 	struct inode_security_struct *isec = inode->i_security;
2974 	int rc;
2975 
2976 	ad.type = LSM_AUDIT_DATA_INODE;
2977 	ad.u.inode = inode;
2978 
2979 	rc = slow_avc_audit(current_sid(), isec->sid, isec->sclass, perms,
2980 			    audited, denied, result, &ad, flags);
2981 	if (rc)
2982 		return rc;
2983 	return 0;
2984 }
2985 
2986 static int selinux_inode_permission(struct inode *inode, int mask)
2987 {
2988 	const struct cred *cred = current_cred();
2989 	u32 perms;
2990 	bool from_access;
2991 	unsigned flags = mask & MAY_NOT_BLOCK;
2992 	struct inode_security_struct *isec;
2993 	u32 sid;
2994 	struct av_decision avd;
2995 	int rc, rc2;
2996 	u32 audited, denied;
2997 
2998 	from_access = mask & MAY_ACCESS;
2999 	mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
3000 
3001 	/* No permission to check.  Existence test. */
3002 	if (!mask)
3003 		return 0;
3004 
3005 	validate_creds(cred);
3006 
3007 	if (unlikely(IS_PRIVATE(inode)))
3008 		return 0;
3009 
3010 	perms = file_mask_to_av(inode->i_mode, mask);
3011 
3012 	sid = cred_sid(cred);
3013 	isec = inode_security_rcu(inode, flags & MAY_NOT_BLOCK);
3014 	if (IS_ERR(isec))
3015 		return PTR_ERR(isec);
3016 
3017 	rc = avc_has_perm_noaudit(sid, isec->sid, isec->sclass, perms, 0, &avd);
3018 	audited = avc_audit_required(perms, &avd, rc,
3019 				     from_access ? FILE__AUDIT_ACCESS : 0,
3020 				     &denied);
3021 	if (likely(!audited))
3022 		return rc;
3023 
3024 	rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags);
3025 	if (rc2)
3026 		return rc2;
3027 	return rc;
3028 }
3029 
3030 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
3031 {
3032 	const struct cred *cred = current_cred();
3033 	unsigned int ia_valid = iattr->ia_valid;
3034 	__u32 av = FILE__WRITE;
3035 
3036 	/* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
3037 	if (ia_valid & ATTR_FORCE) {
3038 		ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
3039 			      ATTR_FORCE);
3040 		if (!ia_valid)
3041 			return 0;
3042 	}
3043 
3044 	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
3045 			ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
3046 		return dentry_has_perm(cred, dentry, FILE__SETATTR);
3047 
3048 	if (selinux_policycap_openperm && (ia_valid & ATTR_SIZE)
3049 			&& !(ia_valid & ATTR_FILE))
3050 		av |= FILE__OPEN;
3051 
3052 	return dentry_has_perm(cred, dentry, av);
3053 }
3054 
3055 static int selinux_inode_getattr(const struct path *path)
3056 {
3057 	return path_has_perm(current_cred(), path, FILE__GETATTR);
3058 }
3059 
3060 static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
3061 {
3062 	const struct cred *cred = current_cred();
3063 
3064 	if (!strncmp(name, XATTR_SECURITY_PREFIX,
3065 		     sizeof XATTR_SECURITY_PREFIX - 1)) {
3066 		if (!strcmp(name, XATTR_NAME_CAPS)) {
3067 			if (!capable(CAP_SETFCAP))
3068 				return -EPERM;
3069 		} else if (!capable(CAP_SYS_ADMIN)) {
3070 			/* A different attribute in the security namespace.
3071 			   Restrict to administrator. */
3072 			return -EPERM;
3073 		}
3074 	}
3075 
3076 	/* Not an attribute we recognize, so just check the
3077 	   ordinary setattr permission. */
3078 	return dentry_has_perm(cred, dentry, FILE__SETATTR);
3079 }
3080 
3081 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
3082 				  const void *value, size_t size, int flags)
3083 {
3084 	struct inode *inode = d_backing_inode(dentry);
3085 	struct inode_security_struct *isec;
3086 	struct superblock_security_struct *sbsec;
3087 	struct common_audit_data ad;
3088 	u32 newsid, sid = current_sid();
3089 	int rc = 0;
3090 
3091 	if (strcmp(name, XATTR_NAME_SELINUX))
3092 		return selinux_inode_setotherxattr(dentry, name);
3093 
3094 	sbsec = inode->i_sb->s_security;
3095 	if (!(sbsec->flags & SBLABEL_MNT))
3096 		return -EOPNOTSUPP;
3097 
3098 	if (!inode_owner_or_capable(inode))
3099 		return -EPERM;
3100 
3101 	ad.type = LSM_AUDIT_DATA_DENTRY;
3102 	ad.u.dentry = dentry;
3103 
3104 	isec = backing_inode_security(dentry);
3105 	rc = avc_has_perm(sid, isec->sid, isec->sclass,
3106 			  FILE__RELABELFROM, &ad);
3107 	if (rc)
3108 		return rc;
3109 
3110 	rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
3111 	if (rc == -EINVAL) {
3112 		if (!capable(CAP_MAC_ADMIN)) {
3113 			struct audit_buffer *ab;
3114 			size_t audit_size;
3115 			const char *str;
3116 
3117 			/* We strip a nul only if it is at the end, otherwise the
3118 			 * context contains a nul and we should audit that */
3119 			if (value) {
3120 				str = value;
3121 				if (str[size - 1] == '\0')
3122 					audit_size = size - 1;
3123 				else
3124 					audit_size = size;
3125 			} else {
3126 				str = "";
3127 				audit_size = 0;
3128 			}
3129 			ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
3130 			audit_log_format(ab, "op=setxattr invalid_context=");
3131 			audit_log_n_untrustedstring(ab, value, audit_size);
3132 			audit_log_end(ab);
3133 
3134 			return rc;
3135 		}
3136 		rc = security_context_to_sid_force(value, size, &newsid);
3137 	}
3138 	if (rc)
3139 		return rc;
3140 
3141 	rc = avc_has_perm(sid, newsid, isec->sclass,
3142 			  FILE__RELABELTO, &ad);
3143 	if (rc)
3144 		return rc;
3145 
3146 	rc = security_validate_transition(isec->sid, newsid, sid,
3147 					  isec->sclass);
3148 	if (rc)
3149 		return rc;
3150 
3151 	return avc_has_perm(newsid,
3152 			    sbsec->sid,
3153 			    SECCLASS_FILESYSTEM,
3154 			    FILESYSTEM__ASSOCIATE,
3155 			    &ad);
3156 }
3157 
3158 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3159 					const void *value, size_t size,
3160 					int flags)
3161 {
3162 	struct inode *inode = d_backing_inode(dentry);
3163 	struct inode_security_struct *isec;
3164 	u32 newsid;
3165 	int rc;
3166 
3167 	if (strcmp(name, XATTR_NAME_SELINUX)) {
3168 		/* Not an attribute we recognize, so nothing to do. */
3169 		return;
3170 	}
3171 
3172 	rc = security_context_to_sid_force(value, size, &newsid);
3173 	if (rc) {
3174 		printk(KERN_ERR "SELinux:  unable to map context to SID"
3175 		       "for (%s, %lu), rc=%d\n",
3176 		       inode->i_sb->s_id, inode->i_ino, -rc);
3177 		return;
3178 	}
3179 
3180 	isec = backing_inode_security(dentry);
3181 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3182 	isec->sid = newsid;
3183 	isec->initialized = LABEL_INITIALIZED;
3184 
3185 	return;
3186 }
3187 
3188 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3189 {
3190 	const struct cred *cred = current_cred();
3191 
3192 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3193 }
3194 
3195 static int selinux_inode_listxattr(struct dentry *dentry)
3196 {
3197 	const struct cred *cred = current_cred();
3198 
3199 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3200 }
3201 
3202 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
3203 {
3204 	if (strcmp(name, XATTR_NAME_SELINUX))
3205 		return selinux_inode_setotherxattr(dentry, name);
3206 
3207 	/* No one is allowed to remove a SELinux security label.
3208 	   You can change the label, but all data must be labeled. */
3209 	return -EACCES;
3210 }
3211 
3212 /*
3213  * Copy the inode security context value to the user.
3214  *
3215  * Permission check is handled by selinux_inode_getxattr hook.
3216  */
3217 static int selinux_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
3218 {
3219 	u32 size;
3220 	int error;
3221 	char *context = NULL;
3222 	struct inode_security_struct *isec;
3223 
3224 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3225 		return -EOPNOTSUPP;
3226 
3227 	/*
3228 	 * If the caller has CAP_MAC_ADMIN, then get the raw context
3229 	 * value even if it is not defined by current policy; otherwise,
3230 	 * use the in-core value under current policy.
3231 	 * Use the non-auditing forms of the permission checks since
3232 	 * getxattr may be called by unprivileged processes commonly
3233 	 * and lack of permission just means that we fall back to the
3234 	 * in-core context value, not a denial.
3235 	 */
3236 	error = cap_capable(current_cred(), &init_user_ns, CAP_MAC_ADMIN,
3237 			    SECURITY_CAP_NOAUDIT);
3238 	if (!error)
3239 		error = cred_has_capability(current_cred(), CAP_MAC_ADMIN,
3240 					    SECURITY_CAP_NOAUDIT, true);
3241 	isec = inode_security(inode);
3242 	if (!error)
3243 		error = security_sid_to_context_force(isec->sid, &context,
3244 						      &size);
3245 	else
3246 		error = security_sid_to_context(isec->sid, &context, &size);
3247 	if (error)
3248 		return error;
3249 	error = size;
3250 	if (alloc) {
3251 		*buffer = context;
3252 		goto out_nofree;
3253 	}
3254 	kfree(context);
3255 out_nofree:
3256 	return error;
3257 }
3258 
3259 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3260 				     const void *value, size_t size, int flags)
3261 {
3262 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3263 	u32 newsid;
3264 	int rc;
3265 
3266 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3267 		return -EOPNOTSUPP;
3268 
3269 	if (!value || !size)
3270 		return -EACCES;
3271 
3272 	rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
3273 	if (rc)
3274 		return rc;
3275 
3276 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3277 	isec->sid = newsid;
3278 	isec->initialized = LABEL_INITIALIZED;
3279 	return 0;
3280 }
3281 
3282 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3283 {
3284 	const int len = sizeof(XATTR_NAME_SELINUX);
3285 	if (buffer && len <= buffer_size)
3286 		memcpy(buffer, XATTR_NAME_SELINUX, len);
3287 	return len;
3288 }
3289 
3290 static void selinux_inode_getsecid(struct inode *inode, u32 *secid)
3291 {
3292 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3293 	*secid = isec->sid;
3294 }
3295 
3296 /* file security operations */
3297 
3298 static int selinux_revalidate_file_permission(struct file *file, int mask)
3299 {
3300 	const struct cred *cred = current_cred();
3301 	struct inode *inode = file_inode(file);
3302 
3303 	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3304 	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3305 		mask |= MAY_APPEND;
3306 
3307 	return file_has_perm(cred, file,
3308 			     file_mask_to_av(inode->i_mode, mask));
3309 }
3310 
3311 static int selinux_file_permission(struct file *file, int mask)
3312 {
3313 	struct inode *inode = file_inode(file);
3314 	struct file_security_struct *fsec = file->f_security;
3315 	struct inode_security_struct *isec;
3316 	u32 sid = current_sid();
3317 
3318 	if (!mask)
3319 		/* No permission to check.  Existence test. */
3320 		return 0;
3321 
3322 	isec = inode_security(inode);
3323 	if (sid == fsec->sid && fsec->isid == isec->sid &&
3324 	    fsec->pseqno == avc_policy_seqno())
3325 		/* No change since file_open check. */
3326 		return 0;
3327 
3328 	return selinux_revalidate_file_permission(file, mask);
3329 }
3330 
3331 static int selinux_file_alloc_security(struct file *file)
3332 {
3333 	return file_alloc_security(file);
3334 }
3335 
3336 static void selinux_file_free_security(struct file *file)
3337 {
3338 	file_free_security(file);
3339 }
3340 
3341 /*
3342  * Check whether a task has the ioctl permission and cmd
3343  * operation to an inode.
3344  */
3345 static int ioctl_has_perm(const struct cred *cred, struct file *file,
3346 		u32 requested, u16 cmd)
3347 {
3348 	struct common_audit_data ad;
3349 	struct file_security_struct *fsec = file->f_security;
3350 	struct inode *inode = file_inode(file);
3351 	struct inode_security_struct *isec;
3352 	struct lsm_ioctlop_audit ioctl;
3353 	u32 ssid = cred_sid(cred);
3354 	int rc;
3355 	u8 driver = cmd >> 8;
3356 	u8 xperm = cmd & 0xff;
3357 
3358 	ad.type = LSM_AUDIT_DATA_IOCTL_OP;
3359 	ad.u.op = &ioctl;
3360 	ad.u.op->cmd = cmd;
3361 	ad.u.op->path = file->f_path;
3362 
3363 	if (ssid != fsec->sid) {
3364 		rc = avc_has_perm(ssid, fsec->sid,
3365 				SECCLASS_FD,
3366 				FD__USE,
3367 				&ad);
3368 		if (rc)
3369 			goto out;
3370 	}
3371 
3372 	if (unlikely(IS_PRIVATE(inode)))
3373 		return 0;
3374 
3375 	isec = inode_security(inode);
3376 	rc = avc_has_extended_perms(ssid, isec->sid, isec->sclass,
3377 			requested, driver, xperm, &ad);
3378 out:
3379 	return rc;
3380 }
3381 
3382 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3383 			      unsigned long arg)
3384 {
3385 	const struct cred *cred = current_cred();
3386 	int error = 0;
3387 
3388 	switch (cmd) {
3389 	case FIONREAD:
3390 	/* fall through */
3391 	case FIBMAP:
3392 	/* fall through */
3393 	case FIGETBSZ:
3394 	/* fall through */
3395 	case FS_IOC_GETFLAGS:
3396 	/* fall through */
3397 	case FS_IOC_GETVERSION:
3398 		error = file_has_perm(cred, file, FILE__GETATTR);
3399 		break;
3400 
3401 	case FS_IOC_SETFLAGS:
3402 	/* fall through */
3403 	case FS_IOC_SETVERSION:
3404 		error = file_has_perm(cred, file, FILE__SETATTR);
3405 		break;
3406 
3407 	/* sys_ioctl() checks */
3408 	case FIONBIO:
3409 	/* fall through */
3410 	case FIOASYNC:
3411 		error = file_has_perm(cred, file, 0);
3412 		break;
3413 
3414 	case KDSKBENT:
3415 	case KDSKBSENT:
3416 		error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3417 					    SECURITY_CAP_AUDIT, true);
3418 		break;
3419 
3420 	/* default case assumes that the command will go
3421 	 * to the file's ioctl() function.
3422 	 */
3423 	default:
3424 		error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3425 	}
3426 	return error;
3427 }
3428 
3429 static int default_noexec;
3430 
3431 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3432 {
3433 	const struct cred *cred = current_cred();
3434 	int rc = 0;
3435 
3436 	if (default_noexec &&
3437 	    (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3438 				   (!shared && (prot & PROT_WRITE)))) {
3439 		/*
3440 		 * We are making executable an anonymous mapping or a
3441 		 * private file mapping that will also be writable.
3442 		 * This has an additional check.
3443 		 */
3444 		rc = cred_has_perm(cred, cred, PROCESS__EXECMEM);
3445 		if (rc)
3446 			goto error;
3447 	}
3448 
3449 	if (file) {
3450 		/* read access is always possible with a mapping */
3451 		u32 av = FILE__READ;
3452 
3453 		/* write access only matters if the mapping is shared */
3454 		if (shared && (prot & PROT_WRITE))
3455 			av |= FILE__WRITE;
3456 
3457 		if (prot & PROT_EXEC)
3458 			av |= FILE__EXECUTE;
3459 
3460 		return file_has_perm(cred, file, av);
3461 	}
3462 
3463 error:
3464 	return rc;
3465 }
3466 
3467 static int selinux_mmap_addr(unsigned long addr)
3468 {
3469 	int rc = 0;
3470 
3471 	if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3472 		u32 sid = current_sid();
3473 		rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3474 				  MEMPROTECT__MMAP_ZERO, NULL);
3475 	}
3476 
3477 	return rc;
3478 }
3479 
3480 static int selinux_mmap_file(struct file *file, unsigned long reqprot,
3481 			     unsigned long prot, unsigned long flags)
3482 {
3483 	if (selinux_checkreqprot)
3484 		prot = reqprot;
3485 
3486 	return file_map_prot_check(file, prot,
3487 				   (flags & MAP_TYPE) == MAP_SHARED);
3488 }
3489 
3490 static int selinux_file_mprotect(struct vm_area_struct *vma,
3491 				 unsigned long reqprot,
3492 				 unsigned long prot)
3493 {
3494 	const struct cred *cred = current_cred();
3495 
3496 	if (selinux_checkreqprot)
3497 		prot = reqprot;
3498 
3499 	if (default_noexec &&
3500 	    (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3501 		int rc = 0;
3502 		if (vma->vm_start >= vma->vm_mm->start_brk &&
3503 		    vma->vm_end <= vma->vm_mm->brk) {
3504 			rc = cred_has_perm(cred, cred, PROCESS__EXECHEAP);
3505 		} else if (!vma->vm_file &&
3506 			   ((vma->vm_start <= vma->vm_mm->start_stack &&
3507 			     vma->vm_end >= vma->vm_mm->start_stack) ||
3508 			    vma_is_stack_for_task(vma, current))) {
3509 			rc = current_has_perm(current, PROCESS__EXECSTACK);
3510 		} else if (vma->vm_file && vma->anon_vma) {
3511 			/*
3512 			 * We are making executable a file mapping that has
3513 			 * had some COW done. Since pages might have been
3514 			 * written, check ability to execute the possibly
3515 			 * modified content.  This typically should only
3516 			 * occur for text relocations.
3517 			 */
3518 			rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3519 		}
3520 		if (rc)
3521 			return rc;
3522 	}
3523 
3524 	return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3525 }
3526 
3527 static int selinux_file_lock(struct file *file, unsigned int cmd)
3528 {
3529 	const struct cred *cred = current_cred();
3530 
3531 	return file_has_perm(cred, file, FILE__LOCK);
3532 }
3533 
3534 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3535 			      unsigned long arg)
3536 {
3537 	const struct cred *cred = current_cred();
3538 	int err = 0;
3539 
3540 	switch (cmd) {
3541 	case F_SETFL:
3542 		if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3543 			err = file_has_perm(cred, file, FILE__WRITE);
3544 			break;
3545 		}
3546 		/* fall through */
3547 	case F_SETOWN:
3548 	case F_SETSIG:
3549 	case F_GETFL:
3550 	case F_GETOWN:
3551 	case F_GETSIG:
3552 	case F_GETOWNER_UIDS:
3553 		/* Just check FD__USE permission */
3554 		err = file_has_perm(cred, file, 0);
3555 		break;
3556 	case F_GETLK:
3557 	case F_SETLK:
3558 	case F_SETLKW:
3559 	case F_OFD_GETLK:
3560 	case F_OFD_SETLK:
3561 	case F_OFD_SETLKW:
3562 #if BITS_PER_LONG == 32
3563 	case F_GETLK64:
3564 	case F_SETLK64:
3565 	case F_SETLKW64:
3566 #endif
3567 		err = file_has_perm(cred, file, FILE__LOCK);
3568 		break;
3569 	}
3570 
3571 	return err;
3572 }
3573 
3574 static void selinux_file_set_fowner(struct file *file)
3575 {
3576 	struct file_security_struct *fsec;
3577 
3578 	fsec = file->f_security;
3579 	fsec->fown_sid = current_sid();
3580 }
3581 
3582 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3583 				       struct fown_struct *fown, int signum)
3584 {
3585 	struct file *file;
3586 	u32 sid = task_sid(tsk);
3587 	u32 perm;
3588 	struct file_security_struct *fsec;
3589 
3590 	/* struct fown_struct is never outside the context of a struct file */
3591 	file = container_of(fown, struct file, f_owner);
3592 
3593 	fsec = file->f_security;
3594 
3595 	if (!signum)
3596 		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3597 	else
3598 		perm = signal_to_av(signum);
3599 
3600 	return avc_has_perm(fsec->fown_sid, sid,
3601 			    SECCLASS_PROCESS, perm, NULL);
3602 }
3603 
3604 static int selinux_file_receive(struct file *file)
3605 {
3606 	const struct cred *cred = current_cred();
3607 
3608 	return file_has_perm(cred, file, file_to_av(file));
3609 }
3610 
3611 static int selinux_file_open(struct file *file, const struct cred *cred)
3612 {
3613 	struct file_security_struct *fsec;
3614 	struct inode_security_struct *isec;
3615 
3616 	fsec = file->f_security;
3617 	isec = inode_security(file_inode(file));
3618 	/*
3619 	 * Save inode label and policy sequence number
3620 	 * at open-time so that selinux_file_permission
3621 	 * can determine whether revalidation is necessary.
3622 	 * Task label is already saved in the file security
3623 	 * struct as its SID.
3624 	 */
3625 	fsec->isid = isec->sid;
3626 	fsec->pseqno = avc_policy_seqno();
3627 	/*
3628 	 * Since the inode label or policy seqno may have changed
3629 	 * between the selinux_inode_permission check and the saving
3630 	 * of state above, recheck that access is still permitted.
3631 	 * Otherwise, access might never be revalidated against the
3632 	 * new inode label or new policy.
3633 	 * This check is not redundant - do not remove.
3634 	 */
3635 	return file_path_has_perm(cred, file, open_file_to_av(file));
3636 }
3637 
3638 /* task security operations */
3639 
3640 static int selinux_task_create(unsigned long clone_flags)
3641 {
3642 	return current_has_perm(current, PROCESS__FORK);
3643 }
3644 
3645 /*
3646  * allocate the SELinux part of blank credentials
3647  */
3648 static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3649 {
3650 	struct task_security_struct *tsec;
3651 
3652 	tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3653 	if (!tsec)
3654 		return -ENOMEM;
3655 
3656 	cred->security = tsec;
3657 	return 0;
3658 }
3659 
3660 /*
3661  * detach and free the LSM part of a set of credentials
3662  */
3663 static void selinux_cred_free(struct cred *cred)
3664 {
3665 	struct task_security_struct *tsec = cred->security;
3666 
3667 	/*
3668 	 * cred->security == NULL if security_cred_alloc_blank() or
3669 	 * security_prepare_creds() returned an error.
3670 	 */
3671 	BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3672 	cred->security = (void *) 0x7UL;
3673 	kfree(tsec);
3674 }
3675 
3676 /*
3677  * prepare a new set of credentials for modification
3678  */
3679 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3680 				gfp_t gfp)
3681 {
3682 	const struct task_security_struct *old_tsec;
3683 	struct task_security_struct *tsec;
3684 
3685 	old_tsec = old->security;
3686 
3687 	tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3688 	if (!tsec)
3689 		return -ENOMEM;
3690 
3691 	new->security = tsec;
3692 	return 0;
3693 }
3694 
3695 /*
3696  * transfer the SELinux data to a blank set of creds
3697  */
3698 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3699 {
3700 	const struct task_security_struct *old_tsec = old->security;
3701 	struct task_security_struct *tsec = new->security;
3702 
3703 	*tsec = *old_tsec;
3704 }
3705 
3706 /*
3707  * set the security data for a kernel service
3708  * - all the creation contexts are set to unlabelled
3709  */
3710 static int selinux_kernel_act_as(struct cred *new, u32 secid)
3711 {
3712 	struct task_security_struct *tsec = new->security;
3713 	u32 sid = current_sid();
3714 	int ret;
3715 
3716 	ret = avc_has_perm(sid, secid,
3717 			   SECCLASS_KERNEL_SERVICE,
3718 			   KERNEL_SERVICE__USE_AS_OVERRIDE,
3719 			   NULL);
3720 	if (ret == 0) {
3721 		tsec->sid = secid;
3722 		tsec->create_sid = 0;
3723 		tsec->keycreate_sid = 0;
3724 		tsec->sockcreate_sid = 0;
3725 	}
3726 	return ret;
3727 }
3728 
3729 /*
3730  * set the file creation context in a security record to the same as the
3731  * objective context of the specified inode
3732  */
3733 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3734 {
3735 	struct inode_security_struct *isec = inode_security(inode);
3736 	struct task_security_struct *tsec = new->security;
3737 	u32 sid = current_sid();
3738 	int ret;
3739 
3740 	ret = avc_has_perm(sid, isec->sid,
3741 			   SECCLASS_KERNEL_SERVICE,
3742 			   KERNEL_SERVICE__CREATE_FILES_AS,
3743 			   NULL);
3744 
3745 	if (ret == 0)
3746 		tsec->create_sid = isec->sid;
3747 	return ret;
3748 }
3749 
3750 static int selinux_kernel_module_request(char *kmod_name)
3751 {
3752 	u32 sid;
3753 	struct common_audit_data ad;
3754 
3755 	sid = task_sid(current);
3756 
3757 	ad.type = LSM_AUDIT_DATA_KMOD;
3758 	ad.u.kmod_name = kmod_name;
3759 
3760 	return avc_has_perm(sid, SECINITSID_KERNEL, SECCLASS_SYSTEM,
3761 			    SYSTEM__MODULE_REQUEST, &ad);
3762 }
3763 
3764 static int selinux_kernel_module_from_file(struct file *file)
3765 {
3766 	struct common_audit_data ad;
3767 	struct inode_security_struct *isec;
3768 	struct file_security_struct *fsec;
3769 	u32 sid = current_sid();
3770 	int rc;
3771 
3772 	/* init_module */
3773 	if (file == NULL)
3774 		return avc_has_perm(sid, sid, SECCLASS_SYSTEM,
3775 					SYSTEM__MODULE_LOAD, NULL);
3776 
3777 	/* finit_module */
3778 
3779 	ad.type = LSM_AUDIT_DATA_PATH;
3780 	ad.u.path = file->f_path;
3781 
3782 	fsec = file->f_security;
3783 	if (sid != fsec->sid) {
3784 		rc = avc_has_perm(sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
3785 		if (rc)
3786 			return rc;
3787 	}
3788 
3789 	isec = inode_security(file_inode(file));
3790 	return avc_has_perm(sid, isec->sid, SECCLASS_SYSTEM,
3791 				SYSTEM__MODULE_LOAD, &ad);
3792 }
3793 
3794 static int selinux_kernel_read_file(struct file *file,
3795 				    enum kernel_read_file_id id)
3796 {
3797 	int rc = 0;
3798 
3799 	switch (id) {
3800 	case READING_MODULE:
3801 		rc = selinux_kernel_module_from_file(file);
3802 		break;
3803 	default:
3804 		break;
3805 	}
3806 
3807 	return rc;
3808 }
3809 
3810 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3811 {
3812 	return current_has_perm(p, PROCESS__SETPGID);
3813 }
3814 
3815 static int selinux_task_getpgid(struct task_struct *p)
3816 {
3817 	return current_has_perm(p, PROCESS__GETPGID);
3818 }
3819 
3820 static int selinux_task_getsid(struct task_struct *p)
3821 {
3822 	return current_has_perm(p, PROCESS__GETSESSION);
3823 }
3824 
3825 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3826 {
3827 	*secid = task_sid(p);
3828 }
3829 
3830 static int selinux_task_setnice(struct task_struct *p, int nice)
3831 {
3832 	return current_has_perm(p, PROCESS__SETSCHED);
3833 }
3834 
3835 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3836 {
3837 	return current_has_perm(p, PROCESS__SETSCHED);
3838 }
3839 
3840 static int selinux_task_getioprio(struct task_struct *p)
3841 {
3842 	return current_has_perm(p, PROCESS__GETSCHED);
3843 }
3844 
3845 static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
3846 		struct rlimit *new_rlim)
3847 {
3848 	struct rlimit *old_rlim = p->signal->rlim + resource;
3849 
3850 	/* Control the ability to change the hard limit (whether
3851 	   lowering or raising it), so that the hard limit can
3852 	   later be used as a safe reset point for the soft limit
3853 	   upon context transitions.  See selinux_bprm_committing_creds. */
3854 	if (old_rlim->rlim_max != new_rlim->rlim_max)
3855 		return current_has_perm(p, PROCESS__SETRLIMIT);
3856 
3857 	return 0;
3858 }
3859 
3860 static int selinux_task_setscheduler(struct task_struct *p)
3861 {
3862 	return current_has_perm(p, PROCESS__SETSCHED);
3863 }
3864 
3865 static int selinux_task_getscheduler(struct task_struct *p)
3866 {
3867 	return current_has_perm(p, PROCESS__GETSCHED);
3868 }
3869 
3870 static int selinux_task_movememory(struct task_struct *p)
3871 {
3872 	return current_has_perm(p, PROCESS__SETSCHED);
3873 }
3874 
3875 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3876 				int sig, u32 secid)
3877 {
3878 	u32 perm;
3879 	int rc;
3880 
3881 	if (!sig)
3882 		perm = PROCESS__SIGNULL; /* null signal; existence test */
3883 	else
3884 		perm = signal_to_av(sig);
3885 	if (secid)
3886 		rc = avc_has_perm(secid, task_sid(p),
3887 				  SECCLASS_PROCESS, perm, NULL);
3888 	else
3889 		rc = current_has_perm(p, perm);
3890 	return rc;
3891 }
3892 
3893 static int selinux_task_wait(struct task_struct *p)
3894 {
3895 	return task_has_perm(p, current, PROCESS__SIGCHLD);
3896 }
3897 
3898 static void selinux_task_to_inode(struct task_struct *p,
3899 				  struct inode *inode)
3900 {
3901 	struct inode_security_struct *isec = inode->i_security;
3902 	u32 sid = task_sid(p);
3903 
3904 	isec->sid = sid;
3905 	isec->initialized = LABEL_INITIALIZED;
3906 }
3907 
3908 /* Returns error only if unable to parse addresses */
3909 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3910 			struct common_audit_data *ad, u8 *proto)
3911 {
3912 	int offset, ihlen, ret = -EINVAL;
3913 	struct iphdr _iph, *ih;
3914 
3915 	offset = skb_network_offset(skb);
3916 	ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3917 	if (ih == NULL)
3918 		goto out;
3919 
3920 	ihlen = ih->ihl * 4;
3921 	if (ihlen < sizeof(_iph))
3922 		goto out;
3923 
3924 	ad->u.net->v4info.saddr = ih->saddr;
3925 	ad->u.net->v4info.daddr = ih->daddr;
3926 	ret = 0;
3927 
3928 	if (proto)
3929 		*proto = ih->protocol;
3930 
3931 	switch (ih->protocol) {
3932 	case IPPROTO_TCP: {
3933 		struct tcphdr _tcph, *th;
3934 
3935 		if (ntohs(ih->frag_off) & IP_OFFSET)
3936 			break;
3937 
3938 		offset += ihlen;
3939 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3940 		if (th == NULL)
3941 			break;
3942 
3943 		ad->u.net->sport = th->source;
3944 		ad->u.net->dport = th->dest;
3945 		break;
3946 	}
3947 
3948 	case IPPROTO_UDP: {
3949 		struct udphdr _udph, *uh;
3950 
3951 		if (ntohs(ih->frag_off) & IP_OFFSET)
3952 			break;
3953 
3954 		offset += ihlen;
3955 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3956 		if (uh == NULL)
3957 			break;
3958 
3959 		ad->u.net->sport = uh->source;
3960 		ad->u.net->dport = uh->dest;
3961 		break;
3962 	}
3963 
3964 	case IPPROTO_DCCP: {
3965 		struct dccp_hdr _dccph, *dh;
3966 
3967 		if (ntohs(ih->frag_off) & IP_OFFSET)
3968 			break;
3969 
3970 		offset += ihlen;
3971 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3972 		if (dh == NULL)
3973 			break;
3974 
3975 		ad->u.net->sport = dh->dccph_sport;
3976 		ad->u.net->dport = dh->dccph_dport;
3977 		break;
3978 	}
3979 
3980 	default:
3981 		break;
3982 	}
3983 out:
3984 	return ret;
3985 }
3986 
3987 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3988 
3989 /* Returns error only if unable to parse addresses */
3990 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3991 			struct common_audit_data *ad, u8 *proto)
3992 {
3993 	u8 nexthdr;
3994 	int ret = -EINVAL, offset;
3995 	struct ipv6hdr _ipv6h, *ip6;
3996 	__be16 frag_off;
3997 
3998 	offset = skb_network_offset(skb);
3999 	ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
4000 	if (ip6 == NULL)
4001 		goto out;
4002 
4003 	ad->u.net->v6info.saddr = ip6->saddr;
4004 	ad->u.net->v6info.daddr = ip6->daddr;
4005 	ret = 0;
4006 
4007 	nexthdr = ip6->nexthdr;
4008 	offset += sizeof(_ipv6h);
4009 	offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
4010 	if (offset < 0)
4011 		goto out;
4012 
4013 	if (proto)
4014 		*proto = nexthdr;
4015 
4016 	switch (nexthdr) {
4017 	case IPPROTO_TCP: {
4018 		struct tcphdr _tcph, *th;
4019 
4020 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4021 		if (th == NULL)
4022 			break;
4023 
4024 		ad->u.net->sport = th->source;
4025 		ad->u.net->dport = th->dest;
4026 		break;
4027 	}
4028 
4029 	case IPPROTO_UDP: {
4030 		struct udphdr _udph, *uh;
4031 
4032 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4033 		if (uh == NULL)
4034 			break;
4035 
4036 		ad->u.net->sport = uh->source;
4037 		ad->u.net->dport = uh->dest;
4038 		break;
4039 	}
4040 
4041 	case IPPROTO_DCCP: {
4042 		struct dccp_hdr _dccph, *dh;
4043 
4044 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4045 		if (dh == NULL)
4046 			break;
4047 
4048 		ad->u.net->sport = dh->dccph_sport;
4049 		ad->u.net->dport = dh->dccph_dport;
4050 		break;
4051 	}
4052 
4053 	/* includes fragments */
4054 	default:
4055 		break;
4056 	}
4057 out:
4058 	return ret;
4059 }
4060 
4061 #endif /* IPV6 */
4062 
4063 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
4064 			     char **_addrp, int src, u8 *proto)
4065 {
4066 	char *addrp;
4067 	int ret;
4068 
4069 	switch (ad->u.net->family) {
4070 	case PF_INET:
4071 		ret = selinux_parse_skb_ipv4(skb, ad, proto);
4072 		if (ret)
4073 			goto parse_error;
4074 		addrp = (char *)(src ? &ad->u.net->v4info.saddr :
4075 				       &ad->u.net->v4info.daddr);
4076 		goto okay;
4077 
4078 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4079 	case PF_INET6:
4080 		ret = selinux_parse_skb_ipv6(skb, ad, proto);
4081 		if (ret)
4082 			goto parse_error;
4083 		addrp = (char *)(src ? &ad->u.net->v6info.saddr :
4084 				       &ad->u.net->v6info.daddr);
4085 		goto okay;
4086 #endif	/* IPV6 */
4087 	default:
4088 		addrp = NULL;
4089 		goto okay;
4090 	}
4091 
4092 parse_error:
4093 	printk(KERN_WARNING
4094 	       "SELinux: failure in selinux_parse_skb(),"
4095 	       " unable to parse packet\n");
4096 	return ret;
4097 
4098 okay:
4099 	if (_addrp)
4100 		*_addrp = addrp;
4101 	return 0;
4102 }
4103 
4104 /**
4105  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
4106  * @skb: the packet
4107  * @family: protocol family
4108  * @sid: the packet's peer label SID
4109  *
4110  * Description:
4111  * Check the various different forms of network peer labeling and determine
4112  * the peer label/SID for the packet; most of the magic actually occurs in
4113  * the security server function security_net_peersid_cmp().  The function
4114  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
4115  * or -EACCES if @sid is invalid due to inconsistencies with the different
4116  * peer labels.
4117  *
4118  */
4119 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
4120 {
4121 	int err;
4122 	u32 xfrm_sid;
4123 	u32 nlbl_sid;
4124 	u32 nlbl_type;
4125 
4126 	err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
4127 	if (unlikely(err))
4128 		return -EACCES;
4129 	err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
4130 	if (unlikely(err))
4131 		return -EACCES;
4132 
4133 	err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
4134 	if (unlikely(err)) {
4135 		printk(KERN_WARNING
4136 		       "SELinux: failure in selinux_skb_peerlbl_sid(),"
4137 		       " unable to determine packet's peer label\n");
4138 		return -EACCES;
4139 	}
4140 
4141 	return 0;
4142 }
4143 
4144 /**
4145  * selinux_conn_sid - Determine the child socket label for a connection
4146  * @sk_sid: the parent socket's SID
4147  * @skb_sid: the packet's SID
4148  * @conn_sid: the resulting connection SID
4149  *
4150  * If @skb_sid is valid then the user:role:type information from @sk_sid is
4151  * combined with the MLS information from @skb_sid in order to create
4152  * @conn_sid.  If @skb_sid is not valid then then @conn_sid is simply a copy
4153  * of @sk_sid.  Returns zero on success, negative values on failure.
4154  *
4155  */
4156 static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
4157 {
4158 	int err = 0;
4159 
4160 	if (skb_sid != SECSID_NULL)
4161 		err = security_sid_mls_copy(sk_sid, skb_sid, conn_sid);
4162 	else
4163 		*conn_sid = sk_sid;
4164 
4165 	return err;
4166 }
4167 
4168 /* socket security operations */
4169 
4170 static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4171 				 u16 secclass, u32 *socksid)
4172 {
4173 	if (tsec->sockcreate_sid > SECSID_NULL) {
4174 		*socksid = tsec->sockcreate_sid;
4175 		return 0;
4176 	}
4177 
4178 	return security_transition_sid(tsec->sid, tsec->sid, secclass, NULL,
4179 				       socksid);
4180 }
4181 
4182 static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
4183 {
4184 	struct sk_security_struct *sksec = sk->sk_security;
4185 	struct common_audit_data ad;
4186 	struct lsm_network_audit net = {0,};
4187 	u32 tsid = task_sid(task);
4188 
4189 	if (sksec->sid == SECINITSID_KERNEL)
4190 		return 0;
4191 
4192 	ad.type = LSM_AUDIT_DATA_NET;
4193 	ad.u.net = &net;
4194 	ad.u.net->sk = sk;
4195 
4196 	return avc_has_perm(tsid, sksec->sid, sksec->sclass, perms, &ad);
4197 }
4198 
4199 static int selinux_socket_create(int family, int type,
4200 				 int protocol, int kern)
4201 {
4202 	const struct task_security_struct *tsec = current_security();
4203 	u32 newsid;
4204 	u16 secclass;
4205 	int rc;
4206 
4207 	if (kern)
4208 		return 0;
4209 
4210 	secclass = socket_type_to_security_class(family, type, protocol);
4211 	rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4212 	if (rc)
4213 		return rc;
4214 
4215 	return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4216 }
4217 
4218 static int selinux_socket_post_create(struct socket *sock, int family,
4219 				      int type, int protocol, int kern)
4220 {
4221 	const struct task_security_struct *tsec = current_security();
4222 	struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
4223 	struct sk_security_struct *sksec;
4224 	int err = 0;
4225 
4226 	isec->sclass = socket_type_to_security_class(family, type, protocol);
4227 
4228 	if (kern)
4229 		isec->sid = SECINITSID_KERNEL;
4230 	else {
4231 		err = socket_sockcreate_sid(tsec, isec->sclass, &(isec->sid));
4232 		if (err)
4233 			return err;
4234 	}
4235 
4236 	isec->initialized = LABEL_INITIALIZED;
4237 
4238 	if (sock->sk) {
4239 		sksec = sock->sk->sk_security;
4240 		sksec->sid = isec->sid;
4241 		sksec->sclass = isec->sclass;
4242 		err = selinux_netlbl_socket_post_create(sock->sk, family);
4243 	}
4244 
4245 	return err;
4246 }
4247 
4248 /* Range of port numbers used to automatically bind.
4249    Need to determine whether we should perform a name_bind
4250    permission check between the socket and the port number. */
4251 
4252 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4253 {
4254 	struct sock *sk = sock->sk;
4255 	u16 family;
4256 	int err;
4257 
4258 	err = sock_has_perm(current, sk, SOCKET__BIND);
4259 	if (err)
4260 		goto out;
4261 
4262 	/*
4263 	 * If PF_INET or PF_INET6, check name_bind permission for the port.
4264 	 * Multiple address binding for SCTP is not supported yet: we just
4265 	 * check the first address now.
4266 	 */
4267 	family = sk->sk_family;
4268 	if (family == PF_INET || family == PF_INET6) {
4269 		char *addrp;
4270 		struct sk_security_struct *sksec = sk->sk_security;
4271 		struct common_audit_data ad;
4272 		struct lsm_network_audit net = {0,};
4273 		struct sockaddr_in *addr4 = NULL;
4274 		struct sockaddr_in6 *addr6 = NULL;
4275 		unsigned short snum;
4276 		u32 sid, node_perm;
4277 
4278 		if (family == PF_INET) {
4279 			addr4 = (struct sockaddr_in *)address;
4280 			snum = ntohs(addr4->sin_port);
4281 			addrp = (char *)&addr4->sin_addr.s_addr;
4282 		} else {
4283 			addr6 = (struct sockaddr_in6 *)address;
4284 			snum = ntohs(addr6->sin6_port);
4285 			addrp = (char *)&addr6->sin6_addr.s6_addr;
4286 		}
4287 
4288 		if (snum) {
4289 			int low, high;
4290 
4291 			inet_get_local_port_range(sock_net(sk), &low, &high);
4292 
4293 			if (snum < max(PROT_SOCK, low) || snum > high) {
4294 				err = sel_netport_sid(sk->sk_protocol,
4295 						      snum, &sid);
4296 				if (err)
4297 					goto out;
4298 				ad.type = LSM_AUDIT_DATA_NET;
4299 				ad.u.net = &net;
4300 				ad.u.net->sport = htons(snum);
4301 				ad.u.net->family = family;
4302 				err = avc_has_perm(sksec->sid, sid,
4303 						   sksec->sclass,
4304 						   SOCKET__NAME_BIND, &ad);
4305 				if (err)
4306 					goto out;
4307 			}
4308 		}
4309 
4310 		switch (sksec->sclass) {
4311 		case SECCLASS_TCP_SOCKET:
4312 			node_perm = TCP_SOCKET__NODE_BIND;
4313 			break;
4314 
4315 		case SECCLASS_UDP_SOCKET:
4316 			node_perm = UDP_SOCKET__NODE_BIND;
4317 			break;
4318 
4319 		case SECCLASS_DCCP_SOCKET:
4320 			node_perm = DCCP_SOCKET__NODE_BIND;
4321 			break;
4322 
4323 		default:
4324 			node_perm = RAWIP_SOCKET__NODE_BIND;
4325 			break;
4326 		}
4327 
4328 		err = sel_netnode_sid(addrp, family, &sid);
4329 		if (err)
4330 			goto out;
4331 
4332 		ad.type = LSM_AUDIT_DATA_NET;
4333 		ad.u.net = &net;
4334 		ad.u.net->sport = htons(snum);
4335 		ad.u.net->family = family;
4336 
4337 		if (family == PF_INET)
4338 			ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4339 		else
4340 			ad.u.net->v6info.saddr = addr6->sin6_addr;
4341 
4342 		err = avc_has_perm(sksec->sid, sid,
4343 				   sksec->sclass, node_perm, &ad);
4344 		if (err)
4345 			goto out;
4346 	}
4347 out:
4348 	return err;
4349 }
4350 
4351 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
4352 {
4353 	struct sock *sk = sock->sk;
4354 	struct sk_security_struct *sksec = sk->sk_security;
4355 	int err;
4356 
4357 	err = sock_has_perm(current, sk, SOCKET__CONNECT);
4358 	if (err)
4359 		return err;
4360 
4361 	/*
4362 	 * If a TCP or DCCP socket, check name_connect permission for the port.
4363 	 */
4364 	if (sksec->sclass == SECCLASS_TCP_SOCKET ||
4365 	    sksec->sclass == SECCLASS_DCCP_SOCKET) {
4366 		struct common_audit_data ad;
4367 		struct lsm_network_audit net = {0,};
4368 		struct sockaddr_in *addr4 = NULL;
4369 		struct sockaddr_in6 *addr6 = NULL;
4370 		unsigned short snum;
4371 		u32 sid, perm;
4372 
4373 		if (sk->sk_family == PF_INET) {
4374 			addr4 = (struct sockaddr_in *)address;
4375 			if (addrlen < sizeof(struct sockaddr_in))
4376 				return -EINVAL;
4377 			snum = ntohs(addr4->sin_port);
4378 		} else {
4379 			addr6 = (struct sockaddr_in6 *)address;
4380 			if (addrlen < SIN6_LEN_RFC2133)
4381 				return -EINVAL;
4382 			snum = ntohs(addr6->sin6_port);
4383 		}
4384 
4385 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);
4386 		if (err)
4387 			goto out;
4388 
4389 		perm = (sksec->sclass == SECCLASS_TCP_SOCKET) ?
4390 		       TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
4391 
4392 		ad.type = LSM_AUDIT_DATA_NET;
4393 		ad.u.net = &net;
4394 		ad.u.net->dport = htons(snum);
4395 		ad.u.net->family = sk->sk_family;
4396 		err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
4397 		if (err)
4398 			goto out;
4399 	}
4400 
4401 	err = selinux_netlbl_socket_connect(sk, address);
4402 
4403 out:
4404 	return err;
4405 }
4406 
4407 static int selinux_socket_listen(struct socket *sock, int backlog)
4408 {
4409 	return sock_has_perm(current, sock->sk, SOCKET__LISTEN);
4410 }
4411 
4412 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
4413 {
4414 	int err;
4415 	struct inode_security_struct *isec;
4416 	struct inode_security_struct *newisec;
4417 
4418 	err = sock_has_perm(current, sock->sk, SOCKET__ACCEPT);
4419 	if (err)
4420 		return err;
4421 
4422 	newisec = inode_security_novalidate(SOCK_INODE(newsock));
4423 
4424 	isec = inode_security_novalidate(SOCK_INODE(sock));
4425 	newisec->sclass = isec->sclass;
4426 	newisec->sid = isec->sid;
4427 	newisec->initialized = LABEL_INITIALIZED;
4428 
4429 	return 0;
4430 }
4431 
4432 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
4433 				  int size)
4434 {
4435 	return sock_has_perm(current, sock->sk, SOCKET__WRITE);
4436 }
4437 
4438 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
4439 				  int size, int flags)
4440 {
4441 	return sock_has_perm(current, sock->sk, SOCKET__READ);
4442 }
4443 
4444 static int selinux_socket_getsockname(struct socket *sock)
4445 {
4446 	return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
4447 }
4448 
4449 static int selinux_socket_getpeername(struct socket *sock)
4450 {
4451 	return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
4452 }
4453 
4454 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
4455 {
4456 	int err;
4457 
4458 	err = sock_has_perm(current, sock->sk, SOCKET__SETOPT);
4459 	if (err)
4460 		return err;
4461 
4462 	return selinux_netlbl_socket_setsockopt(sock, level, optname);
4463 }
4464 
4465 static int selinux_socket_getsockopt(struct socket *sock, int level,
4466 				     int optname)
4467 {
4468 	return sock_has_perm(current, sock->sk, SOCKET__GETOPT);
4469 }
4470 
4471 static int selinux_socket_shutdown(struct socket *sock, int how)
4472 {
4473 	return sock_has_perm(current, sock->sk, SOCKET__SHUTDOWN);
4474 }
4475 
4476 static int selinux_socket_unix_stream_connect(struct sock *sock,
4477 					      struct sock *other,
4478 					      struct sock *newsk)
4479 {
4480 	struct sk_security_struct *sksec_sock = sock->sk_security;
4481 	struct sk_security_struct *sksec_other = other->sk_security;
4482 	struct sk_security_struct *sksec_new = newsk->sk_security;
4483 	struct common_audit_data ad;
4484 	struct lsm_network_audit net = {0,};
4485 	int err;
4486 
4487 	ad.type = LSM_AUDIT_DATA_NET;
4488 	ad.u.net = &net;
4489 	ad.u.net->sk = other;
4490 
4491 	err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
4492 			   sksec_other->sclass,
4493 			   UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4494 	if (err)
4495 		return err;
4496 
4497 	/* server child socket */
4498 	sksec_new->peer_sid = sksec_sock->sid;
4499 	err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4500 				    &sksec_new->sid);
4501 	if (err)
4502 		return err;
4503 
4504 	/* connecting socket */
4505 	sksec_sock->peer_sid = sksec_new->sid;
4506 
4507 	return 0;
4508 }
4509 
4510 static int selinux_socket_unix_may_send(struct socket *sock,
4511 					struct socket *other)
4512 {
4513 	struct sk_security_struct *ssec = sock->sk->sk_security;
4514 	struct sk_security_struct *osec = other->sk->sk_security;
4515 	struct common_audit_data ad;
4516 	struct lsm_network_audit net = {0,};
4517 
4518 	ad.type = LSM_AUDIT_DATA_NET;
4519 	ad.u.net = &net;
4520 	ad.u.net->sk = other->sk;
4521 
4522 	return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4523 			    &ad);
4524 }
4525 
4526 static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
4527 				    char *addrp, u16 family, u32 peer_sid,
4528 				    struct common_audit_data *ad)
4529 {
4530 	int err;
4531 	u32 if_sid;
4532 	u32 node_sid;
4533 
4534 	err = sel_netif_sid(ns, ifindex, &if_sid);
4535 	if (err)
4536 		return err;
4537 	err = avc_has_perm(peer_sid, if_sid,
4538 			   SECCLASS_NETIF, NETIF__INGRESS, ad);
4539 	if (err)
4540 		return err;
4541 
4542 	err = sel_netnode_sid(addrp, family, &node_sid);
4543 	if (err)
4544 		return err;
4545 	return avc_has_perm(peer_sid, node_sid,
4546 			    SECCLASS_NODE, NODE__RECVFROM, ad);
4547 }
4548 
4549 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4550 				       u16 family)
4551 {
4552 	int err = 0;
4553 	struct sk_security_struct *sksec = sk->sk_security;
4554 	u32 sk_sid = sksec->sid;
4555 	struct common_audit_data ad;
4556 	struct lsm_network_audit net = {0,};
4557 	char *addrp;
4558 
4559 	ad.type = LSM_AUDIT_DATA_NET;
4560 	ad.u.net = &net;
4561 	ad.u.net->netif = skb->skb_iif;
4562 	ad.u.net->family = family;
4563 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4564 	if (err)
4565 		return err;
4566 
4567 	if (selinux_secmark_enabled()) {
4568 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4569 				   PACKET__RECV, &ad);
4570 		if (err)
4571 			return err;
4572 	}
4573 
4574 	err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4575 	if (err)
4576 		return err;
4577 	err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4578 
4579 	return err;
4580 }
4581 
4582 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4583 {
4584 	int err;
4585 	struct sk_security_struct *sksec = sk->sk_security;
4586 	u16 family = sk->sk_family;
4587 	u32 sk_sid = sksec->sid;
4588 	struct common_audit_data ad;
4589 	struct lsm_network_audit net = {0,};
4590 	char *addrp;
4591 	u8 secmark_active;
4592 	u8 peerlbl_active;
4593 
4594 	if (family != PF_INET && family != PF_INET6)
4595 		return 0;
4596 
4597 	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
4598 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4599 		family = PF_INET;
4600 
4601 	/* If any sort of compatibility mode is enabled then handoff processing
4602 	 * to the selinux_sock_rcv_skb_compat() function to deal with the
4603 	 * special handling.  We do this in an attempt to keep this function
4604 	 * as fast and as clean as possible. */
4605 	if (!selinux_policycap_netpeer)
4606 		return selinux_sock_rcv_skb_compat(sk, skb, family);
4607 
4608 	secmark_active = selinux_secmark_enabled();
4609 	peerlbl_active = selinux_peerlbl_enabled();
4610 	if (!secmark_active && !peerlbl_active)
4611 		return 0;
4612 
4613 	ad.type = LSM_AUDIT_DATA_NET;
4614 	ad.u.net = &net;
4615 	ad.u.net->netif = skb->skb_iif;
4616 	ad.u.net->family = family;
4617 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4618 	if (err)
4619 		return err;
4620 
4621 	if (peerlbl_active) {
4622 		u32 peer_sid;
4623 
4624 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4625 		if (err)
4626 			return err;
4627 		err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
4628 					       addrp, family, peer_sid, &ad);
4629 		if (err) {
4630 			selinux_netlbl_err(skb, family, err, 0);
4631 			return err;
4632 		}
4633 		err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4634 				   PEER__RECV, &ad);
4635 		if (err) {
4636 			selinux_netlbl_err(skb, family, err, 0);
4637 			return err;
4638 		}
4639 	}
4640 
4641 	if (secmark_active) {
4642 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4643 				   PACKET__RECV, &ad);
4644 		if (err)
4645 			return err;
4646 	}
4647 
4648 	return err;
4649 }
4650 
4651 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4652 					    int __user *optlen, unsigned len)
4653 {
4654 	int err = 0;
4655 	char *scontext;
4656 	u32 scontext_len;
4657 	struct sk_security_struct *sksec = sock->sk->sk_security;
4658 	u32 peer_sid = SECSID_NULL;
4659 
4660 	if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4661 	    sksec->sclass == SECCLASS_TCP_SOCKET)
4662 		peer_sid = sksec->peer_sid;
4663 	if (peer_sid == SECSID_NULL)
4664 		return -ENOPROTOOPT;
4665 
4666 	err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4667 	if (err)
4668 		return err;
4669 
4670 	if (scontext_len > len) {
4671 		err = -ERANGE;
4672 		goto out_len;
4673 	}
4674 
4675 	if (copy_to_user(optval, scontext, scontext_len))
4676 		err = -EFAULT;
4677 
4678 out_len:
4679 	if (put_user(scontext_len, optlen))
4680 		err = -EFAULT;
4681 	kfree(scontext);
4682 	return err;
4683 }
4684 
4685 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4686 {
4687 	u32 peer_secid = SECSID_NULL;
4688 	u16 family;
4689 	struct inode_security_struct *isec;
4690 
4691 	if (skb && skb->protocol == htons(ETH_P_IP))
4692 		family = PF_INET;
4693 	else if (skb && skb->protocol == htons(ETH_P_IPV6))
4694 		family = PF_INET6;
4695 	else if (sock)
4696 		family = sock->sk->sk_family;
4697 	else
4698 		goto out;
4699 
4700 	if (sock && family == PF_UNIX) {
4701 		isec = inode_security_novalidate(SOCK_INODE(sock));
4702 		peer_secid = isec->sid;
4703 	} else if (skb)
4704 		selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4705 
4706 out:
4707 	*secid = peer_secid;
4708 	if (peer_secid == SECSID_NULL)
4709 		return -EINVAL;
4710 	return 0;
4711 }
4712 
4713 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4714 {
4715 	struct sk_security_struct *sksec;
4716 
4717 	sksec = kzalloc(sizeof(*sksec), priority);
4718 	if (!sksec)
4719 		return -ENOMEM;
4720 
4721 	sksec->peer_sid = SECINITSID_UNLABELED;
4722 	sksec->sid = SECINITSID_UNLABELED;
4723 	sksec->sclass = SECCLASS_SOCKET;
4724 	selinux_netlbl_sk_security_reset(sksec);
4725 	sk->sk_security = sksec;
4726 
4727 	return 0;
4728 }
4729 
4730 static void selinux_sk_free_security(struct sock *sk)
4731 {
4732 	struct sk_security_struct *sksec = sk->sk_security;
4733 
4734 	sk->sk_security = NULL;
4735 	selinux_netlbl_sk_security_free(sksec);
4736 	kfree(sksec);
4737 }
4738 
4739 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4740 {
4741 	struct sk_security_struct *sksec = sk->sk_security;
4742 	struct sk_security_struct *newsksec = newsk->sk_security;
4743 
4744 	newsksec->sid = sksec->sid;
4745 	newsksec->peer_sid = sksec->peer_sid;
4746 	newsksec->sclass = sksec->sclass;
4747 
4748 	selinux_netlbl_sk_security_reset(newsksec);
4749 }
4750 
4751 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4752 {
4753 	if (!sk)
4754 		*secid = SECINITSID_ANY_SOCKET;
4755 	else {
4756 		struct sk_security_struct *sksec = sk->sk_security;
4757 
4758 		*secid = sksec->sid;
4759 	}
4760 }
4761 
4762 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4763 {
4764 	struct inode_security_struct *isec =
4765 		inode_security_novalidate(SOCK_INODE(parent));
4766 	struct sk_security_struct *sksec = sk->sk_security;
4767 
4768 	if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4769 	    sk->sk_family == PF_UNIX)
4770 		isec->sid = sksec->sid;
4771 	sksec->sclass = isec->sclass;
4772 }
4773 
4774 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4775 				     struct request_sock *req)
4776 {
4777 	struct sk_security_struct *sksec = sk->sk_security;
4778 	int err;
4779 	u16 family = req->rsk_ops->family;
4780 	u32 connsid;
4781 	u32 peersid;
4782 
4783 	err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4784 	if (err)
4785 		return err;
4786 	err = selinux_conn_sid(sksec->sid, peersid, &connsid);
4787 	if (err)
4788 		return err;
4789 	req->secid = connsid;
4790 	req->peer_secid = peersid;
4791 
4792 	return selinux_netlbl_inet_conn_request(req, family);
4793 }
4794 
4795 static void selinux_inet_csk_clone(struct sock *newsk,
4796 				   const struct request_sock *req)
4797 {
4798 	struct sk_security_struct *newsksec = newsk->sk_security;
4799 
4800 	newsksec->sid = req->secid;
4801 	newsksec->peer_sid = req->peer_secid;
4802 	/* NOTE: Ideally, we should also get the isec->sid for the
4803 	   new socket in sync, but we don't have the isec available yet.
4804 	   So we will wait until sock_graft to do it, by which
4805 	   time it will have been created and available. */
4806 
4807 	/* We don't need to take any sort of lock here as we are the only
4808 	 * thread with access to newsksec */
4809 	selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4810 }
4811 
4812 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4813 {
4814 	u16 family = sk->sk_family;
4815 	struct sk_security_struct *sksec = sk->sk_security;
4816 
4817 	/* handle mapped IPv4 packets arriving via IPv6 sockets */
4818 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4819 		family = PF_INET;
4820 
4821 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4822 }
4823 
4824 static int selinux_secmark_relabel_packet(u32 sid)
4825 {
4826 	const struct task_security_struct *__tsec;
4827 	u32 tsid;
4828 
4829 	__tsec = current_security();
4830 	tsid = __tsec->sid;
4831 
4832 	return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
4833 }
4834 
4835 static void selinux_secmark_refcount_inc(void)
4836 {
4837 	atomic_inc(&selinux_secmark_refcount);
4838 }
4839 
4840 static void selinux_secmark_refcount_dec(void)
4841 {
4842 	atomic_dec(&selinux_secmark_refcount);
4843 }
4844 
4845 static void selinux_req_classify_flow(const struct request_sock *req,
4846 				      struct flowi *fl)
4847 {
4848 	fl->flowi_secid = req->secid;
4849 }
4850 
4851 static int selinux_tun_dev_alloc_security(void **security)
4852 {
4853 	struct tun_security_struct *tunsec;
4854 
4855 	tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
4856 	if (!tunsec)
4857 		return -ENOMEM;
4858 	tunsec->sid = current_sid();
4859 
4860 	*security = tunsec;
4861 	return 0;
4862 }
4863 
4864 static void selinux_tun_dev_free_security(void *security)
4865 {
4866 	kfree(security);
4867 }
4868 
4869 static int selinux_tun_dev_create(void)
4870 {
4871 	u32 sid = current_sid();
4872 
4873 	/* we aren't taking into account the "sockcreate" SID since the socket
4874 	 * that is being created here is not a socket in the traditional sense,
4875 	 * instead it is a private sock, accessible only to the kernel, and
4876 	 * representing a wide range of network traffic spanning multiple
4877 	 * connections unlike traditional sockets - check the TUN driver to
4878 	 * get a better understanding of why this socket is special */
4879 
4880 	return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
4881 			    NULL);
4882 }
4883 
4884 static int selinux_tun_dev_attach_queue(void *security)
4885 {
4886 	struct tun_security_struct *tunsec = security;
4887 
4888 	return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
4889 			    TUN_SOCKET__ATTACH_QUEUE, NULL);
4890 }
4891 
4892 static int selinux_tun_dev_attach(struct sock *sk, void *security)
4893 {
4894 	struct tun_security_struct *tunsec = security;
4895 	struct sk_security_struct *sksec = sk->sk_security;
4896 
4897 	/* we don't currently perform any NetLabel based labeling here and it
4898 	 * isn't clear that we would want to do so anyway; while we could apply
4899 	 * labeling without the support of the TUN user the resulting labeled
4900 	 * traffic from the other end of the connection would almost certainly
4901 	 * cause confusion to the TUN user that had no idea network labeling
4902 	 * protocols were being used */
4903 
4904 	sksec->sid = tunsec->sid;
4905 	sksec->sclass = SECCLASS_TUN_SOCKET;
4906 
4907 	return 0;
4908 }
4909 
4910 static int selinux_tun_dev_open(void *security)
4911 {
4912 	struct tun_security_struct *tunsec = security;
4913 	u32 sid = current_sid();
4914 	int err;
4915 
4916 	err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
4917 			   TUN_SOCKET__RELABELFROM, NULL);
4918 	if (err)
4919 		return err;
4920 	err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
4921 			   TUN_SOCKET__RELABELTO, NULL);
4922 	if (err)
4923 		return err;
4924 	tunsec->sid = sid;
4925 
4926 	return 0;
4927 }
4928 
4929 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4930 {
4931 	int err = 0;
4932 	u32 perm;
4933 	struct nlmsghdr *nlh;
4934 	struct sk_security_struct *sksec = sk->sk_security;
4935 
4936 	if (skb->len < NLMSG_HDRLEN) {
4937 		err = -EINVAL;
4938 		goto out;
4939 	}
4940 	nlh = nlmsg_hdr(skb);
4941 
4942 	err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
4943 	if (err) {
4944 		if (err == -EINVAL) {
4945 			pr_warn_ratelimited("SELinux: unrecognized netlink"
4946 			       " message: protocol=%hu nlmsg_type=%hu sclass=%s"
4947 			       " pig=%d comm=%s\n",
4948 			       sk->sk_protocol, nlh->nlmsg_type,
4949 			       secclass_map[sksec->sclass - 1].name,
4950 			       task_pid_nr(current), current->comm);
4951 			if (!selinux_enforcing || security_get_allow_unknown())
4952 				err = 0;
4953 		}
4954 
4955 		/* Ignore */
4956 		if (err == -ENOENT)
4957 			err = 0;
4958 		goto out;
4959 	}
4960 
4961 	err = sock_has_perm(current, sk, perm);
4962 out:
4963 	return err;
4964 }
4965 
4966 #ifdef CONFIG_NETFILTER
4967 
4968 static unsigned int selinux_ip_forward(struct sk_buff *skb,
4969 				       const struct net_device *indev,
4970 				       u16 family)
4971 {
4972 	int err;
4973 	char *addrp;
4974 	u32 peer_sid;
4975 	struct common_audit_data ad;
4976 	struct lsm_network_audit net = {0,};
4977 	u8 secmark_active;
4978 	u8 netlbl_active;
4979 	u8 peerlbl_active;
4980 
4981 	if (!selinux_policycap_netpeer)
4982 		return NF_ACCEPT;
4983 
4984 	secmark_active = selinux_secmark_enabled();
4985 	netlbl_active = netlbl_enabled();
4986 	peerlbl_active = selinux_peerlbl_enabled();
4987 	if (!secmark_active && !peerlbl_active)
4988 		return NF_ACCEPT;
4989 
4990 	if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4991 		return NF_DROP;
4992 
4993 	ad.type = LSM_AUDIT_DATA_NET;
4994 	ad.u.net = &net;
4995 	ad.u.net->netif = indev->ifindex;
4996 	ad.u.net->family = family;
4997 	if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4998 		return NF_DROP;
4999 
5000 	if (peerlbl_active) {
5001 		err = selinux_inet_sys_rcv_skb(dev_net(indev), indev->ifindex,
5002 					       addrp, family, peer_sid, &ad);
5003 		if (err) {
5004 			selinux_netlbl_err(skb, family, err, 1);
5005 			return NF_DROP;
5006 		}
5007 	}
5008 
5009 	if (secmark_active)
5010 		if (avc_has_perm(peer_sid, skb->secmark,
5011 				 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
5012 			return NF_DROP;
5013 
5014 	if (netlbl_active)
5015 		/* we do this in the FORWARD path and not the POST_ROUTING
5016 		 * path because we want to make sure we apply the necessary
5017 		 * labeling before IPsec is applied so we can leverage AH
5018 		 * protection */
5019 		if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
5020 			return NF_DROP;
5021 
5022 	return NF_ACCEPT;
5023 }
5024 
5025 static unsigned int selinux_ipv4_forward(void *priv,
5026 					 struct sk_buff *skb,
5027 					 const struct nf_hook_state *state)
5028 {
5029 	return selinux_ip_forward(skb, state->in, PF_INET);
5030 }
5031 
5032 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5033 static unsigned int selinux_ipv6_forward(void *priv,
5034 					 struct sk_buff *skb,
5035 					 const struct nf_hook_state *state)
5036 {
5037 	return selinux_ip_forward(skb, state->in, PF_INET6);
5038 }
5039 #endif	/* IPV6 */
5040 
5041 static unsigned int selinux_ip_output(struct sk_buff *skb,
5042 				      u16 family)
5043 {
5044 	struct sock *sk;
5045 	u32 sid;
5046 
5047 	if (!netlbl_enabled())
5048 		return NF_ACCEPT;
5049 
5050 	/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
5051 	 * because we want to make sure we apply the necessary labeling
5052 	 * before IPsec is applied so we can leverage AH protection */
5053 	sk = skb->sk;
5054 	if (sk) {
5055 		struct sk_security_struct *sksec;
5056 
5057 		if (sk_listener(sk))
5058 			/* if the socket is the listening state then this
5059 			 * packet is a SYN-ACK packet which means it needs to
5060 			 * be labeled based on the connection/request_sock and
5061 			 * not the parent socket.  unfortunately, we can't
5062 			 * lookup the request_sock yet as it isn't queued on
5063 			 * the parent socket until after the SYN-ACK is sent.
5064 			 * the "solution" is to simply pass the packet as-is
5065 			 * as any IP option based labeling should be copied
5066 			 * from the initial connection request (in the IP
5067 			 * layer).  it is far from ideal, but until we get a
5068 			 * security label in the packet itself this is the
5069 			 * best we can do. */
5070 			return NF_ACCEPT;
5071 
5072 		/* standard practice, label using the parent socket */
5073 		sksec = sk->sk_security;
5074 		sid = sksec->sid;
5075 	} else
5076 		sid = SECINITSID_KERNEL;
5077 	if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
5078 		return NF_DROP;
5079 
5080 	return NF_ACCEPT;
5081 }
5082 
5083 static unsigned int selinux_ipv4_output(void *priv,
5084 					struct sk_buff *skb,
5085 					const struct nf_hook_state *state)
5086 {
5087 	return selinux_ip_output(skb, PF_INET);
5088 }
5089 
5090 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5091 static unsigned int selinux_ipv6_output(void *priv,
5092 					struct sk_buff *skb,
5093 					const struct nf_hook_state *state)
5094 {
5095 	return selinux_ip_output(skb, PF_INET6);
5096 }
5097 #endif	/* IPV6 */
5098 
5099 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
5100 						int ifindex,
5101 						u16 family)
5102 {
5103 	struct sock *sk = skb_to_full_sk(skb);
5104 	struct sk_security_struct *sksec;
5105 	struct common_audit_data ad;
5106 	struct lsm_network_audit net = {0,};
5107 	char *addrp;
5108 	u8 proto;
5109 
5110 	if (sk == NULL)
5111 		return NF_ACCEPT;
5112 	sksec = sk->sk_security;
5113 
5114 	ad.type = LSM_AUDIT_DATA_NET;
5115 	ad.u.net = &net;
5116 	ad.u.net->netif = ifindex;
5117 	ad.u.net->family = family;
5118 	if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
5119 		return NF_DROP;
5120 
5121 	if (selinux_secmark_enabled())
5122 		if (avc_has_perm(sksec->sid, skb->secmark,
5123 				 SECCLASS_PACKET, PACKET__SEND, &ad))
5124 			return NF_DROP_ERR(-ECONNREFUSED);
5125 
5126 	if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
5127 		return NF_DROP_ERR(-ECONNREFUSED);
5128 
5129 	return NF_ACCEPT;
5130 }
5131 
5132 static unsigned int selinux_ip_postroute(struct sk_buff *skb,
5133 					 const struct net_device *outdev,
5134 					 u16 family)
5135 {
5136 	u32 secmark_perm;
5137 	u32 peer_sid;
5138 	int ifindex = outdev->ifindex;
5139 	struct sock *sk;
5140 	struct common_audit_data ad;
5141 	struct lsm_network_audit net = {0,};
5142 	char *addrp;
5143 	u8 secmark_active;
5144 	u8 peerlbl_active;
5145 
5146 	/* If any sort of compatibility mode is enabled then handoff processing
5147 	 * to the selinux_ip_postroute_compat() function to deal with the
5148 	 * special handling.  We do this in an attempt to keep this function
5149 	 * as fast and as clean as possible. */
5150 	if (!selinux_policycap_netpeer)
5151 		return selinux_ip_postroute_compat(skb, ifindex, family);
5152 
5153 	secmark_active = selinux_secmark_enabled();
5154 	peerlbl_active = selinux_peerlbl_enabled();
5155 	if (!secmark_active && !peerlbl_active)
5156 		return NF_ACCEPT;
5157 
5158 	sk = skb_to_full_sk(skb);
5159 
5160 #ifdef CONFIG_XFRM
5161 	/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
5162 	 * packet transformation so allow the packet to pass without any checks
5163 	 * since we'll have another chance to perform access control checks
5164 	 * when the packet is on it's final way out.
5165 	 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
5166 	 *       is NULL, in this case go ahead and apply access control.
5167 	 * NOTE: if this is a local socket (skb->sk != NULL) that is in the
5168 	 *       TCP listening state we cannot wait until the XFRM processing
5169 	 *       is done as we will miss out on the SA label if we do;
5170 	 *       unfortunately, this means more work, but it is only once per
5171 	 *       connection. */
5172 	if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
5173 	    !(sk && sk_listener(sk)))
5174 		return NF_ACCEPT;
5175 #endif
5176 
5177 	if (sk == NULL) {
5178 		/* Without an associated socket the packet is either coming
5179 		 * from the kernel or it is being forwarded; check the packet
5180 		 * to determine which and if the packet is being forwarded
5181 		 * query the packet directly to determine the security label. */
5182 		if (skb->skb_iif) {
5183 			secmark_perm = PACKET__FORWARD_OUT;
5184 			if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
5185 				return NF_DROP;
5186 		} else {
5187 			secmark_perm = PACKET__SEND;
5188 			peer_sid = SECINITSID_KERNEL;
5189 		}
5190 	} else if (sk_listener(sk)) {
5191 		/* Locally generated packet but the associated socket is in the
5192 		 * listening state which means this is a SYN-ACK packet.  In
5193 		 * this particular case the correct security label is assigned
5194 		 * to the connection/request_sock but unfortunately we can't
5195 		 * query the request_sock as it isn't queued on the parent
5196 		 * socket until after the SYN-ACK packet is sent; the only
5197 		 * viable choice is to regenerate the label like we do in
5198 		 * selinux_inet_conn_request().  See also selinux_ip_output()
5199 		 * for similar problems. */
5200 		u32 skb_sid;
5201 		struct sk_security_struct *sksec;
5202 
5203 		sksec = sk->sk_security;
5204 		if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
5205 			return NF_DROP;
5206 		/* At this point, if the returned skb peerlbl is SECSID_NULL
5207 		 * and the packet has been through at least one XFRM
5208 		 * transformation then we must be dealing with the "final"
5209 		 * form of labeled IPsec packet; since we've already applied
5210 		 * all of our access controls on this packet we can safely
5211 		 * pass the packet. */
5212 		if (skb_sid == SECSID_NULL) {
5213 			switch (family) {
5214 			case PF_INET:
5215 				if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
5216 					return NF_ACCEPT;
5217 				break;
5218 			case PF_INET6:
5219 				if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
5220 					return NF_ACCEPT;
5221 				break;
5222 			default:
5223 				return NF_DROP_ERR(-ECONNREFUSED);
5224 			}
5225 		}
5226 		if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
5227 			return NF_DROP;
5228 		secmark_perm = PACKET__SEND;
5229 	} else {
5230 		/* Locally generated packet, fetch the security label from the
5231 		 * associated socket. */
5232 		struct sk_security_struct *sksec = sk->sk_security;
5233 		peer_sid = sksec->sid;
5234 		secmark_perm = PACKET__SEND;
5235 	}
5236 
5237 	ad.type = LSM_AUDIT_DATA_NET;
5238 	ad.u.net = &net;
5239 	ad.u.net->netif = ifindex;
5240 	ad.u.net->family = family;
5241 	if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
5242 		return NF_DROP;
5243 
5244 	if (secmark_active)
5245 		if (avc_has_perm(peer_sid, skb->secmark,
5246 				 SECCLASS_PACKET, secmark_perm, &ad))
5247 			return NF_DROP_ERR(-ECONNREFUSED);
5248 
5249 	if (peerlbl_active) {
5250 		u32 if_sid;
5251 		u32 node_sid;
5252 
5253 		if (sel_netif_sid(dev_net(outdev), ifindex, &if_sid))
5254 			return NF_DROP;
5255 		if (avc_has_perm(peer_sid, if_sid,
5256 				 SECCLASS_NETIF, NETIF__EGRESS, &ad))
5257 			return NF_DROP_ERR(-ECONNREFUSED);
5258 
5259 		if (sel_netnode_sid(addrp, family, &node_sid))
5260 			return NF_DROP;
5261 		if (avc_has_perm(peer_sid, node_sid,
5262 				 SECCLASS_NODE, NODE__SENDTO, &ad))
5263 			return NF_DROP_ERR(-ECONNREFUSED);
5264 	}
5265 
5266 	return NF_ACCEPT;
5267 }
5268 
5269 static unsigned int selinux_ipv4_postroute(void *priv,
5270 					   struct sk_buff *skb,
5271 					   const struct nf_hook_state *state)
5272 {
5273 	return selinux_ip_postroute(skb, state->out, PF_INET);
5274 }
5275 
5276 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5277 static unsigned int selinux_ipv6_postroute(void *priv,
5278 					   struct sk_buff *skb,
5279 					   const struct nf_hook_state *state)
5280 {
5281 	return selinux_ip_postroute(skb, state->out, PF_INET6);
5282 }
5283 #endif	/* IPV6 */
5284 
5285 #endif	/* CONFIG_NETFILTER */
5286 
5287 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
5288 {
5289 	return selinux_nlmsg_perm(sk, skb);
5290 }
5291 
5292 static int ipc_alloc_security(struct task_struct *task,
5293 			      struct kern_ipc_perm *perm,
5294 			      u16 sclass)
5295 {
5296 	struct ipc_security_struct *isec;
5297 	u32 sid;
5298 
5299 	isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
5300 	if (!isec)
5301 		return -ENOMEM;
5302 
5303 	sid = task_sid(task);
5304 	isec->sclass = sclass;
5305 	isec->sid = sid;
5306 	perm->security = isec;
5307 
5308 	return 0;
5309 }
5310 
5311 static void ipc_free_security(struct kern_ipc_perm *perm)
5312 {
5313 	struct ipc_security_struct *isec = perm->security;
5314 	perm->security = NULL;
5315 	kfree(isec);
5316 }
5317 
5318 static int msg_msg_alloc_security(struct msg_msg *msg)
5319 {
5320 	struct msg_security_struct *msec;
5321 
5322 	msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
5323 	if (!msec)
5324 		return -ENOMEM;
5325 
5326 	msec->sid = SECINITSID_UNLABELED;
5327 	msg->security = msec;
5328 
5329 	return 0;
5330 }
5331 
5332 static void msg_msg_free_security(struct msg_msg *msg)
5333 {
5334 	struct msg_security_struct *msec = msg->security;
5335 
5336 	msg->security = NULL;
5337 	kfree(msec);
5338 }
5339 
5340 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
5341 			u32 perms)
5342 {
5343 	struct ipc_security_struct *isec;
5344 	struct common_audit_data ad;
5345 	u32 sid = current_sid();
5346 
5347 	isec = ipc_perms->security;
5348 
5349 	ad.type = LSM_AUDIT_DATA_IPC;
5350 	ad.u.ipc_id = ipc_perms->key;
5351 
5352 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
5353 }
5354 
5355 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
5356 {
5357 	return msg_msg_alloc_security(msg);
5358 }
5359 
5360 static void selinux_msg_msg_free_security(struct msg_msg *msg)
5361 {
5362 	msg_msg_free_security(msg);
5363 }
5364 
5365 /* message queue security operations */
5366 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
5367 {
5368 	struct ipc_security_struct *isec;
5369 	struct common_audit_data ad;
5370 	u32 sid = current_sid();
5371 	int rc;
5372 
5373 	rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
5374 	if (rc)
5375 		return rc;
5376 
5377 	isec = msq->q_perm.security;
5378 
5379 	ad.type = LSM_AUDIT_DATA_IPC;
5380 	ad.u.ipc_id = msq->q_perm.key;
5381 
5382 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5383 			  MSGQ__CREATE, &ad);
5384 	if (rc) {
5385 		ipc_free_security(&msq->q_perm);
5386 		return rc;
5387 	}
5388 	return 0;
5389 }
5390 
5391 static void selinux_msg_queue_free_security(struct msg_queue *msq)
5392 {
5393 	ipc_free_security(&msq->q_perm);
5394 }
5395 
5396 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
5397 {
5398 	struct ipc_security_struct *isec;
5399 	struct common_audit_data ad;
5400 	u32 sid = current_sid();
5401 
5402 	isec = msq->q_perm.security;
5403 
5404 	ad.type = LSM_AUDIT_DATA_IPC;
5405 	ad.u.ipc_id = msq->q_perm.key;
5406 
5407 	return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5408 			    MSGQ__ASSOCIATE, &ad);
5409 }
5410 
5411 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
5412 {
5413 	int err;
5414 	int perms;
5415 
5416 	switch (cmd) {
5417 	case IPC_INFO:
5418 	case MSG_INFO:
5419 		/* No specific object, just general system-wide information. */
5420 		return task_has_system(current, SYSTEM__IPC_INFO);
5421 	case IPC_STAT:
5422 	case MSG_STAT:
5423 		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
5424 		break;
5425 	case IPC_SET:
5426 		perms = MSGQ__SETATTR;
5427 		break;
5428 	case IPC_RMID:
5429 		perms = MSGQ__DESTROY;
5430 		break;
5431 	default:
5432 		return 0;
5433 	}
5434 
5435 	err = ipc_has_perm(&msq->q_perm, perms);
5436 	return err;
5437 }
5438 
5439 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
5440 {
5441 	struct ipc_security_struct *isec;
5442 	struct msg_security_struct *msec;
5443 	struct common_audit_data ad;
5444 	u32 sid = current_sid();
5445 	int rc;
5446 
5447 	isec = msq->q_perm.security;
5448 	msec = msg->security;
5449 
5450 	/*
5451 	 * First time through, need to assign label to the message
5452 	 */
5453 	if (msec->sid == SECINITSID_UNLABELED) {
5454 		/*
5455 		 * Compute new sid based on current process and
5456 		 * message queue this message will be stored in
5457 		 */
5458 		rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
5459 					     NULL, &msec->sid);
5460 		if (rc)
5461 			return rc;
5462 	}
5463 
5464 	ad.type = LSM_AUDIT_DATA_IPC;
5465 	ad.u.ipc_id = msq->q_perm.key;
5466 
5467 	/* Can this process write to the queue? */
5468 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5469 			  MSGQ__WRITE, &ad);
5470 	if (!rc)
5471 		/* Can this process send the message */
5472 		rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
5473 				  MSG__SEND, &ad);
5474 	if (!rc)
5475 		/* Can the message be put in the queue? */
5476 		rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
5477 				  MSGQ__ENQUEUE, &ad);
5478 
5479 	return rc;
5480 }
5481 
5482 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
5483 				    struct task_struct *target,
5484 				    long type, int mode)
5485 {
5486 	struct ipc_security_struct *isec;
5487 	struct msg_security_struct *msec;
5488 	struct common_audit_data ad;
5489 	u32 sid = task_sid(target);
5490 	int rc;
5491 
5492 	isec = msq->q_perm.security;
5493 	msec = msg->security;
5494 
5495 	ad.type = LSM_AUDIT_DATA_IPC;
5496 	ad.u.ipc_id = msq->q_perm.key;
5497 
5498 	rc = avc_has_perm(sid, isec->sid,
5499 			  SECCLASS_MSGQ, MSGQ__READ, &ad);
5500 	if (!rc)
5501 		rc = avc_has_perm(sid, msec->sid,
5502 				  SECCLASS_MSG, MSG__RECEIVE, &ad);
5503 	return rc;
5504 }
5505 
5506 /* Shared Memory security operations */
5507 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
5508 {
5509 	struct ipc_security_struct *isec;
5510 	struct common_audit_data ad;
5511 	u32 sid = current_sid();
5512 	int rc;
5513 
5514 	rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
5515 	if (rc)
5516 		return rc;
5517 
5518 	isec = shp->shm_perm.security;
5519 
5520 	ad.type = LSM_AUDIT_DATA_IPC;
5521 	ad.u.ipc_id = shp->shm_perm.key;
5522 
5523 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5524 			  SHM__CREATE, &ad);
5525 	if (rc) {
5526 		ipc_free_security(&shp->shm_perm);
5527 		return rc;
5528 	}
5529 	return 0;
5530 }
5531 
5532 static void selinux_shm_free_security(struct shmid_kernel *shp)
5533 {
5534 	ipc_free_security(&shp->shm_perm);
5535 }
5536 
5537 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
5538 {
5539 	struct ipc_security_struct *isec;
5540 	struct common_audit_data ad;
5541 	u32 sid = current_sid();
5542 
5543 	isec = shp->shm_perm.security;
5544 
5545 	ad.type = LSM_AUDIT_DATA_IPC;
5546 	ad.u.ipc_id = shp->shm_perm.key;
5547 
5548 	return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5549 			    SHM__ASSOCIATE, &ad);
5550 }
5551 
5552 /* Note, at this point, shp is locked down */
5553 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5554 {
5555 	int perms;
5556 	int err;
5557 
5558 	switch (cmd) {
5559 	case IPC_INFO:
5560 	case SHM_INFO:
5561 		/* No specific object, just general system-wide information. */
5562 		return task_has_system(current, SYSTEM__IPC_INFO);
5563 	case IPC_STAT:
5564 	case SHM_STAT:
5565 		perms = SHM__GETATTR | SHM__ASSOCIATE;
5566 		break;
5567 	case IPC_SET:
5568 		perms = SHM__SETATTR;
5569 		break;
5570 	case SHM_LOCK:
5571 	case SHM_UNLOCK:
5572 		perms = SHM__LOCK;
5573 		break;
5574 	case IPC_RMID:
5575 		perms = SHM__DESTROY;
5576 		break;
5577 	default:
5578 		return 0;
5579 	}
5580 
5581 	err = ipc_has_perm(&shp->shm_perm, perms);
5582 	return err;
5583 }
5584 
5585 static int selinux_shm_shmat(struct shmid_kernel *shp,
5586 			     char __user *shmaddr, int shmflg)
5587 {
5588 	u32 perms;
5589 
5590 	if (shmflg & SHM_RDONLY)
5591 		perms = SHM__READ;
5592 	else
5593 		perms = SHM__READ | SHM__WRITE;
5594 
5595 	return ipc_has_perm(&shp->shm_perm, perms);
5596 }
5597 
5598 /* Semaphore security operations */
5599 static int selinux_sem_alloc_security(struct sem_array *sma)
5600 {
5601 	struct ipc_security_struct *isec;
5602 	struct common_audit_data ad;
5603 	u32 sid = current_sid();
5604 	int rc;
5605 
5606 	rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
5607 	if (rc)
5608 		return rc;
5609 
5610 	isec = sma->sem_perm.security;
5611 
5612 	ad.type = LSM_AUDIT_DATA_IPC;
5613 	ad.u.ipc_id = sma->sem_perm.key;
5614 
5615 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5616 			  SEM__CREATE, &ad);
5617 	if (rc) {
5618 		ipc_free_security(&sma->sem_perm);
5619 		return rc;
5620 	}
5621 	return 0;
5622 }
5623 
5624 static void selinux_sem_free_security(struct sem_array *sma)
5625 {
5626 	ipc_free_security(&sma->sem_perm);
5627 }
5628 
5629 static int selinux_sem_associate(struct sem_array *sma, int semflg)
5630 {
5631 	struct ipc_security_struct *isec;
5632 	struct common_audit_data ad;
5633 	u32 sid = current_sid();
5634 
5635 	isec = sma->sem_perm.security;
5636 
5637 	ad.type = LSM_AUDIT_DATA_IPC;
5638 	ad.u.ipc_id = sma->sem_perm.key;
5639 
5640 	return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5641 			    SEM__ASSOCIATE, &ad);
5642 }
5643 
5644 /* Note, at this point, sma is locked down */
5645 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5646 {
5647 	int err;
5648 	u32 perms;
5649 
5650 	switch (cmd) {
5651 	case IPC_INFO:
5652 	case SEM_INFO:
5653 		/* No specific object, just general system-wide information. */
5654 		return task_has_system(current, SYSTEM__IPC_INFO);
5655 	case GETPID:
5656 	case GETNCNT:
5657 	case GETZCNT:
5658 		perms = SEM__GETATTR;
5659 		break;
5660 	case GETVAL:
5661 	case GETALL:
5662 		perms = SEM__READ;
5663 		break;
5664 	case SETVAL:
5665 	case SETALL:
5666 		perms = SEM__WRITE;
5667 		break;
5668 	case IPC_RMID:
5669 		perms = SEM__DESTROY;
5670 		break;
5671 	case IPC_SET:
5672 		perms = SEM__SETATTR;
5673 		break;
5674 	case IPC_STAT:
5675 	case SEM_STAT:
5676 		perms = SEM__GETATTR | SEM__ASSOCIATE;
5677 		break;
5678 	default:
5679 		return 0;
5680 	}
5681 
5682 	err = ipc_has_perm(&sma->sem_perm, perms);
5683 	return err;
5684 }
5685 
5686 static int selinux_sem_semop(struct sem_array *sma,
5687 			     struct sembuf *sops, unsigned nsops, int alter)
5688 {
5689 	u32 perms;
5690 
5691 	if (alter)
5692 		perms = SEM__READ | SEM__WRITE;
5693 	else
5694 		perms = SEM__READ;
5695 
5696 	return ipc_has_perm(&sma->sem_perm, perms);
5697 }
5698 
5699 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5700 {
5701 	u32 av = 0;
5702 
5703 	av = 0;
5704 	if (flag & S_IRUGO)
5705 		av |= IPC__UNIX_READ;
5706 	if (flag & S_IWUGO)
5707 		av |= IPC__UNIX_WRITE;
5708 
5709 	if (av == 0)
5710 		return 0;
5711 
5712 	return ipc_has_perm(ipcp, av);
5713 }
5714 
5715 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5716 {
5717 	struct ipc_security_struct *isec = ipcp->security;
5718 	*secid = isec->sid;
5719 }
5720 
5721 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5722 {
5723 	if (inode)
5724 		inode_doinit_with_dentry(inode, dentry);
5725 }
5726 
5727 static int selinux_getprocattr(struct task_struct *p,
5728 			       char *name, char **value)
5729 {
5730 	const struct task_security_struct *__tsec;
5731 	u32 sid;
5732 	int error;
5733 	unsigned len;
5734 
5735 	if (current != p) {
5736 		error = current_has_perm(p, PROCESS__GETATTR);
5737 		if (error)
5738 			return error;
5739 	}
5740 
5741 	rcu_read_lock();
5742 	__tsec = __task_cred(p)->security;
5743 
5744 	if (!strcmp(name, "current"))
5745 		sid = __tsec->sid;
5746 	else if (!strcmp(name, "prev"))
5747 		sid = __tsec->osid;
5748 	else if (!strcmp(name, "exec"))
5749 		sid = __tsec->exec_sid;
5750 	else if (!strcmp(name, "fscreate"))
5751 		sid = __tsec->create_sid;
5752 	else if (!strcmp(name, "keycreate"))
5753 		sid = __tsec->keycreate_sid;
5754 	else if (!strcmp(name, "sockcreate"))
5755 		sid = __tsec->sockcreate_sid;
5756 	else
5757 		goto invalid;
5758 	rcu_read_unlock();
5759 
5760 	if (!sid)
5761 		return 0;
5762 
5763 	error = security_sid_to_context(sid, value, &len);
5764 	if (error)
5765 		return error;
5766 	return len;
5767 
5768 invalid:
5769 	rcu_read_unlock();
5770 	return -EINVAL;
5771 }
5772 
5773 static int selinux_setprocattr(struct task_struct *p,
5774 			       char *name, void *value, size_t size)
5775 {
5776 	struct task_security_struct *tsec;
5777 	struct cred *new;
5778 	u32 sid = 0, ptsid;
5779 	int error;
5780 	char *str = value;
5781 
5782 	if (current != p) {
5783 		/* SELinux only allows a process to change its own
5784 		   security attributes. */
5785 		return -EACCES;
5786 	}
5787 
5788 	/*
5789 	 * Basic control over ability to set these attributes at all.
5790 	 * current == p, but we'll pass them separately in case the
5791 	 * above restriction is ever removed.
5792 	 */
5793 	if (!strcmp(name, "exec"))
5794 		error = current_has_perm(p, PROCESS__SETEXEC);
5795 	else if (!strcmp(name, "fscreate"))
5796 		error = current_has_perm(p, PROCESS__SETFSCREATE);
5797 	else if (!strcmp(name, "keycreate"))
5798 		error = current_has_perm(p, PROCESS__SETKEYCREATE);
5799 	else if (!strcmp(name, "sockcreate"))
5800 		error = current_has_perm(p, PROCESS__SETSOCKCREATE);
5801 	else if (!strcmp(name, "current"))
5802 		error = current_has_perm(p, PROCESS__SETCURRENT);
5803 	else
5804 		error = -EINVAL;
5805 	if (error)
5806 		return error;
5807 
5808 	/* Obtain a SID for the context, if one was specified. */
5809 	if (size && str[1] && str[1] != '\n') {
5810 		if (str[size-1] == '\n') {
5811 			str[size-1] = 0;
5812 			size--;
5813 		}
5814 		error = security_context_to_sid(value, size, &sid, GFP_KERNEL);
5815 		if (error == -EINVAL && !strcmp(name, "fscreate")) {
5816 			if (!capable(CAP_MAC_ADMIN)) {
5817 				struct audit_buffer *ab;
5818 				size_t audit_size;
5819 
5820 				/* We strip a nul only if it is at the end, otherwise the
5821 				 * context contains a nul and we should audit that */
5822 				if (str[size - 1] == '\0')
5823 					audit_size = size - 1;
5824 				else
5825 					audit_size = size;
5826 				ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
5827 				audit_log_format(ab, "op=fscreate invalid_context=");
5828 				audit_log_n_untrustedstring(ab, value, audit_size);
5829 				audit_log_end(ab);
5830 
5831 				return error;
5832 			}
5833 			error = security_context_to_sid_force(value, size,
5834 							      &sid);
5835 		}
5836 		if (error)
5837 			return error;
5838 	}
5839 
5840 	new = prepare_creds();
5841 	if (!new)
5842 		return -ENOMEM;
5843 
5844 	/* Permission checking based on the specified context is
5845 	   performed during the actual operation (execve,
5846 	   open/mkdir/...), when we know the full context of the
5847 	   operation.  See selinux_bprm_set_creds for the execve
5848 	   checks and may_create for the file creation checks. The
5849 	   operation will then fail if the context is not permitted. */
5850 	tsec = new->security;
5851 	if (!strcmp(name, "exec")) {
5852 		tsec->exec_sid = sid;
5853 	} else if (!strcmp(name, "fscreate")) {
5854 		tsec->create_sid = sid;
5855 	} else if (!strcmp(name, "keycreate")) {
5856 		error = may_create_key(sid, p);
5857 		if (error)
5858 			goto abort_change;
5859 		tsec->keycreate_sid = sid;
5860 	} else if (!strcmp(name, "sockcreate")) {
5861 		tsec->sockcreate_sid = sid;
5862 	} else if (!strcmp(name, "current")) {
5863 		error = -EINVAL;
5864 		if (sid == 0)
5865 			goto abort_change;
5866 
5867 		/* Only allow single threaded processes to change context */
5868 		error = -EPERM;
5869 		if (!current_is_single_threaded()) {
5870 			error = security_bounded_transition(tsec->sid, sid);
5871 			if (error)
5872 				goto abort_change;
5873 		}
5874 
5875 		/* Check permissions for the transition. */
5876 		error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5877 				     PROCESS__DYNTRANSITION, NULL);
5878 		if (error)
5879 			goto abort_change;
5880 
5881 		/* Check for ptracing, and update the task SID if ok.
5882 		   Otherwise, leave SID unchanged and fail. */
5883 		ptsid = ptrace_parent_sid(p);
5884 		if (ptsid != 0) {
5885 			error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
5886 					     PROCESS__PTRACE, NULL);
5887 			if (error)
5888 				goto abort_change;
5889 		}
5890 
5891 		tsec->sid = sid;
5892 	} else {
5893 		error = -EINVAL;
5894 		goto abort_change;
5895 	}
5896 
5897 	commit_creds(new);
5898 	return size;
5899 
5900 abort_change:
5901 	abort_creds(new);
5902 	return error;
5903 }
5904 
5905 static int selinux_ismaclabel(const char *name)
5906 {
5907 	return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
5908 }
5909 
5910 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5911 {
5912 	return security_sid_to_context(secid, secdata, seclen);
5913 }
5914 
5915 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5916 {
5917 	return security_context_to_sid(secdata, seclen, secid, GFP_KERNEL);
5918 }
5919 
5920 static void selinux_release_secctx(char *secdata, u32 seclen)
5921 {
5922 	kfree(secdata);
5923 }
5924 
5925 static void selinux_inode_invalidate_secctx(struct inode *inode)
5926 {
5927 	struct inode_security_struct *isec = inode->i_security;
5928 
5929 	mutex_lock(&isec->lock);
5930 	isec->initialized = LABEL_INVALID;
5931 	mutex_unlock(&isec->lock);
5932 }
5933 
5934 /*
5935  *	called with inode->i_mutex locked
5936  */
5937 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
5938 {
5939 	return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
5940 }
5941 
5942 /*
5943  *	called with inode->i_mutex locked
5944  */
5945 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
5946 {
5947 	return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
5948 }
5949 
5950 static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
5951 {
5952 	int len = 0;
5953 	len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
5954 						ctx, true);
5955 	if (len < 0)
5956 		return len;
5957 	*ctxlen = len;
5958 	return 0;
5959 }
5960 #ifdef CONFIG_KEYS
5961 
5962 static int selinux_key_alloc(struct key *k, const struct cred *cred,
5963 			     unsigned long flags)
5964 {
5965 	const struct task_security_struct *tsec;
5966 	struct key_security_struct *ksec;
5967 
5968 	ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5969 	if (!ksec)
5970 		return -ENOMEM;
5971 
5972 	tsec = cred->security;
5973 	if (tsec->keycreate_sid)
5974 		ksec->sid = tsec->keycreate_sid;
5975 	else
5976 		ksec->sid = tsec->sid;
5977 
5978 	k->security = ksec;
5979 	return 0;
5980 }
5981 
5982 static void selinux_key_free(struct key *k)
5983 {
5984 	struct key_security_struct *ksec = k->security;
5985 
5986 	k->security = NULL;
5987 	kfree(ksec);
5988 }
5989 
5990 static int selinux_key_permission(key_ref_t key_ref,
5991 				  const struct cred *cred,
5992 				  unsigned perm)
5993 {
5994 	struct key *key;
5995 	struct key_security_struct *ksec;
5996 	u32 sid;
5997 
5998 	/* if no specific permissions are requested, we skip the
5999 	   permission check. No serious, additional covert channels
6000 	   appear to be created. */
6001 	if (perm == 0)
6002 		return 0;
6003 
6004 	sid = cred_sid(cred);
6005 
6006 	key = key_ref_to_ptr(key_ref);
6007 	ksec = key->security;
6008 
6009 	return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
6010 }
6011 
6012 static int selinux_key_getsecurity(struct key *key, char **_buffer)
6013 {
6014 	struct key_security_struct *ksec = key->security;
6015 	char *context = NULL;
6016 	unsigned len;
6017 	int rc;
6018 
6019 	rc = security_sid_to_context(ksec->sid, &context, &len);
6020 	if (!rc)
6021 		rc = len;
6022 	*_buffer = context;
6023 	return rc;
6024 }
6025 
6026 #endif
6027 
6028 static struct security_hook_list selinux_hooks[] = {
6029 	LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
6030 	LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
6031 	LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder),
6032 	LSM_HOOK_INIT(binder_transfer_file, selinux_binder_transfer_file),
6033 
6034 	LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check),
6035 	LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme),
6036 	LSM_HOOK_INIT(capget, selinux_capget),
6037 	LSM_HOOK_INIT(capset, selinux_capset),
6038 	LSM_HOOK_INIT(capable, selinux_capable),
6039 	LSM_HOOK_INIT(quotactl, selinux_quotactl),
6040 	LSM_HOOK_INIT(quota_on, selinux_quota_on),
6041 	LSM_HOOK_INIT(syslog, selinux_syslog),
6042 	LSM_HOOK_INIT(vm_enough_memory, selinux_vm_enough_memory),
6043 
6044 	LSM_HOOK_INIT(netlink_send, selinux_netlink_send),
6045 
6046 	LSM_HOOK_INIT(bprm_set_creds, selinux_bprm_set_creds),
6047 	LSM_HOOK_INIT(bprm_committing_creds, selinux_bprm_committing_creds),
6048 	LSM_HOOK_INIT(bprm_committed_creds, selinux_bprm_committed_creds),
6049 	LSM_HOOK_INIT(bprm_secureexec, selinux_bprm_secureexec),
6050 
6051 	LSM_HOOK_INIT(sb_alloc_security, selinux_sb_alloc_security),
6052 	LSM_HOOK_INIT(sb_free_security, selinux_sb_free_security),
6053 	LSM_HOOK_INIT(sb_copy_data, selinux_sb_copy_data),
6054 	LSM_HOOK_INIT(sb_remount, selinux_sb_remount),
6055 	LSM_HOOK_INIT(sb_kern_mount, selinux_sb_kern_mount),
6056 	LSM_HOOK_INIT(sb_show_options, selinux_sb_show_options),
6057 	LSM_HOOK_INIT(sb_statfs, selinux_sb_statfs),
6058 	LSM_HOOK_INIT(sb_mount, selinux_mount),
6059 	LSM_HOOK_INIT(sb_umount, selinux_umount),
6060 	LSM_HOOK_INIT(sb_set_mnt_opts, selinux_set_mnt_opts),
6061 	LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts),
6062 	LSM_HOOK_INIT(sb_parse_opts_str, selinux_parse_opts_str),
6063 
6064 	LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security),
6065 
6066 	LSM_HOOK_INIT(inode_alloc_security, selinux_inode_alloc_security),
6067 	LSM_HOOK_INIT(inode_free_security, selinux_inode_free_security),
6068 	LSM_HOOK_INIT(inode_init_security, selinux_inode_init_security),
6069 	LSM_HOOK_INIT(inode_create, selinux_inode_create),
6070 	LSM_HOOK_INIT(inode_link, selinux_inode_link),
6071 	LSM_HOOK_INIT(inode_unlink, selinux_inode_unlink),
6072 	LSM_HOOK_INIT(inode_symlink, selinux_inode_symlink),
6073 	LSM_HOOK_INIT(inode_mkdir, selinux_inode_mkdir),
6074 	LSM_HOOK_INIT(inode_rmdir, selinux_inode_rmdir),
6075 	LSM_HOOK_INIT(inode_mknod, selinux_inode_mknod),
6076 	LSM_HOOK_INIT(inode_rename, selinux_inode_rename),
6077 	LSM_HOOK_INIT(inode_readlink, selinux_inode_readlink),
6078 	LSM_HOOK_INIT(inode_follow_link, selinux_inode_follow_link),
6079 	LSM_HOOK_INIT(inode_permission, selinux_inode_permission),
6080 	LSM_HOOK_INIT(inode_setattr, selinux_inode_setattr),
6081 	LSM_HOOK_INIT(inode_getattr, selinux_inode_getattr),
6082 	LSM_HOOK_INIT(inode_setxattr, selinux_inode_setxattr),
6083 	LSM_HOOK_INIT(inode_post_setxattr, selinux_inode_post_setxattr),
6084 	LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr),
6085 	LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr),
6086 	LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr),
6087 	LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
6088 	LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
6089 	LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
6090 	LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
6091 
6092 	LSM_HOOK_INIT(file_permission, selinux_file_permission),
6093 	LSM_HOOK_INIT(file_alloc_security, selinux_file_alloc_security),
6094 	LSM_HOOK_INIT(file_free_security, selinux_file_free_security),
6095 	LSM_HOOK_INIT(file_ioctl, selinux_file_ioctl),
6096 	LSM_HOOK_INIT(mmap_file, selinux_mmap_file),
6097 	LSM_HOOK_INIT(mmap_addr, selinux_mmap_addr),
6098 	LSM_HOOK_INIT(file_mprotect, selinux_file_mprotect),
6099 	LSM_HOOK_INIT(file_lock, selinux_file_lock),
6100 	LSM_HOOK_INIT(file_fcntl, selinux_file_fcntl),
6101 	LSM_HOOK_INIT(file_set_fowner, selinux_file_set_fowner),
6102 	LSM_HOOK_INIT(file_send_sigiotask, selinux_file_send_sigiotask),
6103 	LSM_HOOK_INIT(file_receive, selinux_file_receive),
6104 
6105 	LSM_HOOK_INIT(file_open, selinux_file_open),
6106 
6107 	LSM_HOOK_INIT(task_create, selinux_task_create),
6108 	LSM_HOOK_INIT(cred_alloc_blank, selinux_cred_alloc_blank),
6109 	LSM_HOOK_INIT(cred_free, selinux_cred_free),
6110 	LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
6111 	LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
6112 	LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
6113 	LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
6114 	LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
6115 	LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file),
6116 	LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid),
6117 	LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid),
6118 	LSM_HOOK_INIT(task_getsid, selinux_task_getsid),
6119 	LSM_HOOK_INIT(task_getsecid, selinux_task_getsecid),
6120 	LSM_HOOK_INIT(task_setnice, selinux_task_setnice),
6121 	LSM_HOOK_INIT(task_setioprio, selinux_task_setioprio),
6122 	LSM_HOOK_INIT(task_getioprio, selinux_task_getioprio),
6123 	LSM_HOOK_INIT(task_setrlimit, selinux_task_setrlimit),
6124 	LSM_HOOK_INIT(task_setscheduler, selinux_task_setscheduler),
6125 	LSM_HOOK_INIT(task_getscheduler, selinux_task_getscheduler),
6126 	LSM_HOOK_INIT(task_movememory, selinux_task_movememory),
6127 	LSM_HOOK_INIT(task_kill, selinux_task_kill),
6128 	LSM_HOOK_INIT(task_wait, selinux_task_wait),
6129 	LSM_HOOK_INIT(task_to_inode, selinux_task_to_inode),
6130 
6131 	LSM_HOOK_INIT(ipc_permission, selinux_ipc_permission),
6132 	LSM_HOOK_INIT(ipc_getsecid, selinux_ipc_getsecid),
6133 
6134 	LSM_HOOK_INIT(msg_msg_alloc_security, selinux_msg_msg_alloc_security),
6135 	LSM_HOOK_INIT(msg_msg_free_security, selinux_msg_msg_free_security),
6136 
6137 	LSM_HOOK_INIT(msg_queue_alloc_security,
6138 			selinux_msg_queue_alloc_security),
6139 	LSM_HOOK_INIT(msg_queue_free_security, selinux_msg_queue_free_security),
6140 	LSM_HOOK_INIT(msg_queue_associate, selinux_msg_queue_associate),
6141 	LSM_HOOK_INIT(msg_queue_msgctl, selinux_msg_queue_msgctl),
6142 	LSM_HOOK_INIT(msg_queue_msgsnd, selinux_msg_queue_msgsnd),
6143 	LSM_HOOK_INIT(msg_queue_msgrcv, selinux_msg_queue_msgrcv),
6144 
6145 	LSM_HOOK_INIT(shm_alloc_security, selinux_shm_alloc_security),
6146 	LSM_HOOK_INIT(shm_free_security, selinux_shm_free_security),
6147 	LSM_HOOK_INIT(shm_associate, selinux_shm_associate),
6148 	LSM_HOOK_INIT(shm_shmctl, selinux_shm_shmctl),
6149 	LSM_HOOK_INIT(shm_shmat, selinux_shm_shmat),
6150 
6151 	LSM_HOOK_INIT(sem_alloc_security, selinux_sem_alloc_security),
6152 	LSM_HOOK_INIT(sem_free_security, selinux_sem_free_security),
6153 	LSM_HOOK_INIT(sem_associate, selinux_sem_associate),
6154 	LSM_HOOK_INIT(sem_semctl, selinux_sem_semctl),
6155 	LSM_HOOK_INIT(sem_semop, selinux_sem_semop),
6156 
6157 	LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate),
6158 
6159 	LSM_HOOK_INIT(getprocattr, selinux_getprocattr),
6160 	LSM_HOOK_INIT(setprocattr, selinux_setprocattr),
6161 
6162 	LSM_HOOK_INIT(ismaclabel, selinux_ismaclabel),
6163 	LSM_HOOK_INIT(secid_to_secctx, selinux_secid_to_secctx),
6164 	LSM_HOOK_INIT(secctx_to_secid, selinux_secctx_to_secid),
6165 	LSM_HOOK_INIT(release_secctx, selinux_release_secctx),
6166 	LSM_HOOK_INIT(inode_invalidate_secctx, selinux_inode_invalidate_secctx),
6167 	LSM_HOOK_INIT(inode_notifysecctx, selinux_inode_notifysecctx),
6168 	LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx),
6169 	LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx),
6170 
6171 	LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect),
6172 	LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send),
6173 
6174 	LSM_HOOK_INIT(socket_create, selinux_socket_create),
6175 	LSM_HOOK_INIT(socket_post_create, selinux_socket_post_create),
6176 	LSM_HOOK_INIT(socket_bind, selinux_socket_bind),
6177 	LSM_HOOK_INIT(socket_connect, selinux_socket_connect),
6178 	LSM_HOOK_INIT(socket_listen, selinux_socket_listen),
6179 	LSM_HOOK_INIT(socket_accept, selinux_socket_accept),
6180 	LSM_HOOK_INIT(socket_sendmsg, selinux_socket_sendmsg),
6181 	LSM_HOOK_INIT(socket_recvmsg, selinux_socket_recvmsg),
6182 	LSM_HOOK_INIT(socket_getsockname, selinux_socket_getsockname),
6183 	LSM_HOOK_INIT(socket_getpeername, selinux_socket_getpeername),
6184 	LSM_HOOK_INIT(socket_getsockopt, selinux_socket_getsockopt),
6185 	LSM_HOOK_INIT(socket_setsockopt, selinux_socket_setsockopt),
6186 	LSM_HOOK_INIT(socket_shutdown, selinux_socket_shutdown),
6187 	LSM_HOOK_INIT(socket_sock_rcv_skb, selinux_socket_sock_rcv_skb),
6188 	LSM_HOOK_INIT(socket_getpeersec_stream,
6189 			selinux_socket_getpeersec_stream),
6190 	LSM_HOOK_INIT(socket_getpeersec_dgram, selinux_socket_getpeersec_dgram),
6191 	LSM_HOOK_INIT(sk_alloc_security, selinux_sk_alloc_security),
6192 	LSM_HOOK_INIT(sk_free_security, selinux_sk_free_security),
6193 	LSM_HOOK_INIT(sk_clone_security, selinux_sk_clone_security),
6194 	LSM_HOOK_INIT(sk_getsecid, selinux_sk_getsecid),
6195 	LSM_HOOK_INIT(sock_graft, selinux_sock_graft),
6196 	LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
6197 	LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
6198 	LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
6199 	LSM_HOOK_INIT(secmark_relabel_packet, selinux_secmark_relabel_packet),
6200 	LSM_HOOK_INIT(secmark_refcount_inc, selinux_secmark_refcount_inc),
6201 	LSM_HOOK_INIT(secmark_refcount_dec, selinux_secmark_refcount_dec),
6202 	LSM_HOOK_INIT(req_classify_flow, selinux_req_classify_flow),
6203 	LSM_HOOK_INIT(tun_dev_alloc_security, selinux_tun_dev_alloc_security),
6204 	LSM_HOOK_INIT(tun_dev_free_security, selinux_tun_dev_free_security),
6205 	LSM_HOOK_INIT(tun_dev_create, selinux_tun_dev_create),
6206 	LSM_HOOK_INIT(tun_dev_attach_queue, selinux_tun_dev_attach_queue),
6207 	LSM_HOOK_INIT(tun_dev_attach, selinux_tun_dev_attach),
6208 	LSM_HOOK_INIT(tun_dev_open, selinux_tun_dev_open),
6209 
6210 #ifdef CONFIG_SECURITY_NETWORK_XFRM
6211 	LSM_HOOK_INIT(xfrm_policy_alloc_security, selinux_xfrm_policy_alloc),
6212 	LSM_HOOK_INIT(xfrm_policy_clone_security, selinux_xfrm_policy_clone),
6213 	LSM_HOOK_INIT(xfrm_policy_free_security, selinux_xfrm_policy_free),
6214 	LSM_HOOK_INIT(xfrm_policy_delete_security, selinux_xfrm_policy_delete),
6215 	LSM_HOOK_INIT(xfrm_state_alloc, selinux_xfrm_state_alloc),
6216 	LSM_HOOK_INIT(xfrm_state_alloc_acquire,
6217 			selinux_xfrm_state_alloc_acquire),
6218 	LSM_HOOK_INIT(xfrm_state_free_security, selinux_xfrm_state_free),
6219 	LSM_HOOK_INIT(xfrm_state_delete_security, selinux_xfrm_state_delete),
6220 	LSM_HOOK_INIT(xfrm_policy_lookup, selinux_xfrm_policy_lookup),
6221 	LSM_HOOK_INIT(xfrm_state_pol_flow_match,
6222 			selinux_xfrm_state_pol_flow_match),
6223 	LSM_HOOK_INIT(xfrm_decode_session, selinux_xfrm_decode_session),
6224 #endif
6225 
6226 #ifdef CONFIG_KEYS
6227 	LSM_HOOK_INIT(key_alloc, selinux_key_alloc),
6228 	LSM_HOOK_INIT(key_free, selinux_key_free),
6229 	LSM_HOOK_INIT(key_permission, selinux_key_permission),
6230 	LSM_HOOK_INIT(key_getsecurity, selinux_key_getsecurity),
6231 #endif
6232 
6233 #ifdef CONFIG_AUDIT
6234 	LSM_HOOK_INIT(audit_rule_init, selinux_audit_rule_init),
6235 	LSM_HOOK_INIT(audit_rule_known, selinux_audit_rule_known),
6236 	LSM_HOOK_INIT(audit_rule_match, selinux_audit_rule_match),
6237 	LSM_HOOK_INIT(audit_rule_free, selinux_audit_rule_free),
6238 #endif
6239 };
6240 
6241 static __init int selinux_init(void)
6242 {
6243 	if (!security_module_enable("selinux")) {
6244 		selinux_enabled = 0;
6245 		return 0;
6246 	}
6247 
6248 	if (!selinux_enabled) {
6249 		printk(KERN_INFO "SELinux:  Disabled at boot.\n");
6250 		return 0;
6251 	}
6252 
6253 	printk(KERN_INFO "SELinux:  Initializing.\n");
6254 
6255 	/* Set the security state for the initial task. */
6256 	cred_init_security();
6257 
6258 	default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
6259 
6260 	sel_inode_cache = kmem_cache_create("selinux_inode_security",
6261 					    sizeof(struct inode_security_struct),
6262 					    0, SLAB_PANIC, NULL);
6263 	file_security_cache = kmem_cache_create("selinux_file_security",
6264 					    sizeof(struct file_security_struct),
6265 					    0, SLAB_PANIC, NULL);
6266 	avc_init();
6267 
6268 	security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks));
6269 
6270 	if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
6271 		panic("SELinux: Unable to register AVC netcache callback\n");
6272 
6273 	if (selinux_enforcing)
6274 		printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
6275 	else
6276 		printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
6277 
6278 	return 0;
6279 }
6280 
6281 static void delayed_superblock_init(struct super_block *sb, void *unused)
6282 {
6283 	superblock_doinit(sb, NULL);
6284 }
6285 
6286 void selinux_complete_init(void)
6287 {
6288 	printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
6289 
6290 	/* Set up any superblocks initialized prior to the policy load. */
6291 	printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
6292 	iterate_supers(delayed_superblock_init, NULL);
6293 }
6294 
6295 /* SELinux requires early initialization in order to label
6296    all processes and objects when they are created. */
6297 security_initcall(selinux_init);
6298 
6299 #if defined(CONFIG_NETFILTER)
6300 
6301 static struct nf_hook_ops selinux_nf_ops[] = {
6302 	{
6303 		.hook =		selinux_ipv4_postroute,
6304 		.pf =		NFPROTO_IPV4,
6305 		.hooknum =	NF_INET_POST_ROUTING,
6306 		.priority =	NF_IP_PRI_SELINUX_LAST,
6307 	},
6308 	{
6309 		.hook =		selinux_ipv4_forward,
6310 		.pf =		NFPROTO_IPV4,
6311 		.hooknum =	NF_INET_FORWARD,
6312 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6313 	},
6314 	{
6315 		.hook =		selinux_ipv4_output,
6316 		.pf =		NFPROTO_IPV4,
6317 		.hooknum =	NF_INET_LOCAL_OUT,
6318 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6319 	},
6320 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
6321 	{
6322 		.hook =		selinux_ipv6_postroute,
6323 		.pf =		NFPROTO_IPV6,
6324 		.hooknum =	NF_INET_POST_ROUTING,
6325 		.priority =	NF_IP6_PRI_SELINUX_LAST,
6326 	},
6327 	{
6328 		.hook =		selinux_ipv6_forward,
6329 		.pf =		NFPROTO_IPV6,
6330 		.hooknum =	NF_INET_FORWARD,
6331 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
6332 	},
6333 	{
6334 		.hook =		selinux_ipv6_output,
6335 		.pf =		NFPROTO_IPV6,
6336 		.hooknum =	NF_INET_LOCAL_OUT,
6337 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
6338 	},
6339 #endif	/* IPV6 */
6340 };
6341 
6342 static int __init selinux_nf_ip_init(void)
6343 {
6344 	int err;
6345 
6346 	if (!selinux_enabled)
6347 		return 0;
6348 
6349 	printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
6350 
6351 	err = nf_register_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6352 	if (err)
6353 		panic("SELinux: nf_register_hooks: error %d\n", err);
6354 
6355 	return 0;
6356 }
6357 
6358 __initcall(selinux_nf_ip_init);
6359 
6360 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6361 static void selinux_nf_ip_exit(void)
6362 {
6363 	printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
6364 
6365 	nf_unregister_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6366 }
6367 #endif
6368 
6369 #else /* CONFIG_NETFILTER */
6370 
6371 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6372 #define selinux_nf_ip_exit()
6373 #endif
6374 
6375 #endif /* CONFIG_NETFILTER */
6376 
6377 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6378 static int selinux_disabled;
6379 
6380 int selinux_disable(void)
6381 {
6382 	if (ss_initialized) {
6383 		/* Not permitted after initial policy load. */
6384 		return -EINVAL;
6385 	}
6386 
6387 	if (selinux_disabled) {
6388 		/* Only do this once. */
6389 		return -EINVAL;
6390 	}
6391 
6392 	printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
6393 
6394 	selinux_disabled = 1;
6395 	selinux_enabled = 0;
6396 
6397 	security_delete_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks));
6398 
6399 	/* Try to destroy the avc node cache */
6400 	avc_disable();
6401 
6402 	/* Unregister netfilter hooks. */
6403 	selinux_nf_ip_exit();
6404 
6405 	/* Unregister selinuxfs. */
6406 	exit_sel_fs();
6407 
6408 	return 0;
6409 }
6410 #endif
6411