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