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