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