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