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