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