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