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