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