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