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