xref: /openbmc/linux/security/selinux/hooks.c (revision 3ba4bf5f1e2c58bddd84ba27c5aeaf8ca1d36bff)
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 bool has_cap_mac_admin(bool audit)
3111 {
3112 	const struct cred *cred = current_cred();
3113 	int cap_audit = audit ? SECURITY_CAP_AUDIT : SECURITY_CAP_NOAUDIT;
3114 
3115 	if (cap_capable(cred, &init_user_ns, CAP_MAC_ADMIN, cap_audit))
3116 		return false;
3117 	if (cred_has_capability(cred, CAP_MAC_ADMIN, cap_audit, true))
3118 		return false;
3119 	return true;
3120 }
3121 
3122 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
3123 				  const void *value, size_t size, int flags)
3124 {
3125 	struct inode *inode = d_backing_inode(dentry);
3126 	struct inode_security_struct *isec;
3127 	struct superblock_security_struct *sbsec;
3128 	struct common_audit_data ad;
3129 	u32 newsid, sid = current_sid();
3130 	int rc = 0;
3131 
3132 	if (strcmp(name, XATTR_NAME_SELINUX))
3133 		return selinux_inode_setotherxattr(dentry, name);
3134 
3135 	sbsec = inode->i_sb->s_security;
3136 	if (!(sbsec->flags & SBLABEL_MNT))
3137 		return -EOPNOTSUPP;
3138 
3139 	if (!inode_owner_or_capable(inode))
3140 		return -EPERM;
3141 
3142 	ad.type = LSM_AUDIT_DATA_DENTRY;
3143 	ad.u.dentry = dentry;
3144 
3145 	isec = backing_inode_security(dentry);
3146 	rc = avc_has_perm(sid, isec->sid, isec->sclass,
3147 			  FILE__RELABELFROM, &ad);
3148 	if (rc)
3149 		return rc;
3150 
3151 	rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
3152 	if (rc == -EINVAL) {
3153 		if (!has_cap_mac_admin(true)) {
3154 			struct audit_buffer *ab;
3155 			size_t audit_size;
3156 			const char *str;
3157 
3158 			/* We strip a nul only if it is at the end, otherwise the
3159 			 * context contains a nul and we should audit that */
3160 			if (value) {
3161 				str = value;
3162 				if (str[size - 1] == '\0')
3163 					audit_size = size - 1;
3164 				else
3165 					audit_size = size;
3166 			} else {
3167 				str = "";
3168 				audit_size = 0;
3169 			}
3170 			ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
3171 			audit_log_format(ab, "op=setxattr invalid_context=");
3172 			audit_log_n_untrustedstring(ab, value, audit_size);
3173 			audit_log_end(ab);
3174 
3175 			return rc;
3176 		}
3177 		rc = security_context_to_sid_force(value, size, &newsid);
3178 	}
3179 	if (rc)
3180 		return rc;
3181 
3182 	rc = avc_has_perm(sid, newsid, isec->sclass,
3183 			  FILE__RELABELTO, &ad);
3184 	if (rc)
3185 		return rc;
3186 
3187 	rc = security_validate_transition(isec->sid, newsid, sid,
3188 					  isec->sclass);
3189 	if (rc)
3190 		return rc;
3191 
3192 	return avc_has_perm(newsid,
3193 			    sbsec->sid,
3194 			    SECCLASS_FILESYSTEM,
3195 			    FILESYSTEM__ASSOCIATE,
3196 			    &ad);
3197 }
3198 
3199 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3200 					const void *value, size_t size,
3201 					int flags)
3202 {
3203 	struct inode *inode = d_backing_inode(dentry);
3204 	struct inode_security_struct *isec;
3205 	u32 newsid;
3206 	int rc;
3207 
3208 	if (strcmp(name, XATTR_NAME_SELINUX)) {
3209 		/* Not an attribute we recognize, so nothing to do. */
3210 		return;
3211 	}
3212 
3213 	rc = security_context_to_sid_force(value, size, &newsid);
3214 	if (rc) {
3215 		printk(KERN_ERR "SELinux:  unable to map context to SID"
3216 		       "for (%s, %lu), rc=%d\n",
3217 		       inode->i_sb->s_id, inode->i_ino, -rc);
3218 		return;
3219 	}
3220 
3221 	isec = backing_inode_security(dentry);
3222 	spin_lock(&isec->lock);
3223 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3224 	isec->sid = newsid;
3225 	isec->initialized = LABEL_INITIALIZED;
3226 	spin_unlock(&isec->lock);
3227 
3228 	return;
3229 }
3230 
3231 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3232 {
3233 	const struct cred *cred = current_cred();
3234 
3235 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3236 }
3237 
3238 static int selinux_inode_listxattr(struct dentry *dentry)
3239 {
3240 	const struct cred *cred = current_cred();
3241 
3242 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3243 }
3244 
3245 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
3246 {
3247 	if (strcmp(name, XATTR_NAME_SELINUX))
3248 		return selinux_inode_setotherxattr(dentry, name);
3249 
3250 	/* No one is allowed to remove a SELinux security label.
3251 	   You can change the label, but all data must be labeled. */
3252 	return -EACCES;
3253 }
3254 
3255 /*
3256  * Copy the inode security context value to the user.
3257  *
3258  * Permission check is handled by selinux_inode_getxattr hook.
3259  */
3260 static int selinux_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
3261 {
3262 	u32 size;
3263 	int error;
3264 	char *context = NULL;
3265 	struct inode_security_struct *isec;
3266 
3267 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3268 		return -EOPNOTSUPP;
3269 
3270 	/*
3271 	 * If the caller has CAP_MAC_ADMIN, then get the raw context
3272 	 * value even if it is not defined by current policy; otherwise,
3273 	 * use the in-core value under current policy.
3274 	 * Use the non-auditing forms of the permission checks since
3275 	 * getxattr may be called by unprivileged processes commonly
3276 	 * and lack of permission just means that we fall back to the
3277 	 * in-core context value, not a denial.
3278 	 */
3279 	isec = inode_security(inode);
3280 	if (has_cap_mac_admin(false))
3281 		error = security_sid_to_context_force(isec->sid, &context,
3282 						      &size);
3283 	else
3284 		error = security_sid_to_context(isec->sid, &context, &size);
3285 	if (error)
3286 		return error;
3287 	error = size;
3288 	if (alloc) {
3289 		*buffer = context;
3290 		goto out_nofree;
3291 	}
3292 	kfree(context);
3293 out_nofree:
3294 	return error;
3295 }
3296 
3297 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3298 				     const void *value, size_t size, int flags)
3299 {
3300 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3301 	u32 newsid;
3302 	int rc;
3303 
3304 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3305 		return -EOPNOTSUPP;
3306 
3307 	if (!value || !size)
3308 		return -EACCES;
3309 
3310 	rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
3311 	if (rc)
3312 		return rc;
3313 
3314 	spin_lock(&isec->lock);
3315 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3316 	isec->sid = newsid;
3317 	isec->initialized = LABEL_INITIALIZED;
3318 	spin_unlock(&isec->lock);
3319 	return 0;
3320 }
3321 
3322 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3323 {
3324 	const int len = sizeof(XATTR_NAME_SELINUX);
3325 	if (buffer && len <= buffer_size)
3326 		memcpy(buffer, XATTR_NAME_SELINUX, len);
3327 	return len;
3328 }
3329 
3330 static void selinux_inode_getsecid(struct inode *inode, u32 *secid)
3331 {
3332 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3333 	*secid = isec->sid;
3334 }
3335 
3336 static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
3337 {
3338 	u32 sid;
3339 	struct task_security_struct *tsec;
3340 	struct cred *new_creds = *new;
3341 
3342 	if (new_creds == NULL) {
3343 		new_creds = prepare_creds();
3344 		if (!new_creds)
3345 			return -ENOMEM;
3346 	}
3347 
3348 	tsec = new_creds->security;
3349 	/* Get label from overlay inode and set it in create_sid */
3350 	selinux_inode_getsecid(d_inode(src), &sid);
3351 	tsec->create_sid = sid;
3352 	*new = new_creds;
3353 	return 0;
3354 }
3355 
3356 static int selinux_inode_copy_up_xattr(const char *name)
3357 {
3358 	/* The copy_up hook above sets the initial context on an inode, but we
3359 	 * don't then want to overwrite it by blindly copying all the lower
3360 	 * xattrs up.  Instead, we have to filter out SELinux-related xattrs.
3361 	 */
3362 	if (strcmp(name, XATTR_NAME_SELINUX) == 0)
3363 		return 1; /* Discard */
3364 	/*
3365 	 * Any other attribute apart from SELINUX is not claimed, supported
3366 	 * by selinux.
3367 	 */
3368 	return -EOPNOTSUPP;
3369 }
3370 
3371 /* file security operations */
3372 
3373 static int selinux_revalidate_file_permission(struct file *file, int mask)
3374 {
3375 	const struct cred *cred = current_cred();
3376 	struct inode *inode = file_inode(file);
3377 
3378 	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3379 	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3380 		mask |= MAY_APPEND;
3381 
3382 	return file_has_perm(cred, file,
3383 			     file_mask_to_av(inode->i_mode, mask));
3384 }
3385 
3386 static int selinux_file_permission(struct file *file, int mask)
3387 {
3388 	struct inode *inode = file_inode(file);
3389 	struct file_security_struct *fsec = file->f_security;
3390 	struct inode_security_struct *isec;
3391 	u32 sid = current_sid();
3392 
3393 	if (!mask)
3394 		/* No permission to check.  Existence test. */
3395 		return 0;
3396 
3397 	isec = inode_security(inode);
3398 	if (sid == fsec->sid && fsec->isid == isec->sid &&
3399 	    fsec->pseqno == avc_policy_seqno())
3400 		/* No change since file_open check. */
3401 		return 0;
3402 
3403 	return selinux_revalidate_file_permission(file, mask);
3404 }
3405 
3406 static int selinux_file_alloc_security(struct file *file)
3407 {
3408 	return file_alloc_security(file);
3409 }
3410 
3411 static void selinux_file_free_security(struct file *file)
3412 {
3413 	file_free_security(file);
3414 }
3415 
3416 /*
3417  * Check whether a task has the ioctl permission and cmd
3418  * operation to an inode.
3419  */
3420 static int ioctl_has_perm(const struct cred *cred, struct file *file,
3421 		u32 requested, u16 cmd)
3422 {
3423 	struct common_audit_data ad;
3424 	struct file_security_struct *fsec = file->f_security;
3425 	struct inode *inode = file_inode(file);
3426 	struct inode_security_struct *isec;
3427 	struct lsm_ioctlop_audit ioctl;
3428 	u32 ssid = cred_sid(cred);
3429 	int rc;
3430 	u8 driver = cmd >> 8;
3431 	u8 xperm = cmd & 0xff;
3432 
3433 	ad.type = LSM_AUDIT_DATA_IOCTL_OP;
3434 	ad.u.op = &ioctl;
3435 	ad.u.op->cmd = cmd;
3436 	ad.u.op->path = file->f_path;
3437 
3438 	if (ssid != fsec->sid) {
3439 		rc = avc_has_perm(ssid, fsec->sid,
3440 				SECCLASS_FD,
3441 				FD__USE,
3442 				&ad);
3443 		if (rc)
3444 			goto out;
3445 	}
3446 
3447 	if (unlikely(IS_PRIVATE(inode)))
3448 		return 0;
3449 
3450 	isec = inode_security(inode);
3451 	rc = avc_has_extended_perms(ssid, isec->sid, isec->sclass,
3452 			requested, driver, xperm, &ad);
3453 out:
3454 	return rc;
3455 }
3456 
3457 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3458 			      unsigned long arg)
3459 {
3460 	const struct cred *cred = current_cred();
3461 	int error = 0;
3462 
3463 	switch (cmd) {
3464 	case FIONREAD:
3465 	/* fall through */
3466 	case FIBMAP:
3467 	/* fall through */
3468 	case FIGETBSZ:
3469 	/* fall through */
3470 	case FS_IOC_GETFLAGS:
3471 	/* fall through */
3472 	case FS_IOC_GETVERSION:
3473 		error = file_has_perm(cred, file, FILE__GETATTR);
3474 		break;
3475 
3476 	case FS_IOC_SETFLAGS:
3477 	/* fall through */
3478 	case FS_IOC_SETVERSION:
3479 		error = file_has_perm(cred, file, FILE__SETATTR);
3480 		break;
3481 
3482 	/* sys_ioctl() checks */
3483 	case FIONBIO:
3484 	/* fall through */
3485 	case FIOASYNC:
3486 		error = file_has_perm(cred, file, 0);
3487 		break;
3488 
3489 	case KDSKBENT:
3490 	case KDSKBSENT:
3491 		error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3492 					    SECURITY_CAP_AUDIT, true);
3493 		break;
3494 
3495 	/* default case assumes that the command will go
3496 	 * to the file's ioctl() function.
3497 	 */
3498 	default:
3499 		error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3500 	}
3501 	return error;
3502 }
3503 
3504 static int default_noexec;
3505 
3506 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3507 {
3508 	const struct cred *cred = current_cred();
3509 	u32 sid = cred_sid(cred);
3510 	int rc = 0;
3511 
3512 	if (default_noexec &&
3513 	    (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3514 				   (!shared && (prot & PROT_WRITE)))) {
3515 		/*
3516 		 * We are making executable an anonymous mapping or a
3517 		 * private file mapping that will also be writable.
3518 		 * This has an additional check.
3519 		 */
3520 		rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
3521 				  PROCESS__EXECMEM, NULL);
3522 		if (rc)
3523 			goto error;
3524 	}
3525 
3526 	if (file) {
3527 		/* read access is always possible with a mapping */
3528 		u32 av = FILE__READ;
3529 
3530 		/* write access only matters if the mapping is shared */
3531 		if (shared && (prot & PROT_WRITE))
3532 			av |= FILE__WRITE;
3533 
3534 		if (prot & PROT_EXEC)
3535 			av |= FILE__EXECUTE;
3536 
3537 		return file_has_perm(cred, file, av);
3538 	}
3539 
3540 error:
3541 	return rc;
3542 }
3543 
3544 static int selinux_mmap_addr(unsigned long addr)
3545 {
3546 	int rc = 0;
3547 
3548 	if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3549 		u32 sid = current_sid();
3550 		rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3551 				  MEMPROTECT__MMAP_ZERO, NULL);
3552 	}
3553 
3554 	return rc;
3555 }
3556 
3557 static int selinux_mmap_file(struct file *file, unsigned long reqprot,
3558 			     unsigned long prot, unsigned long flags)
3559 {
3560 	struct common_audit_data ad;
3561 	int rc;
3562 
3563 	if (file) {
3564 		ad.type = LSM_AUDIT_DATA_FILE;
3565 		ad.u.file = file;
3566 		rc = inode_has_perm(current_cred(), file_inode(file),
3567 				    FILE__MAP, &ad);
3568 		if (rc)
3569 			return rc;
3570 	}
3571 
3572 	if (selinux_checkreqprot)
3573 		prot = reqprot;
3574 
3575 	return file_map_prot_check(file, prot,
3576 				   (flags & MAP_TYPE) == MAP_SHARED);
3577 }
3578 
3579 static int selinux_file_mprotect(struct vm_area_struct *vma,
3580 				 unsigned long reqprot,
3581 				 unsigned long prot)
3582 {
3583 	const struct cred *cred = current_cred();
3584 	u32 sid = cred_sid(cred);
3585 
3586 	if (selinux_checkreqprot)
3587 		prot = reqprot;
3588 
3589 	if (default_noexec &&
3590 	    (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3591 		int rc = 0;
3592 		if (vma->vm_start >= vma->vm_mm->start_brk &&
3593 		    vma->vm_end <= vma->vm_mm->brk) {
3594 			rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
3595 					  PROCESS__EXECHEAP, NULL);
3596 		} else if (!vma->vm_file &&
3597 			   ((vma->vm_start <= vma->vm_mm->start_stack &&
3598 			     vma->vm_end >= vma->vm_mm->start_stack) ||
3599 			    vma_is_stack_for_current(vma))) {
3600 			rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
3601 					  PROCESS__EXECSTACK, NULL);
3602 		} else if (vma->vm_file && vma->anon_vma) {
3603 			/*
3604 			 * We are making executable a file mapping that has
3605 			 * had some COW done. Since pages might have been
3606 			 * written, check ability to execute the possibly
3607 			 * modified content.  This typically should only
3608 			 * occur for text relocations.
3609 			 */
3610 			rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3611 		}
3612 		if (rc)
3613 			return rc;
3614 	}
3615 
3616 	return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3617 }
3618 
3619 static int selinux_file_lock(struct file *file, unsigned int cmd)
3620 {
3621 	const struct cred *cred = current_cred();
3622 
3623 	return file_has_perm(cred, file, FILE__LOCK);
3624 }
3625 
3626 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3627 			      unsigned long arg)
3628 {
3629 	const struct cred *cred = current_cred();
3630 	int err = 0;
3631 
3632 	switch (cmd) {
3633 	case F_SETFL:
3634 		if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3635 			err = file_has_perm(cred, file, FILE__WRITE);
3636 			break;
3637 		}
3638 		/* fall through */
3639 	case F_SETOWN:
3640 	case F_SETSIG:
3641 	case F_GETFL:
3642 	case F_GETOWN:
3643 	case F_GETSIG:
3644 	case F_GETOWNER_UIDS:
3645 		/* Just check FD__USE permission */
3646 		err = file_has_perm(cred, file, 0);
3647 		break;
3648 	case F_GETLK:
3649 	case F_SETLK:
3650 	case F_SETLKW:
3651 	case F_OFD_GETLK:
3652 	case F_OFD_SETLK:
3653 	case F_OFD_SETLKW:
3654 #if BITS_PER_LONG == 32
3655 	case F_GETLK64:
3656 	case F_SETLK64:
3657 	case F_SETLKW64:
3658 #endif
3659 		err = file_has_perm(cred, file, FILE__LOCK);
3660 		break;
3661 	}
3662 
3663 	return err;
3664 }
3665 
3666 static void selinux_file_set_fowner(struct file *file)
3667 {
3668 	struct file_security_struct *fsec;
3669 
3670 	fsec = file->f_security;
3671 	fsec->fown_sid = current_sid();
3672 }
3673 
3674 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3675 				       struct fown_struct *fown, int signum)
3676 {
3677 	struct file *file;
3678 	u32 sid = task_sid(tsk);
3679 	u32 perm;
3680 	struct file_security_struct *fsec;
3681 
3682 	/* struct fown_struct is never outside the context of a struct file */
3683 	file = container_of(fown, struct file, f_owner);
3684 
3685 	fsec = file->f_security;
3686 
3687 	if (!signum)
3688 		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3689 	else
3690 		perm = signal_to_av(signum);
3691 
3692 	return avc_has_perm(fsec->fown_sid, sid,
3693 			    SECCLASS_PROCESS, perm, NULL);
3694 }
3695 
3696 static int selinux_file_receive(struct file *file)
3697 {
3698 	const struct cred *cred = current_cred();
3699 
3700 	return file_has_perm(cred, file, file_to_av(file));
3701 }
3702 
3703 static int selinux_file_open(struct file *file, const struct cred *cred)
3704 {
3705 	struct file_security_struct *fsec;
3706 	struct inode_security_struct *isec;
3707 
3708 	fsec = file->f_security;
3709 	isec = inode_security(file_inode(file));
3710 	/*
3711 	 * Save inode label and policy sequence number
3712 	 * at open-time so that selinux_file_permission
3713 	 * can determine whether revalidation is necessary.
3714 	 * Task label is already saved in the file security
3715 	 * struct as its SID.
3716 	 */
3717 	fsec->isid = isec->sid;
3718 	fsec->pseqno = avc_policy_seqno();
3719 	/*
3720 	 * Since the inode label or policy seqno may have changed
3721 	 * between the selinux_inode_permission check and the saving
3722 	 * of state above, recheck that access is still permitted.
3723 	 * Otherwise, access might never be revalidated against the
3724 	 * new inode label or new policy.
3725 	 * This check is not redundant - do not remove.
3726 	 */
3727 	return file_path_has_perm(cred, file, open_file_to_av(file));
3728 }
3729 
3730 /* task security operations */
3731 
3732 static int selinux_task_alloc(struct task_struct *task,
3733 			      unsigned long clone_flags)
3734 {
3735 	u32 sid = current_sid();
3736 
3737 	return avc_has_perm(sid, sid, SECCLASS_PROCESS, PROCESS__FORK, NULL);
3738 }
3739 
3740 /*
3741  * allocate the SELinux part of blank credentials
3742  */
3743 static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3744 {
3745 	struct task_security_struct *tsec;
3746 
3747 	tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3748 	if (!tsec)
3749 		return -ENOMEM;
3750 
3751 	cred->security = tsec;
3752 	return 0;
3753 }
3754 
3755 /*
3756  * detach and free the LSM part of a set of credentials
3757  */
3758 static void selinux_cred_free(struct cred *cred)
3759 {
3760 	struct task_security_struct *tsec = cred->security;
3761 
3762 	/*
3763 	 * cred->security == NULL if security_cred_alloc_blank() or
3764 	 * security_prepare_creds() returned an error.
3765 	 */
3766 	BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3767 	cred->security = (void *) 0x7UL;
3768 	kfree(tsec);
3769 }
3770 
3771 /*
3772  * prepare a new set of credentials for modification
3773  */
3774 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3775 				gfp_t gfp)
3776 {
3777 	const struct task_security_struct *old_tsec;
3778 	struct task_security_struct *tsec;
3779 
3780 	old_tsec = old->security;
3781 
3782 	tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3783 	if (!tsec)
3784 		return -ENOMEM;
3785 
3786 	new->security = tsec;
3787 	return 0;
3788 }
3789 
3790 /*
3791  * transfer the SELinux data to a blank set of creds
3792  */
3793 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3794 {
3795 	const struct task_security_struct *old_tsec = old->security;
3796 	struct task_security_struct *tsec = new->security;
3797 
3798 	*tsec = *old_tsec;
3799 }
3800 
3801 /*
3802  * set the security data for a kernel service
3803  * - all the creation contexts are set to unlabelled
3804  */
3805 static int selinux_kernel_act_as(struct cred *new, u32 secid)
3806 {
3807 	struct task_security_struct *tsec = new->security;
3808 	u32 sid = current_sid();
3809 	int ret;
3810 
3811 	ret = avc_has_perm(sid, secid,
3812 			   SECCLASS_KERNEL_SERVICE,
3813 			   KERNEL_SERVICE__USE_AS_OVERRIDE,
3814 			   NULL);
3815 	if (ret == 0) {
3816 		tsec->sid = secid;
3817 		tsec->create_sid = 0;
3818 		tsec->keycreate_sid = 0;
3819 		tsec->sockcreate_sid = 0;
3820 	}
3821 	return ret;
3822 }
3823 
3824 /*
3825  * set the file creation context in a security record to the same as the
3826  * objective context of the specified inode
3827  */
3828 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3829 {
3830 	struct inode_security_struct *isec = inode_security(inode);
3831 	struct task_security_struct *tsec = new->security;
3832 	u32 sid = current_sid();
3833 	int ret;
3834 
3835 	ret = avc_has_perm(sid, isec->sid,
3836 			   SECCLASS_KERNEL_SERVICE,
3837 			   KERNEL_SERVICE__CREATE_FILES_AS,
3838 			   NULL);
3839 
3840 	if (ret == 0)
3841 		tsec->create_sid = isec->sid;
3842 	return ret;
3843 }
3844 
3845 static int selinux_kernel_module_request(char *kmod_name)
3846 {
3847 	struct common_audit_data ad;
3848 
3849 	ad.type = LSM_AUDIT_DATA_KMOD;
3850 	ad.u.kmod_name = kmod_name;
3851 
3852 	return avc_has_perm(current_sid(), SECINITSID_KERNEL, SECCLASS_SYSTEM,
3853 			    SYSTEM__MODULE_REQUEST, &ad);
3854 }
3855 
3856 static int selinux_kernel_module_from_file(struct file *file)
3857 {
3858 	struct common_audit_data ad;
3859 	struct inode_security_struct *isec;
3860 	struct file_security_struct *fsec;
3861 	u32 sid = current_sid();
3862 	int rc;
3863 
3864 	/* init_module */
3865 	if (file == NULL)
3866 		return avc_has_perm(sid, sid, SECCLASS_SYSTEM,
3867 					SYSTEM__MODULE_LOAD, NULL);
3868 
3869 	/* finit_module */
3870 
3871 	ad.type = LSM_AUDIT_DATA_FILE;
3872 	ad.u.file = file;
3873 
3874 	fsec = file->f_security;
3875 	if (sid != fsec->sid) {
3876 		rc = avc_has_perm(sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
3877 		if (rc)
3878 			return rc;
3879 	}
3880 
3881 	isec = inode_security(file_inode(file));
3882 	return avc_has_perm(sid, isec->sid, SECCLASS_SYSTEM,
3883 				SYSTEM__MODULE_LOAD, &ad);
3884 }
3885 
3886 static int selinux_kernel_read_file(struct file *file,
3887 				    enum kernel_read_file_id id)
3888 {
3889 	int rc = 0;
3890 
3891 	switch (id) {
3892 	case READING_MODULE:
3893 		rc = selinux_kernel_module_from_file(file);
3894 		break;
3895 	default:
3896 		break;
3897 	}
3898 
3899 	return rc;
3900 }
3901 
3902 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3903 {
3904 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3905 			    PROCESS__SETPGID, NULL);
3906 }
3907 
3908 static int selinux_task_getpgid(struct task_struct *p)
3909 {
3910 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3911 			    PROCESS__GETPGID, NULL);
3912 }
3913 
3914 static int selinux_task_getsid(struct task_struct *p)
3915 {
3916 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3917 			    PROCESS__GETSESSION, NULL);
3918 }
3919 
3920 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3921 {
3922 	*secid = task_sid(p);
3923 }
3924 
3925 static int selinux_task_setnice(struct task_struct *p, int nice)
3926 {
3927 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3928 			    PROCESS__SETSCHED, NULL);
3929 }
3930 
3931 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3932 {
3933 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3934 			    PROCESS__SETSCHED, NULL);
3935 }
3936 
3937 static int selinux_task_getioprio(struct task_struct *p)
3938 {
3939 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3940 			    PROCESS__GETSCHED, NULL);
3941 }
3942 
3943 int selinux_task_prlimit(const struct cred *cred, const struct cred *tcred,
3944 			 unsigned int flags)
3945 {
3946 	u32 av = 0;
3947 
3948 	if (!flags)
3949 		return 0;
3950 	if (flags & LSM_PRLIMIT_WRITE)
3951 		av |= PROCESS__SETRLIMIT;
3952 	if (flags & LSM_PRLIMIT_READ)
3953 		av |= PROCESS__GETRLIMIT;
3954 	return avc_has_perm(cred_sid(cred), cred_sid(tcred),
3955 			    SECCLASS_PROCESS, av, NULL);
3956 }
3957 
3958 static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
3959 		struct rlimit *new_rlim)
3960 {
3961 	struct rlimit *old_rlim = p->signal->rlim + resource;
3962 
3963 	/* Control the ability to change the hard limit (whether
3964 	   lowering or raising it), so that the hard limit can
3965 	   later be used as a safe reset point for the soft limit
3966 	   upon context transitions.  See selinux_bprm_committing_creds. */
3967 	if (old_rlim->rlim_max != new_rlim->rlim_max)
3968 		return avc_has_perm(current_sid(), task_sid(p),
3969 				    SECCLASS_PROCESS, PROCESS__SETRLIMIT, NULL);
3970 
3971 	return 0;
3972 }
3973 
3974 static int selinux_task_setscheduler(struct task_struct *p)
3975 {
3976 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3977 			    PROCESS__SETSCHED, NULL);
3978 }
3979 
3980 static int selinux_task_getscheduler(struct task_struct *p)
3981 {
3982 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3983 			    PROCESS__GETSCHED, NULL);
3984 }
3985 
3986 static int selinux_task_movememory(struct task_struct *p)
3987 {
3988 	return avc_has_perm(current_sid(), task_sid(p), SECCLASS_PROCESS,
3989 			    PROCESS__SETSCHED, NULL);
3990 }
3991 
3992 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3993 				int sig, u32 secid)
3994 {
3995 	u32 perm;
3996 
3997 	if (!sig)
3998 		perm = PROCESS__SIGNULL; /* null signal; existence test */
3999 	else
4000 		perm = signal_to_av(sig);
4001 	if (!secid)
4002 		secid = current_sid();
4003 	return avc_has_perm(secid, task_sid(p), SECCLASS_PROCESS, perm, NULL);
4004 }
4005 
4006 static void selinux_task_to_inode(struct task_struct *p,
4007 				  struct inode *inode)
4008 {
4009 	struct inode_security_struct *isec = inode->i_security;
4010 	u32 sid = task_sid(p);
4011 
4012 	spin_lock(&isec->lock);
4013 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
4014 	isec->sid = sid;
4015 	isec->initialized = LABEL_INITIALIZED;
4016 	spin_unlock(&isec->lock);
4017 }
4018 
4019 /* Returns error only if unable to parse addresses */
4020 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
4021 			struct common_audit_data *ad, u8 *proto)
4022 {
4023 	int offset, ihlen, ret = -EINVAL;
4024 	struct iphdr _iph, *ih;
4025 
4026 	offset = skb_network_offset(skb);
4027 	ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
4028 	if (ih == NULL)
4029 		goto out;
4030 
4031 	ihlen = ih->ihl * 4;
4032 	if (ihlen < sizeof(_iph))
4033 		goto out;
4034 
4035 	ad->u.net->v4info.saddr = ih->saddr;
4036 	ad->u.net->v4info.daddr = ih->daddr;
4037 	ret = 0;
4038 
4039 	if (proto)
4040 		*proto = ih->protocol;
4041 
4042 	switch (ih->protocol) {
4043 	case IPPROTO_TCP: {
4044 		struct tcphdr _tcph, *th;
4045 
4046 		if (ntohs(ih->frag_off) & IP_OFFSET)
4047 			break;
4048 
4049 		offset += ihlen;
4050 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4051 		if (th == NULL)
4052 			break;
4053 
4054 		ad->u.net->sport = th->source;
4055 		ad->u.net->dport = th->dest;
4056 		break;
4057 	}
4058 
4059 	case IPPROTO_UDP: {
4060 		struct udphdr _udph, *uh;
4061 
4062 		if (ntohs(ih->frag_off) & IP_OFFSET)
4063 			break;
4064 
4065 		offset += ihlen;
4066 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4067 		if (uh == NULL)
4068 			break;
4069 
4070 		ad->u.net->sport = uh->source;
4071 		ad->u.net->dport = uh->dest;
4072 		break;
4073 	}
4074 
4075 	case IPPROTO_DCCP: {
4076 		struct dccp_hdr _dccph, *dh;
4077 
4078 		if (ntohs(ih->frag_off) & IP_OFFSET)
4079 			break;
4080 
4081 		offset += ihlen;
4082 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4083 		if (dh == NULL)
4084 			break;
4085 
4086 		ad->u.net->sport = dh->dccph_sport;
4087 		ad->u.net->dport = dh->dccph_dport;
4088 		break;
4089 	}
4090 
4091 	default:
4092 		break;
4093 	}
4094 out:
4095 	return ret;
4096 }
4097 
4098 #if IS_ENABLED(CONFIG_IPV6)
4099 
4100 /* Returns error only if unable to parse addresses */
4101 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
4102 			struct common_audit_data *ad, u8 *proto)
4103 {
4104 	u8 nexthdr;
4105 	int ret = -EINVAL, offset;
4106 	struct ipv6hdr _ipv6h, *ip6;
4107 	__be16 frag_off;
4108 
4109 	offset = skb_network_offset(skb);
4110 	ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
4111 	if (ip6 == NULL)
4112 		goto out;
4113 
4114 	ad->u.net->v6info.saddr = ip6->saddr;
4115 	ad->u.net->v6info.daddr = ip6->daddr;
4116 	ret = 0;
4117 
4118 	nexthdr = ip6->nexthdr;
4119 	offset += sizeof(_ipv6h);
4120 	offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
4121 	if (offset < 0)
4122 		goto out;
4123 
4124 	if (proto)
4125 		*proto = nexthdr;
4126 
4127 	switch (nexthdr) {
4128 	case IPPROTO_TCP: {
4129 		struct tcphdr _tcph, *th;
4130 
4131 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4132 		if (th == NULL)
4133 			break;
4134 
4135 		ad->u.net->sport = th->source;
4136 		ad->u.net->dport = th->dest;
4137 		break;
4138 	}
4139 
4140 	case IPPROTO_UDP: {
4141 		struct udphdr _udph, *uh;
4142 
4143 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4144 		if (uh == NULL)
4145 			break;
4146 
4147 		ad->u.net->sport = uh->source;
4148 		ad->u.net->dport = uh->dest;
4149 		break;
4150 	}
4151 
4152 	case IPPROTO_DCCP: {
4153 		struct dccp_hdr _dccph, *dh;
4154 
4155 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4156 		if (dh == NULL)
4157 			break;
4158 
4159 		ad->u.net->sport = dh->dccph_sport;
4160 		ad->u.net->dport = dh->dccph_dport;
4161 		break;
4162 	}
4163 
4164 	/* includes fragments */
4165 	default:
4166 		break;
4167 	}
4168 out:
4169 	return ret;
4170 }
4171 
4172 #endif /* IPV6 */
4173 
4174 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
4175 			     char **_addrp, int src, u8 *proto)
4176 {
4177 	char *addrp;
4178 	int ret;
4179 
4180 	switch (ad->u.net->family) {
4181 	case PF_INET:
4182 		ret = selinux_parse_skb_ipv4(skb, ad, proto);
4183 		if (ret)
4184 			goto parse_error;
4185 		addrp = (char *)(src ? &ad->u.net->v4info.saddr :
4186 				       &ad->u.net->v4info.daddr);
4187 		goto okay;
4188 
4189 #if IS_ENABLED(CONFIG_IPV6)
4190 	case PF_INET6:
4191 		ret = selinux_parse_skb_ipv6(skb, ad, proto);
4192 		if (ret)
4193 			goto parse_error;
4194 		addrp = (char *)(src ? &ad->u.net->v6info.saddr :
4195 				       &ad->u.net->v6info.daddr);
4196 		goto okay;
4197 #endif	/* IPV6 */
4198 	default:
4199 		addrp = NULL;
4200 		goto okay;
4201 	}
4202 
4203 parse_error:
4204 	printk(KERN_WARNING
4205 	       "SELinux: failure in selinux_parse_skb(),"
4206 	       " unable to parse packet\n");
4207 	return ret;
4208 
4209 okay:
4210 	if (_addrp)
4211 		*_addrp = addrp;
4212 	return 0;
4213 }
4214 
4215 /**
4216  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
4217  * @skb: the packet
4218  * @family: protocol family
4219  * @sid: the packet's peer label SID
4220  *
4221  * Description:
4222  * Check the various different forms of network peer labeling and determine
4223  * the peer label/SID for the packet; most of the magic actually occurs in
4224  * the security server function security_net_peersid_cmp().  The function
4225  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
4226  * or -EACCES if @sid is invalid due to inconsistencies with the different
4227  * peer labels.
4228  *
4229  */
4230 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
4231 {
4232 	int err;
4233 	u32 xfrm_sid;
4234 	u32 nlbl_sid;
4235 	u32 nlbl_type;
4236 
4237 	err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
4238 	if (unlikely(err))
4239 		return -EACCES;
4240 	err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
4241 	if (unlikely(err))
4242 		return -EACCES;
4243 
4244 	err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
4245 	if (unlikely(err)) {
4246 		printk(KERN_WARNING
4247 		       "SELinux: failure in selinux_skb_peerlbl_sid(),"
4248 		       " unable to determine packet's peer label\n");
4249 		return -EACCES;
4250 	}
4251 
4252 	return 0;
4253 }
4254 
4255 /**
4256  * selinux_conn_sid - Determine the child socket label for a connection
4257  * @sk_sid: the parent socket's SID
4258  * @skb_sid: the packet's SID
4259  * @conn_sid: the resulting connection SID
4260  *
4261  * If @skb_sid is valid then the user:role:type information from @sk_sid is
4262  * combined with the MLS information from @skb_sid in order to create
4263  * @conn_sid.  If @skb_sid is not valid then then @conn_sid is simply a copy
4264  * of @sk_sid.  Returns zero on success, negative values on failure.
4265  *
4266  */
4267 static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
4268 {
4269 	int err = 0;
4270 
4271 	if (skb_sid != SECSID_NULL)
4272 		err = security_sid_mls_copy(sk_sid, skb_sid, conn_sid);
4273 	else
4274 		*conn_sid = sk_sid;
4275 
4276 	return err;
4277 }
4278 
4279 /* socket security operations */
4280 
4281 static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4282 				 u16 secclass, u32 *socksid)
4283 {
4284 	if (tsec->sockcreate_sid > SECSID_NULL) {
4285 		*socksid = tsec->sockcreate_sid;
4286 		return 0;
4287 	}
4288 
4289 	return security_transition_sid(tsec->sid, tsec->sid, secclass, NULL,
4290 				       socksid);
4291 }
4292 
4293 static int sock_has_perm(struct sock *sk, u32 perms)
4294 {
4295 	struct sk_security_struct *sksec = sk->sk_security;
4296 	struct common_audit_data ad;
4297 	struct lsm_network_audit net = {0,};
4298 
4299 	if (sksec->sid == SECINITSID_KERNEL)
4300 		return 0;
4301 
4302 	ad.type = LSM_AUDIT_DATA_NET;
4303 	ad.u.net = &net;
4304 	ad.u.net->sk = sk;
4305 
4306 	return avc_has_perm(current_sid(), sksec->sid, sksec->sclass, perms,
4307 			    &ad);
4308 }
4309 
4310 static int selinux_socket_create(int family, int type,
4311 				 int protocol, int kern)
4312 {
4313 	const struct task_security_struct *tsec = current_security();
4314 	u32 newsid;
4315 	u16 secclass;
4316 	int rc;
4317 
4318 	if (kern)
4319 		return 0;
4320 
4321 	secclass = socket_type_to_security_class(family, type, protocol);
4322 	rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4323 	if (rc)
4324 		return rc;
4325 
4326 	return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4327 }
4328 
4329 static int selinux_socket_post_create(struct socket *sock, int family,
4330 				      int type, int protocol, int kern)
4331 {
4332 	const struct task_security_struct *tsec = current_security();
4333 	struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
4334 	struct sk_security_struct *sksec;
4335 	u16 sclass = socket_type_to_security_class(family, type, protocol);
4336 	u32 sid = SECINITSID_KERNEL;
4337 	int err = 0;
4338 
4339 	if (!kern) {
4340 		err = socket_sockcreate_sid(tsec, sclass, &sid);
4341 		if (err)
4342 			return err;
4343 	}
4344 
4345 	isec->sclass = sclass;
4346 	isec->sid = sid;
4347 	isec->initialized = LABEL_INITIALIZED;
4348 
4349 	if (sock->sk) {
4350 		sksec = sock->sk->sk_security;
4351 		sksec->sclass = sclass;
4352 		sksec->sid = sid;
4353 		err = selinux_netlbl_socket_post_create(sock->sk, family);
4354 	}
4355 
4356 	return err;
4357 }
4358 
4359 /* Range of port numbers used to automatically bind.
4360    Need to determine whether we should perform a name_bind
4361    permission check between the socket and the port number. */
4362 
4363 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4364 {
4365 	struct sock *sk = sock->sk;
4366 	u16 family;
4367 	int err;
4368 
4369 	err = sock_has_perm(sk, SOCKET__BIND);
4370 	if (err)
4371 		goto out;
4372 
4373 	/*
4374 	 * If PF_INET or PF_INET6, check name_bind permission for the port.
4375 	 * Multiple address binding for SCTP is not supported yet: we just
4376 	 * check the first address now.
4377 	 */
4378 	family = sk->sk_family;
4379 	if (family == PF_INET || family == PF_INET6) {
4380 		char *addrp;
4381 		struct sk_security_struct *sksec = sk->sk_security;
4382 		struct common_audit_data ad;
4383 		struct lsm_network_audit net = {0,};
4384 		struct sockaddr_in *addr4 = NULL;
4385 		struct sockaddr_in6 *addr6 = NULL;
4386 		unsigned short snum;
4387 		u32 sid, node_perm;
4388 
4389 		if (family == PF_INET) {
4390 			if (addrlen < sizeof(struct sockaddr_in)) {
4391 				err = -EINVAL;
4392 				goto out;
4393 			}
4394 			addr4 = (struct sockaddr_in *)address;
4395 			snum = ntohs(addr4->sin_port);
4396 			addrp = (char *)&addr4->sin_addr.s_addr;
4397 		} else {
4398 			if (addrlen < SIN6_LEN_RFC2133) {
4399 				err = -EINVAL;
4400 				goto out;
4401 			}
4402 			addr6 = (struct sockaddr_in6 *)address;
4403 			snum = ntohs(addr6->sin6_port);
4404 			addrp = (char *)&addr6->sin6_addr.s6_addr;
4405 		}
4406 
4407 		if (snum) {
4408 			int low, high;
4409 
4410 			inet_get_local_port_range(sock_net(sk), &low, &high);
4411 
4412 			if (snum < max(inet_prot_sock(sock_net(sk)), low) ||
4413 			    snum > high) {
4414 				err = sel_netport_sid(sk->sk_protocol,
4415 						      snum, &sid);
4416 				if (err)
4417 					goto out;
4418 				ad.type = LSM_AUDIT_DATA_NET;
4419 				ad.u.net = &net;
4420 				ad.u.net->sport = htons(snum);
4421 				ad.u.net->family = family;
4422 				err = avc_has_perm(sksec->sid, sid,
4423 						   sksec->sclass,
4424 						   SOCKET__NAME_BIND, &ad);
4425 				if (err)
4426 					goto out;
4427 			}
4428 		}
4429 
4430 		switch (sksec->sclass) {
4431 		case SECCLASS_TCP_SOCKET:
4432 			node_perm = TCP_SOCKET__NODE_BIND;
4433 			break;
4434 
4435 		case SECCLASS_UDP_SOCKET:
4436 			node_perm = UDP_SOCKET__NODE_BIND;
4437 			break;
4438 
4439 		case SECCLASS_DCCP_SOCKET:
4440 			node_perm = DCCP_SOCKET__NODE_BIND;
4441 			break;
4442 
4443 		default:
4444 			node_perm = RAWIP_SOCKET__NODE_BIND;
4445 			break;
4446 		}
4447 
4448 		err = sel_netnode_sid(addrp, family, &sid);
4449 		if (err)
4450 			goto out;
4451 
4452 		ad.type = LSM_AUDIT_DATA_NET;
4453 		ad.u.net = &net;
4454 		ad.u.net->sport = htons(snum);
4455 		ad.u.net->family = family;
4456 
4457 		if (family == PF_INET)
4458 			ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4459 		else
4460 			ad.u.net->v6info.saddr = addr6->sin6_addr;
4461 
4462 		err = avc_has_perm(sksec->sid, sid,
4463 				   sksec->sclass, node_perm, &ad);
4464 		if (err)
4465 			goto out;
4466 	}
4467 out:
4468 	return err;
4469 }
4470 
4471 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
4472 {
4473 	struct sock *sk = sock->sk;
4474 	struct sk_security_struct *sksec = sk->sk_security;
4475 	int err;
4476 
4477 	err = sock_has_perm(sk, SOCKET__CONNECT);
4478 	if (err)
4479 		return err;
4480 
4481 	/*
4482 	 * If a TCP or DCCP socket, check name_connect permission for the port.
4483 	 */
4484 	if (sksec->sclass == SECCLASS_TCP_SOCKET ||
4485 	    sksec->sclass == SECCLASS_DCCP_SOCKET) {
4486 		struct common_audit_data ad;
4487 		struct lsm_network_audit net = {0,};
4488 		struct sockaddr_in *addr4 = NULL;
4489 		struct sockaddr_in6 *addr6 = NULL;
4490 		unsigned short snum;
4491 		u32 sid, perm;
4492 
4493 		if (sk->sk_family == PF_INET) {
4494 			addr4 = (struct sockaddr_in *)address;
4495 			if (addrlen < sizeof(struct sockaddr_in))
4496 				return -EINVAL;
4497 			snum = ntohs(addr4->sin_port);
4498 		} else {
4499 			addr6 = (struct sockaddr_in6 *)address;
4500 			if (addrlen < SIN6_LEN_RFC2133)
4501 				return -EINVAL;
4502 			snum = ntohs(addr6->sin6_port);
4503 		}
4504 
4505 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);
4506 		if (err)
4507 			goto out;
4508 
4509 		perm = (sksec->sclass == SECCLASS_TCP_SOCKET) ?
4510 		       TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
4511 
4512 		ad.type = LSM_AUDIT_DATA_NET;
4513 		ad.u.net = &net;
4514 		ad.u.net->dport = htons(snum);
4515 		ad.u.net->family = sk->sk_family;
4516 		err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
4517 		if (err)
4518 			goto out;
4519 	}
4520 
4521 	err = selinux_netlbl_socket_connect(sk, address);
4522 
4523 out:
4524 	return err;
4525 }
4526 
4527 static int selinux_socket_listen(struct socket *sock, int backlog)
4528 {
4529 	return sock_has_perm(sock->sk, SOCKET__LISTEN);
4530 }
4531 
4532 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
4533 {
4534 	int err;
4535 	struct inode_security_struct *isec;
4536 	struct inode_security_struct *newisec;
4537 	u16 sclass;
4538 	u32 sid;
4539 
4540 	err = sock_has_perm(sock->sk, SOCKET__ACCEPT);
4541 	if (err)
4542 		return err;
4543 
4544 	isec = inode_security_novalidate(SOCK_INODE(sock));
4545 	spin_lock(&isec->lock);
4546 	sclass = isec->sclass;
4547 	sid = isec->sid;
4548 	spin_unlock(&isec->lock);
4549 
4550 	newisec = inode_security_novalidate(SOCK_INODE(newsock));
4551 	newisec->sclass = sclass;
4552 	newisec->sid = sid;
4553 	newisec->initialized = LABEL_INITIALIZED;
4554 
4555 	return 0;
4556 }
4557 
4558 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
4559 				  int size)
4560 {
4561 	return sock_has_perm(sock->sk, SOCKET__WRITE);
4562 }
4563 
4564 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
4565 				  int size, int flags)
4566 {
4567 	return sock_has_perm(sock->sk, SOCKET__READ);
4568 }
4569 
4570 static int selinux_socket_getsockname(struct socket *sock)
4571 {
4572 	return sock_has_perm(sock->sk, SOCKET__GETATTR);
4573 }
4574 
4575 static int selinux_socket_getpeername(struct socket *sock)
4576 {
4577 	return sock_has_perm(sock->sk, SOCKET__GETATTR);
4578 }
4579 
4580 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
4581 {
4582 	int err;
4583 
4584 	err = sock_has_perm(sock->sk, SOCKET__SETOPT);
4585 	if (err)
4586 		return err;
4587 
4588 	return selinux_netlbl_socket_setsockopt(sock, level, optname);
4589 }
4590 
4591 static int selinux_socket_getsockopt(struct socket *sock, int level,
4592 				     int optname)
4593 {
4594 	return sock_has_perm(sock->sk, SOCKET__GETOPT);
4595 }
4596 
4597 static int selinux_socket_shutdown(struct socket *sock, int how)
4598 {
4599 	return sock_has_perm(sock->sk, SOCKET__SHUTDOWN);
4600 }
4601 
4602 static int selinux_socket_unix_stream_connect(struct sock *sock,
4603 					      struct sock *other,
4604 					      struct sock *newsk)
4605 {
4606 	struct sk_security_struct *sksec_sock = sock->sk_security;
4607 	struct sk_security_struct *sksec_other = other->sk_security;
4608 	struct sk_security_struct *sksec_new = newsk->sk_security;
4609 	struct common_audit_data ad;
4610 	struct lsm_network_audit net = {0,};
4611 	int err;
4612 
4613 	ad.type = LSM_AUDIT_DATA_NET;
4614 	ad.u.net = &net;
4615 	ad.u.net->sk = other;
4616 
4617 	err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
4618 			   sksec_other->sclass,
4619 			   UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4620 	if (err)
4621 		return err;
4622 
4623 	/* server child socket */
4624 	sksec_new->peer_sid = sksec_sock->sid;
4625 	err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4626 				    &sksec_new->sid);
4627 	if (err)
4628 		return err;
4629 
4630 	/* connecting socket */
4631 	sksec_sock->peer_sid = sksec_new->sid;
4632 
4633 	return 0;
4634 }
4635 
4636 static int selinux_socket_unix_may_send(struct socket *sock,
4637 					struct socket *other)
4638 {
4639 	struct sk_security_struct *ssec = sock->sk->sk_security;
4640 	struct sk_security_struct *osec = other->sk->sk_security;
4641 	struct common_audit_data ad;
4642 	struct lsm_network_audit net = {0,};
4643 
4644 	ad.type = LSM_AUDIT_DATA_NET;
4645 	ad.u.net = &net;
4646 	ad.u.net->sk = other->sk;
4647 
4648 	return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4649 			    &ad);
4650 }
4651 
4652 static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
4653 				    char *addrp, u16 family, u32 peer_sid,
4654 				    struct common_audit_data *ad)
4655 {
4656 	int err;
4657 	u32 if_sid;
4658 	u32 node_sid;
4659 
4660 	err = sel_netif_sid(ns, ifindex, &if_sid);
4661 	if (err)
4662 		return err;
4663 	err = avc_has_perm(peer_sid, if_sid,
4664 			   SECCLASS_NETIF, NETIF__INGRESS, ad);
4665 	if (err)
4666 		return err;
4667 
4668 	err = sel_netnode_sid(addrp, family, &node_sid);
4669 	if (err)
4670 		return err;
4671 	return avc_has_perm(peer_sid, node_sid,
4672 			    SECCLASS_NODE, NODE__RECVFROM, ad);
4673 }
4674 
4675 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4676 				       u16 family)
4677 {
4678 	int err = 0;
4679 	struct sk_security_struct *sksec = sk->sk_security;
4680 	u32 sk_sid = sksec->sid;
4681 	struct common_audit_data ad;
4682 	struct lsm_network_audit net = {0,};
4683 	char *addrp;
4684 
4685 	ad.type = LSM_AUDIT_DATA_NET;
4686 	ad.u.net = &net;
4687 	ad.u.net->netif = skb->skb_iif;
4688 	ad.u.net->family = family;
4689 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4690 	if (err)
4691 		return err;
4692 
4693 	if (selinux_secmark_enabled()) {
4694 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4695 				   PACKET__RECV, &ad);
4696 		if (err)
4697 			return err;
4698 	}
4699 
4700 	err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4701 	if (err)
4702 		return err;
4703 	err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4704 
4705 	return err;
4706 }
4707 
4708 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4709 {
4710 	int err;
4711 	struct sk_security_struct *sksec = sk->sk_security;
4712 	u16 family = sk->sk_family;
4713 	u32 sk_sid = sksec->sid;
4714 	struct common_audit_data ad;
4715 	struct lsm_network_audit net = {0,};
4716 	char *addrp;
4717 	u8 secmark_active;
4718 	u8 peerlbl_active;
4719 
4720 	if (family != PF_INET && family != PF_INET6)
4721 		return 0;
4722 
4723 	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
4724 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4725 		family = PF_INET;
4726 
4727 	/* If any sort of compatibility mode is enabled then handoff processing
4728 	 * to the selinux_sock_rcv_skb_compat() function to deal with the
4729 	 * special handling.  We do this in an attempt to keep this function
4730 	 * as fast and as clean as possible. */
4731 	if (!selinux_policycap_netpeer)
4732 		return selinux_sock_rcv_skb_compat(sk, skb, family);
4733 
4734 	secmark_active = selinux_secmark_enabled();
4735 	peerlbl_active = selinux_peerlbl_enabled();
4736 	if (!secmark_active && !peerlbl_active)
4737 		return 0;
4738 
4739 	ad.type = LSM_AUDIT_DATA_NET;
4740 	ad.u.net = &net;
4741 	ad.u.net->netif = skb->skb_iif;
4742 	ad.u.net->family = family;
4743 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4744 	if (err)
4745 		return err;
4746 
4747 	if (peerlbl_active) {
4748 		u32 peer_sid;
4749 
4750 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4751 		if (err)
4752 			return err;
4753 		err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
4754 					       addrp, family, peer_sid, &ad);
4755 		if (err) {
4756 			selinux_netlbl_err(skb, family, err, 0);
4757 			return err;
4758 		}
4759 		err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4760 				   PEER__RECV, &ad);
4761 		if (err) {
4762 			selinux_netlbl_err(skb, family, err, 0);
4763 			return err;
4764 		}
4765 	}
4766 
4767 	if (secmark_active) {
4768 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4769 				   PACKET__RECV, &ad);
4770 		if (err)
4771 			return err;
4772 	}
4773 
4774 	return err;
4775 }
4776 
4777 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4778 					    int __user *optlen, unsigned len)
4779 {
4780 	int err = 0;
4781 	char *scontext;
4782 	u32 scontext_len;
4783 	struct sk_security_struct *sksec = sock->sk->sk_security;
4784 	u32 peer_sid = SECSID_NULL;
4785 
4786 	if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4787 	    sksec->sclass == SECCLASS_TCP_SOCKET)
4788 		peer_sid = sksec->peer_sid;
4789 	if (peer_sid == SECSID_NULL)
4790 		return -ENOPROTOOPT;
4791 
4792 	err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4793 	if (err)
4794 		return err;
4795 
4796 	if (scontext_len > len) {
4797 		err = -ERANGE;
4798 		goto out_len;
4799 	}
4800 
4801 	if (copy_to_user(optval, scontext, scontext_len))
4802 		err = -EFAULT;
4803 
4804 out_len:
4805 	if (put_user(scontext_len, optlen))
4806 		err = -EFAULT;
4807 	kfree(scontext);
4808 	return err;
4809 }
4810 
4811 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4812 {
4813 	u32 peer_secid = SECSID_NULL;
4814 	u16 family;
4815 	struct inode_security_struct *isec;
4816 
4817 	if (skb && skb->protocol == htons(ETH_P_IP))
4818 		family = PF_INET;
4819 	else if (skb && skb->protocol == htons(ETH_P_IPV6))
4820 		family = PF_INET6;
4821 	else if (sock)
4822 		family = sock->sk->sk_family;
4823 	else
4824 		goto out;
4825 
4826 	if (sock && family == PF_UNIX) {
4827 		isec = inode_security_novalidate(SOCK_INODE(sock));
4828 		peer_secid = isec->sid;
4829 	} else if (skb)
4830 		selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4831 
4832 out:
4833 	*secid = peer_secid;
4834 	if (peer_secid == SECSID_NULL)
4835 		return -EINVAL;
4836 	return 0;
4837 }
4838 
4839 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4840 {
4841 	struct sk_security_struct *sksec;
4842 
4843 	sksec = kzalloc(sizeof(*sksec), priority);
4844 	if (!sksec)
4845 		return -ENOMEM;
4846 
4847 	sksec->peer_sid = SECINITSID_UNLABELED;
4848 	sksec->sid = SECINITSID_UNLABELED;
4849 	sksec->sclass = SECCLASS_SOCKET;
4850 	selinux_netlbl_sk_security_reset(sksec);
4851 	sk->sk_security = sksec;
4852 
4853 	return 0;
4854 }
4855 
4856 static void selinux_sk_free_security(struct sock *sk)
4857 {
4858 	struct sk_security_struct *sksec = sk->sk_security;
4859 
4860 	sk->sk_security = NULL;
4861 	selinux_netlbl_sk_security_free(sksec);
4862 	kfree(sksec);
4863 }
4864 
4865 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4866 {
4867 	struct sk_security_struct *sksec = sk->sk_security;
4868 	struct sk_security_struct *newsksec = newsk->sk_security;
4869 
4870 	newsksec->sid = sksec->sid;
4871 	newsksec->peer_sid = sksec->peer_sid;
4872 	newsksec->sclass = sksec->sclass;
4873 
4874 	selinux_netlbl_sk_security_reset(newsksec);
4875 }
4876 
4877 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4878 {
4879 	if (!sk)
4880 		*secid = SECINITSID_ANY_SOCKET;
4881 	else {
4882 		struct sk_security_struct *sksec = sk->sk_security;
4883 
4884 		*secid = sksec->sid;
4885 	}
4886 }
4887 
4888 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4889 {
4890 	struct inode_security_struct *isec =
4891 		inode_security_novalidate(SOCK_INODE(parent));
4892 	struct sk_security_struct *sksec = sk->sk_security;
4893 
4894 	if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4895 	    sk->sk_family == PF_UNIX)
4896 		isec->sid = sksec->sid;
4897 	sksec->sclass = isec->sclass;
4898 }
4899 
4900 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4901 				     struct request_sock *req)
4902 {
4903 	struct sk_security_struct *sksec = sk->sk_security;
4904 	int err;
4905 	u16 family = req->rsk_ops->family;
4906 	u32 connsid;
4907 	u32 peersid;
4908 
4909 	err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4910 	if (err)
4911 		return err;
4912 	err = selinux_conn_sid(sksec->sid, peersid, &connsid);
4913 	if (err)
4914 		return err;
4915 	req->secid = connsid;
4916 	req->peer_secid = peersid;
4917 
4918 	return selinux_netlbl_inet_conn_request(req, family);
4919 }
4920 
4921 static void selinux_inet_csk_clone(struct sock *newsk,
4922 				   const struct request_sock *req)
4923 {
4924 	struct sk_security_struct *newsksec = newsk->sk_security;
4925 
4926 	newsksec->sid = req->secid;
4927 	newsksec->peer_sid = req->peer_secid;
4928 	/* NOTE: Ideally, we should also get the isec->sid for the
4929 	   new socket in sync, but we don't have the isec available yet.
4930 	   So we will wait until sock_graft to do it, by which
4931 	   time it will have been created and available. */
4932 
4933 	/* We don't need to take any sort of lock here as we are the only
4934 	 * thread with access to newsksec */
4935 	selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4936 }
4937 
4938 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4939 {
4940 	u16 family = sk->sk_family;
4941 	struct sk_security_struct *sksec = sk->sk_security;
4942 
4943 	/* handle mapped IPv4 packets arriving via IPv6 sockets */
4944 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4945 		family = PF_INET;
4946 
4947 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4948 }
4949 
4950 static int selinux_secmark_relabel_packet(u32 sid)
4951 {
4952 	const struct task_security_struct *__tsec;
4953 	u32 tsid;
4954 
4955 	__tsec = current_security();
4956 	tsid = __tsec->sid;
4957 
4958 	return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
4959 }
4960 
4961 static void selinux_secmark_refcount_inc(void)
4962 {
4963 	atomic_inc(&selinux_secmark_refcount);
4964 }
4965 
4966 static void selinux_secmark_refcount_dec(void)
4967 {
4968 	atomic_dec(&selinux_secmark_refcount);
4969 }
4970 
4971 static void selinux_req_classify_flow(const struct request_sock *req,
4972 				      struct flowi *fl)
4973 {
4974 	fl->flowi_secid = req->secid;
4975 }
4976 
4977 static int selinux_tun_dev_alloc_security(void **security)
4978 {
4979 	struct tun_security_struct *tunsec;
4980 
4981 	tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
4982 	if (!tunsec)
4983 		return -ENOMEM;
4984 	tunsec->sid = current_sid();
4985 
4986 	*security = tunsec;
4987 	return 0;
4988 }
4989 
4990 static void selinux_tun_dev_free_security(void *security)
4991 {
4992 	kfree(security);
4993 }
4994 
4995 static int selinux_tun_dev_create(void)
4996 {
4997 	u32 sid = current_sid();
4998 
4999 	/* we aren't taking into account the "sockcreate" SID since the socket
5000 	 * that is being created here is not a socket in the traditional sense,
5001 	 * instead it is a private sock, accessible only to the kernel, and
5002 	 * representing a wide range of network traffic spanning multiple
5003 	 * connections unlike traditional sockets - check the TUN driver to
5004 	 * get a better understanding of why this socket is special */
5005 
5006 	return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
5007 			    NULL);
5008 }
5009 
5010 static int selinux_tun_dev_attach_queue(void *security)
5011 {
5012 	struct tun_security_struct *tunsec = security;
5013 
5014 	return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
5015 			    TUN_SOCKET__ATTACH_QUEUE, NULL);
5016 }
5017 
5018 static int selinux_tun_dev_attach(struct sock *sk, void *security)
5019 {
5020 	struct tun_security_struct *tunsec = security;
5021 	struct sk_security_struct *sksec = sk->sk_security;
5022 
5023 	/* we don't currently perform any NetLabel based labeling here and it
5024 	 * isn't clear that we would want to do so anyway; while we could apply
5025 	 * labeling without the support of the TUN user the resulting labeled
5026 	 * traffic from the other end of the connection would almost certainly
5027 	 * cause confusion to the TUN user that had no idea network labeling
5028 	 * protocols were being used */
5029 
5030 	sksec->sid = tunsec->sid;
5031 	sksec->sclass = SECCLASS_TUN_SOCKET;
5032 
5033 	return 0;
5034 }
5035 
5036 static int selinux_tun_dev_open(void *security)
5037 {
5038 	struct tun_security_struct *tunsec = security;
5039 	u32 sid = current_sid();
5040 	int err;
5041 
5042 	err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
5043 			   TUN_SOCKET__RELABELFROM, NULL);
5044 	if (err)
5045 		return err;
5046 	err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
5047 			   TUN_SOCKET__RELABELTO, NULL);
5048 	if (err)
5049 		return err;
5050 	tunsec->sid = sid;
5051 
5052 	return 0;
5053 }
5054 
5055 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
5056 {
5057 	int err = 0;
5058 	u32 perm;
5059 	struct nlmsghdr *nlh;
5060 	struct sk_security_struct *sksec = sk->sk_security;
5061 
5062 	if (skb->len < NLMSG_HDRLEN) {
5063 		err = -EINVAL;
5064 		goto out;
5065 	}
5066 	nlh = nlmsg_hdr(skb);
5067 
5068 	err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
5069 	if (err) {
5070 		if (err == -EINVAL) {
5071 			pr_warn_ratelimited("SELinux: unrecognized netlink"
5072 			       " message: protocol=%hu nlmsg_type=%hu sclass=%s"
5073 			       " pig=%d comm=%s\n",
5074 			       sk->sk_protocol, nlh->nlmsg_type,
5075 			       secclass_map[sksec->sclass - 1].name,
5076 			       task_pid_nr(current), current->comm);
5077 			if (!selinux_enforcing || security_get_allow_unknown())
5078 				err = 0;
5079 		}
5080 
5081 		/* Ignore */
5082 		if (err == -ENOENT)
5083 			err = 0;
5084 		goto out;
5085 	}
5086 
5087 	err = sock_has_perm(sk, perm);
5088 out:
5089 	return err;
5090 }
5091 
5092 #ifdef CONFIG_NETFILTER
5093 
5094 static unsigned int selinux_ip_forward(struct sk_buff *skb,
5095 				       const struct net_device *indev,
5096 				       u16 family)
5097 {
5098 	int err;
5099 	char *addrp;
5100 	u32 peer_sid;
5101 	struct common_audit_data ad;
5102 	struct lsm_network_audit net = {0,};
5103 	u8 secmark_active;
5104 	u8 netlbl_active;
5105 	u8 peerlbl_active;
5106 
5107 	if (!selinux_policycap_netpeer)
5108 		return NF_ACCEPT;
5109 
5110 	secmark_active = selinux_secmark_enabled();
5111 	netlbl_active = netlbl_enabled();
5112 	peerlbl_active = selinux_peerlbl_enabled();
5113 	if (!secmark_active && !peerlbl_active)
5114 		return NF_ACCEPT;
5115 
5116 	if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
5117 		return NF_DROP;
5118 
5119 	ad.type = LSM_AUDIT_DATA_NET;
5120 	ad.u.net = &net;
5121 	ad.u.net->netif = indev->ifindex;
5122 	ad.u.net->family = family;
5123 	if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
5124 		return NF_DROP;
5125 
5126 	if (peerlbl_active) {
5127 		err = selinux_inet_sys_rcv_skb(dev_net(indev), indev->ifindex,
5128 					       addrp, family, peer_sid, &ad);
5129 		if (err) {
5130 			selinux_netlbl_err(skb, family, err, 1);
5131 			return NF_DROP;
5132 		}
5133 	}
5134 
5135 	if (secmark_active)
5136 		if (avc_has_perm(peer_sid, skb->secmark,
5137 				 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
5138 			return NF_DROP;
5139 
5140 	if (netlbl_active)
5141 		/* we do this in the FORWARD path and not the POST_ROUTING
5142 		 * path because we want to make sure we apply the necessary
5143 		 * labeling before IPsec is applied so we can leverage AH
5144 		 * protection */
5145 		if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
5146 			return NF_DROP;
5147 
5148 	return NF_ACCEPT;
5149 }
5150 
5151 static unsigned int selinux_ipv4_forward(void *priv,
5152 					 struct sk_buff *skb,
5153 					 const struct nf_hook_state *state)
5154 {
5155 	return selinux_ip_forward(skb, state->in, PF_INET);
5156 }
5157 
5158 #if IS_ENABLED(CONFIG_IPV6)
5159 static unsigned int selinux_ipv6_forward(void *priv,
5160 					 struct sk_buff *skb,
5161 					 const struct nf_hook_state *state)
5162 {
5163 	return selinux_ip_forward(skb, state->in, PF_INET6);
5164 }
5165 #endif	/* IPV6 */
5166 
5167 static unsigned int selinux_ip_output(struct sk_buff *skb,
5168 				      u16 family)
5169 {
5170 	struct sock *sk;
5171 	u32 sid;
5172 
5173 	if (!netlbl_enabled())
5174 		return NF_ACCEPT;
5175 
5176 	/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
5177 	 * because we want to make sure we apply the necessary labeling
5178 	 * before IPsec is applied so we can leverage AH protection */
5179 	sk = skb->sk;
5180 	if (sk) {
5181 		struct sk_security_struct *sksec;
5182 
5183 		if (sk_listener(sk))
5184 			/* if the socket is the listening state then this
5185 			 * packet is a SYN-ACK packet which means it needs to
5186 			 * be labeled based on the connection/request_sock and
5187 			 * not the parent socket.  unfortunately, we can't
5188 			 * lookup the request_sock yet as it isn't queued on
5189 			 * the parent socket until after the SYN-ACK is sent.
5190 			 * the "solution" is to simply pass the packet as-is
5191 			 * as any IP option based labeling should be copied
5192 			 * from the initial connection request (in the IP
5193 			 * layer).  it is far from ideal, but until we get a
5194 			 * security label in the packet itself this is the
5195 			 * best we can do. */
5196 			return NF_ACCEPT;
5197 
5198 		/* standard practice, label using the parent socket */
5199 		sksec = sk->sk_security;
5200 		sid = sksec->sid;
5201 	} else
5202 		sid = SECINITSID_KERNEL;
5203 	if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
5204 		return NF_DROP;
5205 
5206 	return NF_ACCEPT;
5207 }
5208 
5209 static unsigned int selinux_ipv4_output(void *priv,
5210 					struct sk_buff *skb,
5211 					const struct nf_hook_state *state)
5212 {
5213 	return selinux_ip_output(skb, PF_INET);
5214 }
5215 
5216 #if IS_ENABLED(CONFIG_IPV6)
5217 static unsigned int selinux_ipv6_output(void *priv,
5218 					struct sk_buff *skb,
5219 					const struct nf_hook_state *state)
5220 {
5221 	return selinux_ip_output(skb, PF_INET6);
5222 }
5223 #endif	/* IPV6 */
5224 
5225 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
5226 						int ifindex,
5227 						u16 family)
5228 {
5229 	struct sock *sk = skb_to_full_sk(skb);
5230 	struct sk_security_struct *sksec;
5231 	struct common_audit_data ad;
5232 	struct lsm_network_audit net = {0,};
5233 	char *addrp;
5234 	u8 proto;
5235 
5236 	if (sk == NULL)
5237 		return NF_ACCEPT;
5238 	sksec = sk->sk_security;
5239 
5240 	ad.type = LSM_AUDIT_DATA_NET;
5241 	ad.u.net = &net;
5242 	ad.u.net->netif = ifindex;
5243 	ad.u.net->family = family;
5244 	if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
5245 		return NF_DROP;
5246 
5247 	if (selinux_secmark_enabled())
5248 		if (avc_has_perm(sksec->sid, skb->secmark,
5249 				 SECCLASS_PACKET, PACKET__SEND, &ad))
5250 			return NF_DROP_ERR(-ECONNREFUSED);
5251 
5252 	if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
5253 		return NF_DROP_ERR(-ECONNREFUSED);
5254 
5255 	return NF_ACCEPT;
5256 }
5257 
5258 static unsigned int selinux_ip_postroute(struct sk_buff *skb,
5259 					 const struct net_device *outdev,
5260 					 u16 family)
5261 {
5262 	u32 secmark_perm;
5263 	u32 peer_sid;
5264 	int ifindex = outdev->ifindex;
5265 	struct sock *sk;
5266 	struct common_audit_data ad;
5267 	struct lsm_network_audit net = {0,};
5268 	char *addrp;
5269 	u8 secmark_active;
5270 	u8 peerlbl_active;
5271 
5272 	/* If any sort of compatibility mode is enabled then handoff processing
5273 	 * to the selinux_ip_postroute_compat() function to deal with the
5274 	 * special handling.  We do this in an attempt to keep this function
5275 	 * as fast and as clean as possible. */
5276 	if (!selinux_policycap_netpeer)
5277 		return selinux_ip_postroute_compat(skb, ifindex, family);
5278 
5279 	secmark_active = selinux_secmark_enabled();
5280 	peerlbl_active = selinux_peerlbl_enabled();
5281 	if (!secmark_active && !peerlbl_active)
5282 		return NF_ACCEPT;
5283 
5284 	sk = skb_to_full_sk(skb);
5285 
5286 #ifdef CONFIG_XFRM
5287 	/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
5288 	 * packet transformation so allow the packet to pass without any checks
5289 	 * since we'll have another chance to perform access control checks
5290 	 * when the packet is on it's final way out.
5291 	 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
5292 	 *       is NULL, in this case go ahead and apply access control.
5293 	 * NOTE: if this is a local socket (skb->sk != NULL) that is in the
5294 	 *       TCP listening state we cannot wait until the XFRM processing
5295 	 *       is done as we will miss out on the SA label if we do;
5296 	 *       unfortunately, this means more work, but it is only once per
5297 	 *       connection. */
5298 	if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
5299 	    !(sk && sk_listener(sk)))
5300 		return NF_ACCEPT;
5301 #endif
5302 
5303 	if (sk == NULL) {
5304 		/* Without an associated socket the packet is either coming
5305 		 * from the kernel or it is being forwarded; check the packet
5306 		 * to determine which and if the packet is being forwarded
5307 		 * query the packet directly to determine the security label. */
5308 		if (skb->skb_iif) {
5309 			secmark_perm = PACKET__FORWARD_OUT;
5310 			if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
5311 				return NF_DROP;
5312 		} else {
5313 			secmark_perm = PACKET__SEND;
5314 			peer_sid = SECINITSID_KERNEL;
5315 		}
5316 	} else if (sk_listener(sk)) {
5317 		/* Locally generated packet but the associated socket is in the
5318 		 * listening state which means this is a SYN-ACK packet.  In
5319 		 * this particular case the correct security label is assigned
5320 		 * to the connection/request_sock but unfortunately we can't
5321 		 * query the request_sock as it isn't queued on the parent
5322 		 * socket until after the SYN-ACK packet is sent; the only
5323 		 * viable choice is to regenerate the label like we do in
5324 		 * selinux_inet_conn_request().  See also selinux_ip_output()
5325 		 * for similar problems. */
5326 		u32 skb_sid;
5327 		struct sk_security_struct *sksec;
5328 
5329 		sksec = sk->sk_security;
5330 		if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
5331 			return NF_DROP;
5332 		/* At this point, if the returned skb peerlbl is SECSID_NULL
5333 		 * and the packet has been through at least one XFRM
5334 		 * transformation then we must be dealing with the "final"
5335 		 * form of labeled IPsec packet; since we've already applied
5336 		 * all of our access controls on this packet we can safely
5337 		 * pass the packet. */
5338 		if (skb_sid == SECSID_NULL) {
5339 			switch (family) {
5340 			case PF_INET:
5341 				if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
5342 					return NF_ACCEPT;
5343 				break;
5344 			case PF_INET6:
5345 				if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
5346 					return NF_ACCEPT;
5347 				break;
5348 			default:
5349 				return NF_DROP_ERR(-ECONNREFUSED);
5350 			}
5351 		}
5352 		if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
5353 			return NF_DROP;
5354 		secmark_perm = PACKET__SEND;
5355 	} else {
5356 		/* Locally generated packet, fetch the security label from the
5357 		 * associated socket. */
5358 		struct sk_security_struct *sksec = sk->sk_security;
5359 		peer_sid = sksec->sid;
5360 		secmark_perm = PACKET__SEND;
5361 	}
5362 
5363 	ad.type = LSM_AUDIT_DATA_NET;
5364 	ad.u.net = &net;
5365 	ad.u.net->netif = ifindex;
5366 	ad.u.net->family = family;
5367 	if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
5368 		return NF_DROP;
5369 
5370 	if (secmark_active)
5371 		if (avc_has_perm(peer_sid, skb->secmark,
5372 				 SECCLASS_PACKET, secmark_perm, &ad))
5373 			return NF_DROP_ERR(-ECONNREFUSED);
5374 
5375 	if (peerlbl_active) {
5376 		u32 if_sid;
5377 		u32 node_sid;
5378 
5379 		if (sel_netif_sid(dev_net(outdev), ifindex, &if_sid))
5380 			return NF_DROP;
5381 		if (avc_has_perm(peer_sid, if_sid,
5382 				 SECCLASS_NETIF, NETIF__EGRESS, &ad))
5383 			return NF_DROP_ERR(-ECONNREFUSED);
5384 
5385 		if (sel_netnode_sid(addrp, family, &node_sid))
5386 			return NF_DROP;
5387 		if (avc_has_perm(peer_sid, node_sid,
5388 				 SECCLASS_NODE, NODE__SENDTO, &ad))
5389 			return NF_DROP_ERR(-ECONNREFUSED);
5390 	}
5391 
5392 	return NF_ACCEPT;
5393 }
5394 
5395 static unsigned int selinux_ipv4_postroute(void *priv,
5396 					   struct sk_buff *skb,
5397 					   const struct nf_hook_state *state)
5398 {
5399 	return selinux_ip_postroute(skb, state->out, PF_INET);
5400 }
5401 
5402 #if IS_ENABLED(CONFIG_IPV6)
5403 static unsigned int selinux_ipv6_postroute(void *priv,
5404 					   struct sk_buff *skb,
5405 					   const struct nf_hook_state *state)
5406 {
5407 	return selinux_ip_postroute(skb, state->out, PF_INET6);
5408 }
5409 #endif	/* IPV6 */
5410 
5411 #endif	/* CONFIG_NETFILTER */
5412 
5413 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
5414 {
5415 	return selinux_nlmsg_perm(sk, skb);
5416 }
5417 
5418 static int ipc_alloc_security(struct kern_ipc_perm *perm,
5419 			      u16 sclass)
5420 {
5421 	struct ipc_security_struct *isec;
5422 
5423 	isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
5424 	if (!isec)
5425 		return -ENOMEM;
5426 
5427 	isec->sclass = sclass;
5428 	isec->sid = current_sid();
5429 	perm->security = isec;
5430 
5431 	return 0;
5432 }
5433 
5434 static void ipc_free_security(struct kern_ipc_perm *perm)
5435 {
5436 	struct ipc_security_struct *isec = perm->security;
5437 	perm->security = NULL;
5438 	kfree(isec);
5439 }
5440 
5441 static int msg_msg_alloc_security(struct msg_msg *msg)
5442 {
5443 	struct msg_security_struct *msec;
5444 
5445 	msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
5446 	if (!msec)
5447 		return -ENOMEM;
5448 
5449 	msec->sid = SECINITSID_UNLABELED;
5450 	msg->security = msec;
5451 
5452 	return 0;
5453 }
5454 
5455 static void msg_msg_free_security(struct msg_msg *msg)
5456 {
5457 	struct msg_security_struct *msec = msg->security;
5458 
5459 	msg->security = NULL;
5460 	kfree(msec);
5461 }
5462 
5463 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
5464 			u32 perms)
5465 {
5466 	struct ipc_security_struct *isec;
5467 	struct common_audit_data ad;
5468 	u32 sid = current_sid();
5469 
5470 	isec = ipc_perms->security;
5471 
5472 	ad.type = LSM_AUDIT_DATA_IPC;
5473 	ad.u.ipc_id = ipc_perms->key;
5474 
5475 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
5476 }
5477 
5478 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
5479 {
5480 	return msg_msg_alloc_security(msg);
5481 }
5482 
5483 static void selinux_msg_msg_free_security(struct msg_msg *msg)
5484 {
5485 	msg_msg_free_security(msg);
5486 }
5487 
5488 /* message queue security operations */
5489 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
5490 {
5491 	struct ipc_security_struct *isec;
5492 	struct common_audit_data ad;
5493 	u32 sid = current_sid();
5494 	int rc;
5495 
5496 	rc = ipc_alloc_security(&msq->q_perm, SECCLASS_MSGQ);
5497 	if (rc)
5498 		return rc;
5499 
5500 	isec = msq->q_perm.security;
5501 
5502 	ad.type = LSM_AUDIT_DATA_IPC;
5503 	ad.u.ipc_id = msq->q_perm.key;
5504 
5505 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5506 			  MSGQ__CREATE, &ad);
5507 	if (rc) {
5508 		ipc_free_security(&msq->q_perm);
5509 		return rc;
5510 	}
5511 	return 0;
5512 }
5513 
5514 static void selinux_msg_queue_free_security(struct msg_queue *msq)
5515 {
5516 	ipc_free_security(&msq->q_perm);
5517 }
5518 
5519 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
5520 {
5521 	struct ipc_security_struct *isec;
5522 	struct common_audit_data ad;
5523 	u32 sid = current_sid();
5524 
5525 	isec = msq->q_perm.security;
5526 
5527 	ad.type = LSM_AUDIT_DATA_IPC;
5528 	ad.u.ipc_id = msq->q_perm.key;
5529 
5530 	return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5531 			    MSGQ__ASSOCIATE, &ad);
5532 }
5533 
5534 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
5535 {
5536 	int err;
5537 	int perms;
5538 
5539 	switch (cmd) {
5540 	case IPC_INFO:
5541 	case MSG_INFO:
5542 		/* No specific object, just general system-wide information. */
5543 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
5544 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
5545 	case IPC_STAT:
5546 	case MSG_STAT:
5547 		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
5548 		break;
5549 	case IPC_SET:
5550 		perms = MSGQ__SETATTR;
5551 		break;
5552 	case IPC_RMID:
5553 		perms = MSGQ__DESTROY;
5554 		break;
5555 	default:
5556 		return 0;
5557 	}
5558 
5559 	err = ipc_has_perm(&msq->q_perm, perms);
5560 	return err;
5561 }
5562 
5563 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
5564 {
5565 	struct ipc_security_struct *isec;
5566 	struct msg_security_struct *msec;
5567 	struct common_audit_data ad;
5568 	u32 sid = current_sid();
5569 	int rc;
5570 
5571 	isec = msq->q_perm.security;
5572 	msec = msg->security;
5573 
5574 	/*
5575 	 * First time through, need to assign label to the message
5576 	 */
5577 	if (msec->sid == SECINITSID_UNLABELED) {
5578 		/*
5579 		 * Compute new sid based on current process and
5580 		 * message queue this message will be stored in
5581 		 */
5582 		rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
5583 					     NULL, &msec->sid);
5584 		if (rc)
5585 			return rc;
5586 	}
5587 
5588 	ad.type = LSM_AUDIT_DATA_IPC;
5589 	ad.u.ipc_id = msq->q_perm.key;
5590 
5591 	/* Can this process write to the queue? */
5592 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5593 			  MSGQ__WRITE, &ad);
5594 	if (!rc)
5595 		/* Can this process send the message */
5596 		rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
5597 				  MSG__SEND, &ad);
5598 	if (!rc)
5599 		/* Can the message be put in the queue? */
5600 		rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
5601 				  MSGQ__ENQUEUE, &ad);
5602 
5603 	return rc;
5604 }
5605 
5606 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
5607 				    struct task_struct *target,
5608 				    long type, int mode)
5609 {
5610 	struct ipc_security_struct *isec;
5611 	struct msg_security_struct *msec;
5612 	struct common_audit_data ad;
5613 	u32 sid = task_sid(target);
5614 	int rc;
5615 
5616 	isec = msq->q_perm.security;
5617 	msec = msg->security;
5618 
5619 	ad.type = LSM_AUDIT_DATA_IPC;
5620 	ad.u.ipc_id = msq->q_perm.key;
5621 
5622 	rc = avc_has_perm(sid, isec->sid,
5623 			  SECCLASS_MSGQ, MSGQ__READ, &ad);
5624 	if (!rc)
5625 		rc = avc_has_perm(sid, msec->sid,
5626 				  SECCLASS_MSG, MSG__RECEIVE, &ad);
5627 	return rc;
5628 }
5629 
5630 /* Shared Memory security operations */
5631 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
5632 {
5633 	struct ipc_security_struct *isec;
5634 	struct common_audit_data ad;
5635 	u32 sid = current_sid();
5636 	int rc;
5637 
5638 	rc = ipc_alloc_security(&shp->shm_perm, SECCLASS_SHM);
5639 	if (rc)
5640 		return rc;
5641 
5642 	isec = shp->shm_perm.security;
5643 
5644 	ad.type = LSM_AUDIT_DATA_IPC;
5645 	ad.u.ipc_id = shp->shm_perm.key;
5646 
5647 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5648 			  SHM__CREATE, &ad);
5649 	if (rc) {
5650 		ipc_free_security(&shp->shm_perm);
5651 		return rc;
5652 	}
5653 	return 0;
5654 }
5655 
5656 static void selinux_shm_free_security(struct shmid_kernel *shp)
5657 {
5658 	ipc_free_security(&shp->shm_perm);
5659 }
5660 
5661 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
5662 {
5663 	struct ipc_security_struct *isec;
5664 	struct common_audit_data ad;
5665 	u32 sid = current_sid();
5666 
5667 	isec = shp->shm_perm.security;
5668 
5669 	ad.type = LSM_AUDIT_DATA_IPC;
5670 	ad.u.ipc_id = shp->shm_perm.key;
5671 
5672 	return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5673 			    SHM__ASSOCIATE, &ad);
5674 }
5675 
5676 /* Note, at this point, shp is locked down */
5677 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5678 {
5679 	int perms;
5680 	int err;
5681 
5682 	switch (cmd) {
5683 	case IPC_INFO:
5684 	case SHM_INFO:
5685 		/* No specific object, just general system-wide information. */
5686 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
5687 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
5688 	case IPC_STAT:
5689 	case SHM_STAT:
5690 		perms = SHM__GETATTR | SHM__ASSOCIATE;
5691 		break;
5692 	case IPC_SET:
5693 		perms = SHM__SETATTR;
5694 		break;
5695 	case SHM_LOCK:
5696 	case SHM_UNLOCK:
5697 		perms = SHM__LOCK;
5698 		break;
5699 	case IPC_RMID:
5700 		perms = SHM__DESTROY;
5701 		break;
5702 	default:
5703 		return 0;
5704 	}
5705 
5706 	err = ipc_has_perm(&shp->shm_perm, perms);
5707 	return err;
5708 }
5709 
5710 static int selinux_shm_shmat(struct shmid_kernel *shp,
5711 			     char __user *shmaddr, int shmflg)
5712 {
5713 	u32 perms;
5714 
5715 	if (shmflg & SHM_RDONLY)
5716 		perms = SHM__READ;
5717 	else
5718 		perms = SHM__READ | SHM__WRITE;
5719 
5720 	return ipc_has_perm(&shp->shm_perm, perms);
5721 }
5722 
5723 /* Semaphore security operations */
5724 static int selinux_sem_alloc_security(struct sem_array *sma)
5725 {
5726 	struct ipc_security_struct *isec;
5727 	struct common_audit_data ad;
5728 	u32 sid = current_sid();
5729 	int rc;
5730 
5731 	rc = ipc_alloc_security(&sma->sem_perm, SECCLASS_SEM);
5732 	if (rc)
5733 		return rc;
5734 
5735 	isec = sma->sem_perm.security;
5736 
5737 	ad.type = LSM_AUDIT_DATA_IPC;
5738 	ad.u.ipc_id = sma->sem_perm.key;
5739 
5740 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5741 			  SEM__CREATE, &ad);
5742 	if (rc) {
5743 		ipc_free_security(&sma->sem_perm);
5744 		return rc;
5745 	}
5746 	return 0;
5747 }
5748 
5749 static void selinux_sem_free_security(struct sem_array *sma)
5750 {
5751 	ipc_free_security(&sma->sem_perm);
5752 }
5753 
5754 static int selinux_sem_associate(struct sem_array *sma, int semflg)
5755 {
5756 	struct ipc_security_struct *isec;
5757 	struct common_audit_data ad;
5758 	u32 sid = current_sid();
5759 
5760 	isec = sma->sem_perm.security;
5761 
5762 	ad.type = LSM_AUDIT_DATA_IPC;
5763 	ad.u.ipc_id = sma->sem_perm.key;
5764 
5765 	return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5766 			    SEM__ASSOCIATE, &ad);
5767 }
5768 
5769 /* Note, at this point, sma is locked down */
5770 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5771 {
5772 	int err;
5773 	u32 perms;
5774 
5775 	switch (cmd) {
5776 	case IPC_INFO:
5777 	case SEM_INFO:
5778 		/* No specific object, just general system-wide information. */
5779 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
5780 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
5781 	case GETPID:
5782 	case GETNCNT:
5783 	case GETZCNT:
5784 		perms = SEM__GETATTR;
5785 		break;
5786 	case GETVAL:
5787 	case GETALL:
5788 		perms = SEM__READ;
5789 		break;
5790 	case SETVAL:
5791 	case SETALL:
5792 		perms = SEM__WRITE;
5793 		break;
5794 	case IPC_RMID:
5795 		perms = SEM__DESTROY;
5796 		break;
5797 	case IPC_SET:
5798 		perms = SEM__SETATTR;
5799 		break;
5800 	case IPC_STAT:
5801 	case SEM_STAT:
5802 		perms = SEM__GETATTR | SEM__ASSOCIATE;
5803 		break;
5804 	default:
5805 		return 0;
5806 	}
5807 
5808 	err = ipc_has_perm(&sma->sem_perm, perms);
5809 	return err;
5810 }
5811 
5812 static int selinux_sem_semop(struct sem_array *sma,
5813 			     struct sembuf *sops, unsigned nsops, int alter)
5814 {
5815 	u32 perms;
5816 
5817 	if (alter)
5818 		perms = SEM__READ | SEM__WRITE;
5819 	else
5820 		perms = SEM__READ;
5821 
5822 	return ipc_has_perm(&sma->sem_perm, perms);
5823 }
5824 
5825 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5826 {
5827 	u32 av = 0;
5828 
5829 	av = 0;
5830 	if (flag & S_IRUGO)
5831 		av |= IPC__UNIX_READ;
5832 	if (flag & S_IWUGO)
5833 		av |= IPC__UNIX_WRITE;
5834 
5835 	if (av == 0)
5836 		return 0;
5837 
5838 	return ipc_has_perm(ipcp, av);
5839 }
5840 
5841 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5842 {
5843 	struct ipc_security_struct *isec = ipcp->security;
5844 	*secid = isec->sid;
5845 }
5846 
5847 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5848 {
5849 	if (inode)
5850 		inode_doinit_with_dentry(inode, dentry);
5851 }
5852 
5853 static int selinux_getprocattr(struct task_struct *p,
5854 			       char *name, char **value)
5855 {
5856 	const struct task_security_struct *__tsec;
5857 	u32 sid;
5858 	int error;
5859 	unsigned len;
5860 
5861 	rcu_read_lock();
5862 	__tsec = __task_cred(p)->security;
5863 
5864 	if (current != p) {
5865 		error = avc_has_perm(current_sid(), __tsec->sid,
5866 				     SECCLASS_PROCESS, PROCESS__GETATTR, NULL);
5867 		if (error)
5868 			goto bad;
5869 	}
5870 
5871 	if (!strcmp(name, "current"))
5872 		sid = __tsec->sid;
5873 	else if (!strcmp(name, "prev"))
5874 		sid = __tsec->osid;
5875 	else if (!strcmp(name, "exec"))
5876 		sid = __tsec->exec_sid;
5877 	else if (!strcmp(name, "fscreate"))
5878 		sid = __tsec->create_sid;
5879 	else if (!strcmp(name, "keycreate"))
5880 		sid = __tsec->keycreate_sid;
5881 	else if (!strcmp(name, "sockcreate"))
5882 		sid = __tsec->sockcreate_sid;
5883 	else {
5884 		error = -EINVAL;
5885 		goto bad;
5886 	}
5887 	rcu_read_unlock();
5888 
5889 	if (!sid)
5890 		return 0;
5891 
5892 	error = security_sid_to_context(sid, value, &len);
5893 	if (error)
5894 		return error;
5895 	return len;
5896 
5897 bad:
5898 	rcu_read_unlock();
5899 	return error;
5900 }
5901 
5902 static int selinux_setprocattr(const char *name, void *value, size_t size)
5903 {
5904 	struct task_security_struct *tsec;
5905 	struct cred *new;
5906 	u32 mysid = current_sid(), sid = 0, ptsid;
5907 	int error;
5908 	char *str = value;
5909 
5910 	/*
5911 	 * Basic control over ability to set these attributes at all.
5912 	 */
5913 	if (!strcmp(name, "exec"))
5914 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
5915 				     PROCESS__SETEXEC, NULL);
5916 	else if (!strcmp(name, "fscreate"))
5917 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
5918 				     PROCESS__SETFSCREATE, NULL);
5919 	else if (!strcmp(name, "keycreate"))
5920 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
5921 				     PROCESS__SETKEYCREATE, NULL);
5922 	else if (!strcmp(name, "sockcreate"))
5923 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
5924 				     PROCESS__SETSOCKCREATE, NULL);
5925 	else if (!strcmp(name, "current"))
5926 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
5927 				     PROCESS__SETCURRENT, NULL);
5928 	else
5929 		error = -EINVAL;
5930 	if (error)
5931 		return error;
5932 
5933 	/* Obtain a SID for the context, if one was specified. */
5934 	if (size && str[0] && str[0] != '\n') {
5935 		if (str[size-1] == '\n') {
5936 			str[size-1] = 0;
5937 			size--;
5938 		}
5939 		error = security_context_to_sid(value, size, &sid, GFP_KERNEL);
5940 		if (error == -EINVAL && !strcmp(name, "fscreate")) {
5941 			if (!has_cap_mac_admin(true)) {
5942 				struct audit_buffer *ab;
5943 				size_t audit_size;
5944 
5945 				/* We strip a nul only if it is at the end, otherwise the
5946 				 * context contains a nul and we should audit that */
5947 				if (str[size - 1] == '\0')
5948 					audit_size = size - 1;
5949 				else
5950 					audit_size = size;
5951 				ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
5952 				audit_log_format(ab, "op=fscreate invalid_context=");
5953 				audit_log_n_untrustedstring(ab, value, audit_size);
5954 				audit_log_end(ab);
5955 
5956 				return error;
5957 			}
5958 			error = security_context_to_sid_force(value, size,
5959 							      &sid);
5960 		}
5961 		if (error)
5962 			return error;
5963 	}
5964 
5965 	new = prepare_creds();
5966 	if (!new)
5967 		return -ENOMEM;
5968 
5969 	/* Permission checking based on the specified context is
5970 	   performed during the actual operation (execve,
5971 	   open/mkdir/...), when we know the full context of the
5972 	   operation.  See selinux_bprm_set_creds for the execve
5973 	   checks and may_create for the file creation checks. The
5974 	   operation will then fail if the context is not permitted. */
5975 	tsec = new->security;
5976 	if (!strcmp(name, "exec")) {
5977 		tsec->exec_sid = sid;
5978 	} else if (!strcmp(name, "fscreate")) {
5979 		tsec->create_sid = sid;
5980 	} else if (!strcmp(name, "keycreate")) {
5981 		error = avc_has_perm(mysid, sid, SECCLASS_KEY, KEY__CREATE,
5982 				     NULL);
5983 		if (error)
5984 			goto abort_change;
5985 		tsec->keycreate_sid = sid;
5986 	} else if (!strcmp(name, "sockcreate")) {
5987 		tsec->sockcreate_sid = sid;
5988 	} else if (!strcmp(name, "current")) {
5989 		error = -EINVAL;
5990 		if (sid == 0)
5991 			goto abort_change;
5992 
5993 		/* Only allow single threaded processes to change context */
5994 		error = -EPERM;
5995 		if (!current_is_single_threaded()) {
5996 			error = security_bounded_transition(tsec->sid, sid);
5997 			if (error)
5998 				goto abort_change;
5999 		}
6000 
6001 		/* Check permissions for the transition. */
6002 		error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
6003 				     PROCESS__DYNTRANSITION, NULL);
6004 		if (error)
6005 			goto abort_change;
6006 
6007 		/* Check for ptracing, and update the task SID if ok.
6008 		   Otherwise, leave SID unchanged and fail. */
6009 		ptsid = ptrace_parent_sid();
6010 		if (ptsid != 0) {
6011 			error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
6012 					     PROCESS__PTRACE, NULL);
6013 			if (error)
6014 				goto abort_change;
6015 		}
6016 
6017 		tsec->sid = sid;
6018 	} else {
6019 		error = -EINVAL;
6020 		goto abort_change;
6021 	}
6022 
6023 	commit_creds(new);
6024 	return size;
6025 
6026 abort_change:
6027 	abort_creds(new);
6028 	return error;
6029 }
6030 
6031 static int selinux_ismaclabel(const char *name)
6032 {
6033 	return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
6034 }
6035 
6036 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
6037 {
6038 	return security_sid_to_context(secid, secdata, seclen);
6039 }
6040 
6041 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
6042 {
6043 	return security_context_to_sid(secdata, seclen, secid, GFP_KERNEL);
6044 }
6045 
6046 static void selinux_release_secctx(char *secdata, u32 seclen)
6047 {
6048 	kfree(secdata);
6049 }
6050 
6051 static void selinux_inode_invalidate_secctx(struct inode *inode)
6052 {
6053 	struct inode_security_struct *isec = inode->i_security;
6054 
6055 	spin_lock(&isec->lock);
6056 	isec->initialized = LABEL_INVALID;
6057 	spin_unlock(&isec->lock);
6058 }
6059 
6060 /*
6061  *	called with inode->i_mutex locked
6062  */
6063 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
6064 {
6065 	return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
6066 }
6067 
6068 /*
6069  *	called with inode->i_mutex locked
6070  */
6071 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
6072 {
6073 	return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
6074 }
6075 
6076 static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
6077 {
6078 	int len = 0;
6079 	len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
6080 						ctx, true);
6081 	if (len < 0)
6082 		return len;
6083 	*ctxlen = len;
6084 	return 0;
6085 }
6086 #ifdef CONFIG_KEYS
6087 
6088 static int selinux_key_alloc(struct key *k, const struct cred *cred,
6089 			     unsigned long flags)
6090 {
6091 	const struct task_security_struct *tsec;
6092 	struct key_security_struct *ksec;
6093 
6094 	ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
6095 	if (!ksec)
6096 		return -ENOMEM;
6097 
6098 	tsec = cred->security;
6099 	if (tsec->keycreate_sid)
6100 		ksec->sid = tsec->keycreate_sid;
6101 	else
6102 		ksec->sid = tsec->sid;
6103 
6104 	k->security = ksec;
6105 	return 0;
6106 }
6107 
6108 static void selinux_key_free(struct key *k)
6109 {
6110 	struct key_security_struct *ksec = k->security;
6111 
6112 	k->security = NULL;
6113 	kfree(ksec);
6114 }
6115 
6116 static int selinux_key_permission(key_ref_t key_ref,
6117 				  const struct cred *cred,
6118 				  unsigned perm)
6119 {
6120 	struct key *key;
6121 	struct key_security_struct *ksec;
6122 	u32 sid;
6123 
6124 	/* if no specific permissions are requested, we skip the
6125 	   permission check. No serious, additional covert channels
6126 	   appear to be created. */
6127 	if (perm == 0)
6128 		return 0;
6129 
6130 	sid = cred_sid(cred);
6131 
6132 	key = key_ref_to_ptr(key_ref);
6133 	ksec = key->security;
6134 
6135 	return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
6136 }
6137 
6138 static int selinux_key_getsecurity(struct key *key, char **_buffer)
6139 {
6140 	struct key_security_struct *ksec = key->security;
6141 	char *context = NULL;
6142 	unsigned len;
6143 	int rc;
6144 
6145 	rc = security_sid_to_context(ksec->sid, &context, &len);
6146 	if (!rc)
6147 		rc = len;
6148 	*_buffer = context;
6149 	return rc;
6150 }
6151 
6152 #endif
6153 
6154 static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
6155 	LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
6156 	LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
6157 	LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder),
6158 	LSM_HOOK_INIT(binder_transfer_file, selinux_binder_transfer_file),
6159 
6160 	LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check),
6161 	LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme),
6162 	LSM_HOOK_INIT(capget, selinux_capget),
6163 	LSM_HOOK_INIT(capset, selinux_capset),
6164 	LSM_HOOK_INIT(capable, selinux_capable),
6165 	LSM_HOOK_INIT(quotactl, selinux_quotactl),
6166 	LSM_HOOK_INIT(quota_on, selinux_quota_on),
6167 	LSM_HOOK_INIT(syslog, selinux_syslog),
6168 	LSM_HOOK_INIT(vm_enough_memory, selinux_vm_enough_memory),
6169 
6170 	LSM_HOOK_INIT(netlink_send, selinux_netlink_send),
6171 
6172 	LSM_HOOK_INIT(bprm_set_creds, selinux_bprm_set_creds),
6173 	LSM_HOOK_INIT(bprm_committing_creds, selinux_bprm_committing_creds),
6174 	LSM_HOOK_INIT(bprm_committed_creds, selinux_bprm_committed_creds),
6175 	LSM_HOOK_INIT(bprm_secureexec, selinux_bprm_secureexec),
6176 
6177 	LSM_HOOK_INIT(sb_alloc_security, selinux_sb_alloc_security),
6178 	LSM_HOOK_INIT(sb_free_security, selinux_sb_free_security),
6179 	LSM_HOOK_INIT(sb_copy_data, selinux_sb_copy_data),
6180 	LSM_HOOK_INIT(sb_remount, selinux_sb_remount),
6181 	LSM_HOOK_INIT(sb_kern_mount, selinux_sb_kern_mount),
6182 	LSM_HOOK_INIT(sb_show_options, selinux_sb_show_options),
6183 	LSM_HOOK_INIT(sb_statfs, selinux_sb_statfs),
6184 	LSM_HOOK_INIT(sb_mount, selinux_mount),
6185 	LSM_HOOK_INIT(sb_umount, selinux_umount),
6186 	LSM_HOOK_INIT(sb_set_mnt_opts, selinux_set_mnt_opts),
6187 	LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts),
6188 	LSM_HOOK_INIT(sb_parse_opts_str, selinux_parse_opts_str),
6189 
6190 	LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security),
6191 	LSM_HOOK_INIT(dentry_create_files_as, selinux_dentry_create_files_as),
6192 
6193 	LSM_HOOK_INIT(inode_alloc_security, selinux_inode_alloc_security),
6194 	LSM_HOOK_INIT(inode_free_security, selinux_inode_free_security),
6195 	LSM_HOOK_INIT(inode_init_security, selinux_inode_init_security),
6196 	LSM_HOOK_INIT(inode_create, selinux_inode_create),
6197 	LSM_HOOK_INIT(inode_link, selinux_inode_link),
6198 	LSM_HOOK_INIT(inode_unlink, selinux_inode_unlink),
6199 	LSM_HOOK_INIT(inode_symlink, selinux_inode_symlink),
6200 	LSM_HOOK_INIT(inode_mkdir, selinux_inode_mkdir),
6201 	LSM_HOOK_INIT(inode_rmdir, selinux_inode_rmdir),
6202 	LSM_HOOK_INIT(inode_mknod, selinux_inode_mknod),
6203 	LSM_HOOK_INIT(inode_rename, selinux_inode_rename),
6204 	LSM_HOOK_INIT(inode_readlink, selinux_inode_readlink),
6205 	LSM_HOOK_INIT(inode_follow_link, selinux_inode_follow_link),
6206 	LSM_HOOK_INIT(inode_permission, selinux_inode_permission),
6207 	LSM_HOOK_INIT(inode_setattr, selinux_inode_setattr),
6208 	LSM_HOOK_INIT(inode_getattr, selinux_inode_getattr),
6209 	LSM_HOOK_INIT(inode_setxattr, selinux_inode_setxattr),
6210 	LSM_HOOK_INIT(inode_post_setxattr, selinux_inode_post_setxattr),
6211 	LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr),
6212 	LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr),
6213 	LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr),
6214 	LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
6215 	LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
6216 	LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
6217 	LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
6218 	LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
6219 	LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
6220 
6221 	LSM_HOOK_INIT(file_permission, selinux_file_permission),
6222 	LSM_HOOK_INIT(file_alloc_security, selinux_file_alloc_security),
6223 	LSM_HOOK_INIT(file_free_security, selinux_file_free_security),
6224 	LSM_HOOK_INIT(file_ioctl, selinux_file_ioctl),
6225 	LSM_HOOK_INIT(mmap_file, selinux_mmap_file),
6226 	LSM_HOOK_INIT(mmap_addr, selinux_mmap_addr),
6227 	LSM_HOOK_INIT(file_mprotect, selinux_file_mprotect),
6228 	LSM_HOOK_INIT(file_lock, selinux_file_lock),
6229 	LSM_HOOK_INIT(file_fcntl, selinux_file_fcntl),
6230 	LSM_HOOK_INIT(file_set_fowner, selinux_file_set_fowner),
6231 	LSM_HOOK_INIT(file_send_sigiotask, selinux_file_send_sigiotask),
6232 	LSM_HOOK_INIT(file_receive, selinux_file_receive),
6233 
6234 	LSM_HOOK_INIT(file_open, selinux_file_open),
6235 
6236 	LSM_HOOK_INIT(task_alloc, selinux_task_alloc),
6237 	LSM_HOOK_INIT(cred_alloc_blank, selinux_cred_alloc_blank),
6238 	LSM_HOOK_INIT(cred_free, selinux_cred_free),
6239 	LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
6240 	LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
6241 	LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
6242 	LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
6243 	LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
6244 	LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file),
6245 	LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid),
6246 	LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid),
6247 	LSM_HOOK_INIT(task_getsid, selinux_task_getsid),
6248 	LSM_HOOK_INIT(task_getsecid, selinux_task_getsecid),
6249 	LSM_HOOK_INIT(task_setnice, selinux_task_setnice),
6250 	LSM_HOOK_INIT(task_setioprio, selinux_task_setioprio),
6251 	LSM_HOOK_INIT(task_getioprio, selinux_task_getioprio),
6252 	LSM_HOOK_INIT(task_prlimit, selinux_task_prlimit),
6253 	LSM_HOOK_INIT(task_setrlimit, selinux_task_setrlimit),
6254 	LSM_HOOK_INIT(task_setscheduler, selinux_task_setscheduler),
6255 	LSM_HOOK_INIT(task_getscheduler, selinux_task_getscheduler),
6256 	LSM_HOOK_INIT(task_movememory, selinux_task_movememory),
6257 	LSM_HOOK_INIT(task_kill, selinux_task_kill),
6258 	LSM_HOOK_INIT(task_to_inode, selinux_task_to_inode),
6259 
6260 	LSM_HOOK_INIT(ipc_permission, selinux_ipc_permission),
6261 	LSM_HOOK_INIT(ipc_getsecid, selinux_ipc_getsecid),
6262 
6263 	LSM_HOOK_INIT(msg_msg_alloc_security, selinux_msg_msg_alloc_security),
6264 	LSM_HOOK_INIT(msg_msg_free_security, selinux_msg_msg_free_security),
6265 
6266 	LSM_HOOK_INIT(msg_queue_alloc_security,
6267 			selinux_msg_queue_alloc_security),
6268 	LSM_HOOK_INIT(msg_queue_free_security, selinux_msg_queue_free_security),
6269 	LSM_HOOK_INIT(msg_queue_associate, selinux_msg_queue_associate),
6270 	LSM_HOOK_INIT(msg_queue_msgctl, selinux_msg_queue_msgctl),
6271 	LSM_HOOK_INIT(msg_queue_msgsnd, selinux_msg_queue_msgsnd),
6272 	LSM_HOOK_INIT(msg_queue_msgrcv, selinux_msg_queue_msgrcv),
6273 
6274 	LSM_HOOK_INIT(shm_alloc_security, selinux_shm_alloc_security),
6275 	LSM_HOOK_INIT(shm_free_security, selinux_shm_free_security),
6276 	LSM_HOOK_INIT(shm_associate, selinux_shm_associate),
6277 	LSM_HOOK_INIT(shm_shmctl, selinux_shm_shmctl),
6278 	LSM_HOOK_INIT(shm_shmat, selinux_shm_shmat),
6279 
6280 	LSM_HOOK_INIT(sem_alloc_security, selinux_sem_alloc_security),
6281 	LSM_HOOK_INIT(sem_free_security, selinux_sem_free_security),
6282 	LSM_HOOK_INIT(sem_associate, selinux_sem_associate),
6283 	LSM_HOOK_INIT(sem_semctl, selinux_sem_semctl),
6284 	LSM_HOOK_INIT(sem_semop, selinux_sem_semop),
6285 
6286 	LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate),
6287 
6288 	LSM_HOOK_INIT(getprocattr, selinux_getprocattr),
6289 	LSM_HOOK_INIT(setprocattr, selinux_setprocattr),
6290 
6291 	LSM_HOOK_INIT(ismaclabel, selinux_ismaclabel),
6292 	LSM_HOOK_INIT(secid_to_secctx, selinux_secid_to_secctx),
6293 	LSM_HOOK_INIT(secctx_to_secid, selinux_secctx_to_secid),
6294 	LSM_HOOK_INIT(release_secctx, selinux_release_secctx),
6295 	LSM_HOOK_INIT(inode_invalidate_secctx, selinux_inode_invalidate_secctx),
6296 	LSM_HOOK_INIT(inode_notifysecctx, selinux_inode_notifysecctx),
6297 	LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx),
6298 	LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx),
6299 
6300 	LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect),
6301 	LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send),
6302 
6303 	LSM_HOOK_INIT(socket_create, selinux_socket_create),
6304 	LSM_HOOK_INIT(socket_post_create, selinux_socket_post_create),
6305 	LSM_HOOK_INIT(socket_bind, selinux_socket_bind),
6306 	LSM_HOOK_INIT(socket_connect, selinux_socket_connect),
6307 	LSM_HOOK_INIT(socket_listen, selinux_socket_listen),
6308 	LSM_HOOK_INIT(socket_accept, selinux_socket_accept),
6309 	LSM_HOOK_INIT(socket_sendmsg, selinux_socket_sendmsg),
6310 	LSM_HOOK_INIT(socket_recvmsg, selinux_socket_recvmsg),
6311 	LSM_HOOK_INIT(socket_getsockname, selinux_socket_getsockname),
6312 	LSM_HOOK_INIT(socket_getpeername, selinux_socket_getpeername),
6313 	LSM_HOOK_INIT(socket_getsockopt, selinux_socket_getsockopt),
6314 	LSM_HOOK_INIT(socket_setsockopt, selinux_socket_setsockopt),
6315 	LSM_HOOK_INIT(socket_shutdown, selinux_socket_shutdown),
6316 	LSM_HOOK_INIT(socket_sock_rcv_skb, selinux_socket_sock_rcv_skb),
6317 	LSM_HOOK_INIT(socket_getpeersec_stream,
6318 			selinux_socket_getpeersec_stream),
6319 	LSM_HOOK_INIT(socket_getpeersec_dgram, selinux_socket_getpeersec_dgram),
6320 	LSM_HOOK_INIT(sk_alloc_security, selinux_sk_alloc_security),
6321 	LSM_HOOK_INIT(sk_free_security, selinux_sk_free_security),
6322 	LSM_HOOK_INIT(sk_clone_security, selinux_sk_clone_security),
6323 	LSM_HOOK_INIT(sk_getsecid, selinux_sk_getsecid),
6324 	LSM_HOOK_INIT(sock_graft, selinux_sock_graft),
6325 	LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
6326 	LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
6327 	LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
6328 	LSM_HOOK_INIT(secmark_relabel_packet, selinux_secmark_relabel_packet),
6329 	LSM_HOOK_INIT(secmark_refcount_inc, selinux_secmark_refcount_inc),
6330 	LSM_HOOK_INIT(secmark_refcount_dec, selinux_secmark_refcount_dec),
6331 	LSM_HOOK_INIT(req_classify_flow, selinux_req_classify_flow),
6332 	LSM_HOOK_INIT(tun_dev_alloc_security, selinux_tun_dev_alloc_security),
6333 	LSM_HOOK_INIT(tun_dev_free_security, selinux_tun_dev_free_security),
6334 	LSM_HOOK_INIT(tun_dev_create, selinux_tun_dev_create),
6335 	LSM_HOOK_INIT(tun_dev_attach_queue, selinux_tun_dev_attach_queue),
6336 	LSM_HOOK_INIT(tun_dev_attach, selinux_tun_dev_attach),
6337 	LSM_HOOK_INIT(tun_dev_open, selinux_tun_dev_open),
6338 
6339 #ifdef CONFIG_SECURITY_NETWORK_XFRM
6340 	LSM_HOOK_INIT(xfrm_policy_alloc_security, selinux_xfrm_policy_alloc),
6341 	LSM_HOOK_INIT(xfrm_policy_clone_security, selinux_xfrm_policy_clone),
6342 	LSM_HOOK_INIT(xfrm_policy_free_security, selinux_xfrm_policy_free),
6343 	LSM_HOOK_INIT(xfrm_policy_delete_security, selinux_xfrm_policy_delete),
6344 	LSM_HOOK_INIT(xfrm_state_alloc, selinux_xfrm_state_alloc),
6345 	LSM_HOOK_INIT(xfrm_state_alloc_acquire,
6346 			selinux_xfrm_state_alloc_acquire),
6347 	LSM_HOOK_INIT(xfrm_state_free_security, selinux_xfrm_state_free),
6348 	LSM_HOOK_INIT(xfrm_state_delete_security, selinux_xfrm_state_delete),
6349 	LSM_HOOK_INIT(xfrm_policy_lookup, selinux_xfrm_policy_lookup),
6350 	LSM_HOOK_INIT(xfrm_state_pol_flow_match,
6351 			selinux_xfrm_state_pol_flow_match),
6352 	LSM_HOOK_INIT(xfrm_decode_session, selinux_xfrm_decode_session),
6353 #endif
6354 
6355 #ifdef CONFIG_KEYS
6356 	LSM_HOOK_INIT(key_alloc, selinux_key_alloc),
6357 	LSM_HOOK_INIT(key_free, selinux_key_free),
6358 	LSM_HOOK_INIT(key_permission, selinux_key_permission),
6359 	LSM_HOOK_INIT(key_getsecurity, selinux_key_getsecurity),
6360 #endif
6361 
6362 #ifdef CONFIG_AUDIT
6363 	LSM_HOOK_INIT(audit_rule_init, selinux_audit_rule_init),
6364 	LSM_HOOK_INIT(audit_rule_known, selinux_audit_rule_known),
6365 	LSM_HOOK_INIT(audit_rule_match, selinux_audit_rule_match),
6366 	LSM_HOOK_INIT(audit_rule_free, selinux_audit_rule_free),
6367 #endif
6368 };
6369 
6370 static __init int selinux_init(void)
6371 {
6372 	if (!security_module_enable("selinux")) {
6373 		selinux_enabled = 0;
6374 		return 0;
6375 	}
6376 
6377 	if (!selinux_enabled) {
6378 		printk(KERN_INFO "SELinux:  Disabled at boot.\n");
6379 		return 0;
6380 	}
6381 
6382 	printk(KERN_INFO "SELinux:  Initializing.\n");
6383 
6384 	/* Set the security state for the initial task. */
6385 	cred_init_security();
6386 
6387 	default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
6388 
6389 	sel_inode_cache = kmem_cache_create("selinux_inode_security",
6390 					    sizeof(struct inode_security_struct),
6391 					    0, SLAB_PANIC, NULL);
6392 	file_security_cache = kmem_cache_create("selinux_file_security",
6393 					    sizeof(struct file_security_struct),
6394 					    0, SLAB_PANIC, NULL);
6395 	avc_init();
6396 
6397 	security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux");
6398 
6399 	if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
6400 		panic("SELinux: Unable to register AVC netcache callback\n");
6401 
6402 	if (selinux_enforcing)
6403 		printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
6404 	else
6405 		printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
6406 
6407 	return 0;
6408 }
6409 
6410 static void delayed_superblock_init(struct super_block *sb, void *unused)
6411 {
6412 	superblock_doinit(sb, NULL);
6413 }
6414 
6415 void selinux_complete_init(void)
6416 {
6417 	printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
6418 
6419 	/* Set up any superblocks initialized prior to the policy load. */
6420 	printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
6421 	iterate_supers(delayed_superblock_init, NULL);
6422 }
6423 
6424 /* SELinux requires early initialization in order to label
6425    all processes and objects when they are created. */
6426 security_initcall(selinux_init);
6427 
6428 #if defined(CONFIG_NETFILTER)
6429 
6430 static struct nf_hook_ops selinux_nf_ops[] = {
6431 	{
6432 		.hook =		selinux_ipv4_postroute,
6433 		.pf =		NFPROTO_IPV4,
6434 		.hooknum =	NF_INET_POST_ROUTING,
6435 		.priority =	NF_IP_PRI_SELINUX_LAST,
6436 	},
6437 	{
6438 		.hook =		selinux_ipv4_forward,
6439 		.pf =		NFPROTO_IPV4,
6440 		.hooknum =	NF_INET_FORWARD,
6441 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6442 	},
6443 	{
6444 		.hook =		selinux_ipv4_output,
6445 		.pf =		NFPROTO_IPV4,
6446 		.hooknum =	NF_INET_LOCAL_OUT,
6447 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6448 	},
6449 #if IS_ENABLED(CONFIG_IPV6)
6450 	{
6451 		.hook =		selinux_ipv6_postroute,
6452 		.pf =		NFPROTO_IPV6,
6453 		.hooknum =	NF_INET_POST_ROUTING,
6454 		.priority =	NF_IP6_PRI_SELINUX_LAST,
6455 	},
6456 	{
6457 		.hook =		selinux_ipv6_forward,
6458 		.pf =		NFPROTO_IPV6,
6459 		.hooknum =	NF_INET_FORWARD,
6460 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
6461 	},
6462 	{
6463 		.hook =		selinux_ipv6_output,
6464 		.pf =		NFPROTO_IPV6,
6465 		.hooknum =	NF_INET_LOCAL_OUT,
6466 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
6467 	},
6468 #endif	/* IPV6 */
6469 };
6470 
6471 static int __init selinux_nf_ip_init(void)
6472 {
6473 	int err;
6474 
6475 	if (!selinux_enabled)
6476 		return 0;
6477 
6478 	printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
6479 
6480 	err = nf_register_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6481 	if (err)
6482 		panic("SELinux: nf_register_hooks: error %d\n", err);
6483 
6484 	return 0;
6485 }
6486 
6487 __initcall(selinux_nf_ip_init);
6488 
6489 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6490 static void selinux_nf_ip_exit(void)
6491 {
6492 	printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
6493 
6494 	nf_unregister_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6495 }
6496 #endif
6497 
6498 #else /* CONFIG_NETFILTER */
6499 
6500 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6501 #define selinux_nf_ip_exit()
6502 #endif
6503 
6504 #endif /* CONFIG_NETFILTER */
6505 
6506 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6507 static int selinux_disabled;
6508 
6509 int selinux_disable(void)
6510 {
6511 	if (ss_initialized) {
6512 		/* Not permitted after initial policy load. */
6513 		return -EINVAL;
6514 	}
6515 
6516 	if (selinux_disabled) {
6517 		/* Only do this once. */
6518 		return -EINVAL;
6519 	}
6520 
6521 	printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
6522 
6523 	selinux_disabled = 1;
6524 	selinux_enabled = 0;
6525 
6526 	security_delete_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks));
6527 
6528 	/* Try to destroy the avc node cache */
6529 	avc_disable();
6530 
6531 	/* Unregister netfilter hooks. */
6532 	selinux_nf_ip_exit();
6533 
6534 	/* Unregister selinuxfs. */
6535 	exit_sel_fs();
6536 
6537 	return 0;
6538 }
6539 #endif
6540