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