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