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