xref: /openbmc/linux/security/selinux/hooks.c (revision 3583a71183a02c51ca71cd180e9189cfb0411cc1)
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) {
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(struct task_struct *parent,
1743 			  struct task_struct *child,
1744 			  unsigned int mode)
1745 {
1746 	int rc;
1747 
1748 	rc = secondary_ops->ptrace(parent, child, mode);
1749 	if (rc)
1750 		return rc;
1751 
1752 	if (mode == PTRACE_MODE_READ) {
1753 		struct task_security_struct *tsec = parent->security;
1754 		struct task_security_struct *csec = child->security;
1755 		return avc_has_perm(tsec->sid, csec->sid,
1756 				    SECCLASS_FILE, FILE__READ, NULL);
1757 	}
1758 
1759 	return task_has_perm(parent, child, PROCESS__PTRACE);
1760 }
1761 
1762 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1763 			  kernel_cap_t *inheritable, kernel_cap_t *permitted)
1764 {
1765 	int error;
1766 
1767 	error = task_has_perm(current, target, PROCESS__GETCAP);
1768 	if (error)
1769 		return error;
1770 
1771 	return secondary_ops->capget(target, effective, inheritable, permitted);
1772 }
1773 
1774 static int selinux_capset_check(struct task_struct *target, kernel_cap_t *effective,
1775 				kernel_cap_t *inheritable, kernel_cap_t *permitted)
1776 {
1777 	int error;
1778 
1779 	error = secondary_ops->capset_check(target, effective, inheritable, permitted);
1780 	if (error)
1781 		return error;
1782 
1783 	return task_has_perm(current, target, PROCESS__SETCAP);
1784 }
1785 
1786 static void selinux_capset_set(struct task_struct *target, kernel_cap_t *effective,
1787 			       kernel_cap_t *inheritable, kernel_cap_t *permitted)
1788 {
1789 	secondary_ops->capset_set(target, effective, inheritable, permitted);
1790 }
1791 
1792 static int selinux_capable(struct task_struct *tsk, int cap)
1793 {
1794 	int rc;
1795 
1796 	rc = secondary_ops->capable(tsk, cap);
1797 	if (rc)
1798 		return rc;
1799 
1800 	return task_has_capability(tsk, cap);
1801 }
1802 
1803 static int selinux_sysctl_get_sid(ctl_table *table, u16 tclass, u32 *sid)
1804 {
1805 	int buflen, rc;
1806 	char *buffer, *path, *end;
1807 
1808 	rc = -ENOMEM;
1809 	buffer = (char *)__get_free_page(GFP_KERNEL);
1810 	if (!buffer)
1811 		goto out;
1812 
1813 	buflen = PAGE_SIZE;
1814 	end = buffer+buflen;
1815 	*--end = '\0';
1816 	buflen--;
1817 	path = end-1;
1818 	*path = '/';
1819 	while (table) {
1820 		const char *name = table->procname;
1821 		size_t namelen = strlen(name);
1822 		buflen -= namelen + 1;
1823 		if (buflen < 0)
1824 			goto out_free;
1825 		end -= namelen;
1826 		memcpy(end, name, namelen);
1827 		*--end = '/';
1828 		path = end;
1829 		table = table->parent;
1830 	}
1831 	buflen -= 4;
1832 	if (buflen < 0)
1833 		goto out_free;
1834 	end -= 4;
1835 	memcpy(end, "/sys", 4);
1836 	path = end;
1837 	rc = security_genfs_sid("proc", path, tclass, sid);
1838 out_free:
1839 	free_page((unsigned long)buffer);
1840 out:
1841 	return rc;
1842 }
1843 
1844 static int selinux_sysctl(ctl_table *table, int op)
1845 {
1846 	int error = 0;
1847 	u32 av;
1848 	struct task_security_struct *tsec;
1849 	u32 tsid;
1850 	int rc;
1851 
1852 	rc = secondary_ops->sysctl(table, op);
1853 	if (rc)
1854 		return rc;
1855 
1856 	tsec = current->security;
1857 
1858 	rc = selinux_sysctl_get_sid(table, (op == 0001) ?
1859 				    SECCLASS_DIR : SECCLASS_FILE, &tsid);
1860 	if (rc) {
1861 		/* Default to the well-defined sysctl SID. */
1862 		tsid = SECINITSID_SYSCTL;
1863 	}
1864 
1865 	/* The op values are "defined" in sysctl.c, thereby creating
1866 	 * a bad coupling between this module and sysctl.c */
1867 	if (op == 001) {
1868 		error = avc_has_perm(tsec->sid, tsid,
1869 				     SECCLASS_DIR, DIR__SEARCH, NULL);
1870 	} else {
1871 		av = 0;
1872 		if (op & 004)
1873 			av |= FILE__READ;
1874 		if (op & 002)
1875 			av |= FILE__WRITE;
1876 		if (av)
1877 			error = avc_has_perm(tsec->sid, tsid,
1878 					     SECCLASS_FILE, av, NULL);
1879 	}
1880 
1881 	return error;
1882 }
1883 
1884 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1885 {
1886 	int rc = 0;
1887 
1888 	if (!sb)
1889 		return 0;
1890 
1891 	switch (cmds) {
1892 	case Q_SYNC:
1893 	case Q_QUOTAON:
1894 	case Q_QUOTAOFF:
1895 	case Q_SETINFO:
1896 	case Q_SETQUOTA:
1897 		rc = superblock_has_perm(current, sb, FILESYSTEM__QUOTAMOD,
1898 					 NULL);
1899 		break;
1900 	case Q_GETFMT:
1901 	case Q_GETINFO:
1902 	case Q_GETQUOTA:
1903 		rc = superblock_has_perm(current, sb, FILESYSTEM__QUOTAGET,
1904 					 NULL);
1905 		break;
1906 	default:
1907 		rc = 0;  /* let the kernel handle invalid cmds */
1908 		break;
1909 	}
1910 	return rc;
1911 }
1912 
1913 static int selinux_quota_on(struct dentry *dentry)
1914 {
1915 	return dentry_has_perm(current, NULL, dentry, FILE__QUOTAON);
1916 }
1917 
1918 static int selinux_syslog(int type)
1919 {
1920 	int rc;
1921 
1922 	rc = secondary_ops->syslog(type);
1923 	if (rc)
1924 		return rc;
1925 
1926 	switch (type) {
1927 	case 3:		/* Read last kernel messages */
1928 	case 10:	/* Return size of the log buffer */
1929 		rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1930 		break;
1931 	case 6:		/* Disable logging to console */
1932 	case 7:		/* Enable logging to console */
1933 	case 8:		/* Set level of messages printed to console */
1934 		rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1935 		break;
1936 	case 0:		/* Close log */
1937 	case 1:		/* Open log */
1938 	case 2:		/* Read from log */
1939 	case 4:		/* Read/clear last kernel messages */
1940 	case 5:		/* Clear ring buffer */
1941 	default:
1942 		rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1943 		break;
1944 	}
1945 	return rc;
1946 }
1947 
1948 /*
1949  * Check that a process has enough memory to allocate a new virtual
1950  * mapping. 0 means there is enough memory for the allocation to
1951  * succeed and -ENOMEM implies there is not.
1952  *
1953  * Note that secondary_ops->capable and task_has_perm_noaudit return 0
1954  * if the capability is granted, but __vm_enough_memory requires 1 if
1955  * the capability is granted.
1956  *
1957  * Do not audit the selinux permission check, as this is applied to all
1958  * processes that allocate mappings.
1959  */
1960 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
1961 {
1962 	int rc, cap_sys_admin = 0;
1963 	struct task_security_struct *tsec = current->security;
1964 
1965 	rc = secondary_ops->capable(current, CAP_SYS_ADMIN);
1966 	if (rc == 0)
1967 		rc = avc_has_perm_noaudit(tsec->sid, tsec->sid,
1968 					  SECCLASS_CAPABILITY,
1969 					  CAP_TO_MASK(CAP_SYS_ADMIN),
1970 					  0,
1971 					  NULL);
1972 
1973 	if (rc == 0)
1974 		cap_sys_admin = 1;
1975 
1976 	return __vm_enough_memory(mm, pages, cap_sys_admin);
1977 }
1978 
1979 /* binprm security operations */
1980 
1981 static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
1982 {
1983 	struct bprm_security_struct *bsec;
1984 
1985 	bsec = kzalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
1986 	if (!bsec)
1987 		return -ENOMEM;
1988 
1989 	bsec->sid = SECINITSID_UNLABELED;
1990 	bsec->set = 0;
1991 
1992 	bprm->security = bsec;
1993 	return 0;
1994 }
1995 
1996 static int selinux_bprm_set_security(struct linux_binprm *bprm)
1997 {
1998 	struct task_security_struct *tsec;
1999 	struct inode *inode = bprm->file->f_path.dentry->d_inode;
2000 	struct inode_security_struct *isec;
2001 	struct bprm_security_struct *bsec;
2002 	u32 newsid;
2003 	struct avc_audit_data ad;
2004 	int rc;
2005 
2006 	rc = secondary_ops->bprm_set_security(bprm);
2007 	if (rc)
2008 		return rc;
2009 
2010 	bsec = bprm->security;
2011 
2012 	if (bsec->set)
2013 		return 0;
2014 
2015 	tsec = current->security;
2016 	isec = inode->i_security;
2017 
2018 	/* Default to the current task SID. */
2019 	bsec->sid = tsec->sid;
2020 
2021 	/* Reset fs, key, and sock SIDs on execve. */
2022 	tsec->create_sid = 0;
2023 	tsec->keycreate_sid = 0;
2024 	tsec->sockcreate_sid = 0;
2025 
2026 	if (tsec->exec_sid) {
2027 		newsid = tsec->exec_sid;
2028 		/* Reset exec SID on execve. */
2029 		tsec->exec_sid = 0;
2030 	} else {
2031 		/* Check for a default transition on this program. */
2032 		rc = security_transition_sid(tsec->sid, isec->sid,
2033 					     SECCLASS_PROCESS, &newsid);
2034 		if (rc)
2035 			return rc;
2036 	}
2037 
2038 	AVC_AUDIT_DATA_INIT(&ad, FS);
2039 	ad.u.fs.path = bprm->file->f_path;
2040 
2041 	if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
2042 		newsid = tsec->sid;
2043 
2044 	if (tsec->sid == newsid) {
2045 		rc = avc_has_perm(tsec->sid, isec->sid,
2046 				  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2047 		if (rc)
2048 			return rc;
2049 	} else {
2050 		/* Check permissions for the transition. */
2051 		rc = avc_has_perm(tsec->sid, newsid,
2052 				  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2053 		if (rc)
2054 			return rc;
2055 
2056 		rc = avc_has_perm(newsid, isec->sid,
2057 				  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2058 		if (rc)
2059 			return rc;
2060 
2061 		/* Clear any possibly unsafe personality bits on exec: */
2062 		current->personality &= ~PER_CLEAR_ON_SETID;
2063 
2064 		/* Set the security field to the new SID. */
2065 		bsec->sid = newsid;
2066 	}
2067 
2068 	bsec->set = 1;
2069 	return 0;
2070 }
2071 
2072 static int selinux_bprm_check_security(struct linux_binprm *bprm)
2073 {
2074 	return secondary_ops->bprm_check_security(bprm);
2075 }
2076 
2077 
2078 static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2079 {
2080 	struct task_security_struct *tsec = current->security;
2081 	int atsecure = 0;
2082 
2083 	if (tsec->osid != tsec->sid) {
2084 		/* Enable secure mode for SIDs transitions unless
2085 		   the noatsecure permission is granted between
2086 		   the two SIDs, i.e. ahp returns 0. */
2087 		atsecure = avc_has_perm(tsec->osid, tsec->sid,
2088 					 SECCLASS_PROCESS,
2089 					 PROCESS__NOATSECURE, NULL);
2090 	}
2091 
2092 	return (atsecure || secondary_ops->bprm_secureexec(bprm));
2093 }
2094 
2095 static void selinux_bprm_free_security(struct linux_binprm *bprm)
2096 {
2097 	kfree(bprm->security);
2098 	bprm->security = NULL;
2099 }
2100 
2101 extern struct vfsmount *selinuxfs_mount;
2102 extern struct dentry *selinux_null;
2103 
2104 /* Derived from fs/exec.c:flush_old_files. */
2105 static inline void flush_unauthorized_files(struct files_struct *files)
2106 {
2107 	struct avc_audit_data ad;
2108 	struct file *file, *devnull = NULL;
2109 	struct tty_struct *tty;
2110 	struct fdtable *fdt;
2111 	long j = -1;
2112 	int drop_tty = 0;
2113 
2114 	mutex_lock(&tty_mutex);
2115 	tty = get_current_tty();
2116 	if (tty) {
2117 		file_list_lock();
2118 		file = list_entry(tty->tty_files.next, typeof(*file), f_u.fu_list);
2119 		if (file) {
2120 			/* Revalidate access to controlling tty.
2121 			   Use inode_has_perm on the tty inode directly rather
2122 			   than using file_has_perm, as this particular open
2123 			   file may belong to another process and we are only
2124 			   interested in the inode-based check here. */
2125 			struct inode *inode = file->f_path.dentry->d_inode;
2126 			if (inode_has_perm(current, inode,
2127 					   FILE__READ | FILE__WRITE, NULL)) {
2128 				drop_tty = 1;
2129 			}
2130 		}
2131 		file_list_unlock();
2132 	}
2133 	mutex_unlock(&tty_mutex);
2134 	/* Reset controlling tty. */
2135 	if (drop_tty)
2136 		no_tty();
2137 
2138 	/* Revalidate access to inherited open files. */
2139 
2140 	AVC_AUDIT_DATA_INIT(&ad, FS);
2141 
2142 	spin_lock(&files->file_lock);
2143 	for (;;) {
2144 		unsigned long set, i;
2145 		int fd;
2146 
2147 		j++;
2148 		i = j * __NFDBITS;
2149 		fdt = files_fdtable(files);
2150 		if (i >= fdt->max_fds)
2151 			break;
2152 		set = fdt->open_fds->fds_bits[j];
2153 		if (!set)
2154 			continue;
2155 		spin_unlock(&files->file_lock);
2156 		for ( ; set ; i++, set >>= 1) {
2157 			if (set & 1) {
2158 				file = fget(i);
2159 				if (!file)
2160 					continue;
2161 				if (file_has_perm(current,
2162 						  file,
2163 						  file_to_av(file))) {
2164 					sys_close(i);
2165 					fd = get_unused_fd();
2166 					if (fd != i) {
2167 						if (fd >= 0)
2168 							put_unused_fd(fd);
2169 						fput(file);
2170 						continue;
2171 					}
2172 					if (devnull) {
2173 						get_file(devnull);
2174 					} else {
2175 						devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR);
2176 						if (IS_ERR(devnull)) {
2177 							devnull = NULL;
2178 							put_unused_fd(fd);
2179 							fput(file);
2180 							continue;
2181 						}
2182 					}
2183 					fd_install(fd, devnull);
2184 				}
2185 				fput(file);
2186 			}
2187 		}
2188 		spin_lock(&files->file_lock);
2189 
2190 	}
2191 	spin_unlock(&files->file_lock);
2192 }
2193 
2194 static void selinux_bprm_apply_creds(struct linux_binprm *bprm, int unsafe)
2195 {
2196 	struct task_security_struct *tsec;
2197 	struct bprm_security_struct *bsec;
2198 	u32 sid;
2199 	int rc;
2200 
2201 	secondary_ops->bprm_apply_creds(bprm, unsafe);
2202 
2203 	tsec = current->security;
2204 
2205 	bsec = bprm->security;
2206 	sid = bsec->sid;
2207 
2208 	tsec->osid = tsec->sid;
2209 	bsec->unsafe = 0;
2210 	if (tsec->sid != sid) {
2211 		/* Check for shared state.  If not ok, leave SID
2212 		   unchanged and kill. */
2213 		if (unsafe & LSM_UNSAFE_SHARE) {
2214 			rc = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
2215 					PROCESS__SHARE, NULL);
2216 			if (rc) {
2217 				bsec->unsafe = 1;
2218 				return;
2219 			}
2220 		}
2221 
2222 		/* Check for ptracing, and update the task SID if ok.
2223 		   Otherwise, leave SID unchanged and kill. */
2224 		if (unsafe & (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2225 			struct task_struct *tracer;
2226 			struct task_security_struct *sec;
2227 			u32 ptsid = 0;
2228 
2229 			rcu_read_lock();
2230 			tracer = tracehook_tracer_task(current);
2231 			if (likely(tracer != NULL)) {
2232 				sec = tracer->security;
2233 				ptsid = sec->sid;
2234 			}
2235 			rcu_read_unlock();
2236 
2237 			if (ptsid != 0) {
2238 				rc = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
2239 						  PROCESS__PTRACE, NULL);
2240 				if (rc) {
2241 					bsec->unsafe = 1;
2242 					return;
2243 				}
2244 			}
2245 		}
2246 		tsec->sid = sid;
2247 	}
2248 }
2249 
2250 /*
2251  * called after apply_creds without the task lock held
2252  */
2253 static void selinux_bprm_post_apply_creds(struct linux_binprm *bprm)
2254 {
2255 	struct task_security_struct *tsec;
2256 	struct rlimit *rlim, *initrlim;
2257 	struct itimerval itimer;
2258 	struct bprm_security_struct *bsec;
2259 	int rc, i;
2260 
2261 	tsec = current->security;
2262 	bsec = bprm->security;
2263 
2264 	if (bsec->unsafe) {
2265 		force_sig_specific(SIGKILL, current);
2266 		return;
2267 	}
2268 	if (tsec->osid == tsec->sid)
2269 		return;
2270 
2271 	/* Close files for which the new task SID is not authorized. */
2272 	flush_unauthorized_files(current->files);
2273 
2274 	/* Check whether the new SID can inherit signal state
2275 	   from the old SID.  If not, clear itimers to avoid
2276 	   subsequent signal generation and flush and unblock
2277 	   signals. This must occur _after_ the task SID has
2278 	  been updated so that any kill done after the flush
2279 	  will be checked against the new SID. */
2280 	rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
2281 			  PROCESS__SIGINH, NULL);
2282 	if (rc) {
2283 		memset(&itimer, 0, sizeof itimer);
2284 		for (i = 0; i < 3; i++)
2285 			do_setitimer(i, &itimer, NULL);
2286 		flush_signals(current);
2287 		spin_lock_irq(&current->sighand->siglock);
2288 		flush_signal_handlers(current, 1);
2289 		sigemptyset(&current->blocked);
2290 		recalc_sigpending();
2291 		spin_unlock_irq(&current->sighand->siglock);
2292 	}
2293 
2294 	/* Always clear parent death signal on SID transitions. */
2295 	current->pdeath_signal = 0;
2296 
2297 	/* Check whether the new SID can inherit resource limits
2298 	   from the old SID.  If not, reset all soft limits to
2299 	   the lower of the current task's hard limit and the init
2300 	   task's soft limit.  Note that the setting of hard limits
2301 	   (even to lower them) can be controlled by the setrlimit
2302 	   check. The inclusion of the init task's soft limit into
2303 	   the computation is to avoid resetting soft limits higher
2304 	   than the default soft limit for cases where the default
2305 	   is lower than the hard limit, e.g. RLIMIT_CORE or
2306 	   RLIMIT_STACK.*/
2307 	rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
2308 			  PROCESS__RLIMITINH, NULL);
2309 	if (rc) {
2310 		for (i = 0; i < RLIM_NLIMITS; i++) {
2311 			rlim = current->signal->rlim + i;
2312 			initrlim = init_task.signal->rlim+i;
2313 			rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2314 		}
2315 		if (current->signal->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) {
2316 			/*
2317 			 * This will cause RLIMIT_CPU calculations
2318 			 * to be refigured.
2319 			 */
2320 			current->it_prof_expires = jiffies_to_cputime(1);
2321 		}
2322 	}
2323 
2324 	/* Wake up the parent if it is waiting so that it can
2325 	   recheck wait permission to the new task SID. */
2326 	wake_up_interruptible(&current->parent->signal->wait_chldexit);
2327 }
2328 
2329 /* superblock security operations */
2330 
2331 static int selinux_sb_alloc_security(struct super_block *sb)
2332 {
2333 	return superblock_alloc_security(sb);
2334 }
2335 
2336 static void selinux_sb_free_security(struct super_block *sb)
2337 {
2338 	superblock_free_security(sb);
2339 }
2340 
2341 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2342 {
2343 	if (plen > olen)
2344 		return 0;
2345 
2346 	return !memcmp(prefix, option, plen);
2347 }
2348 
2349 static inline int selinux_option(char *option, int len)
2350 {
2351 	return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2352 		match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2353 		match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2354 		match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len));
2355 }
2356 
2357 static inline void take_option(char **to, char *from, int *first, int len)
2358 {
2359 	if (!*first) {
2360 		**to = ',';
2361 		*to += 1;
2362 	} else
2363 		*first = 0;
2364 	memcpy(*to, from, len);
2365 	*to += len;
2366 }
2367 
2368 static inline void take_selinux_option(char **to, char *from, int *first,
2369 				       int len)
2370 {
2371 	int current_size = 0;
2372 
2373 	if (!*first) {
2374 		**to = '|';
2375 		*to += 1;
2376 	} else
2377 		*first = 0;
2378 
2379 	while (current_size < len) {
2380 		if (*from != '"') {
2381 			**to = *from;
2382 			*to += 1;
2383 		}
2384 		from += 1;
2385 		current_size += 1;
2386 	}
2387 }
2388 
2389 static int selinux_sb_copy_data(char *orig, char *copy)
2390 {
2391 	int fnosec, fsec, rc = 0;
2392 	char *in_save, *in_curr, *in_end;
2393 	char *sec_curr, *nosec_save, *nosec;
2394 	int open_quote = 0;
2395 
2396 	in_curr = orig;
2397 	sec_curr = copy;
2398 
2399 	nosec = (char *)get_zeroed_page(GFP_KERNEL);
2400 	if (!nosec) {
2401 		rc = -ENOMEM;
2402 		goto out;
2403 	}
2404 
2405 	nosec_save = nosec;
2406 	fnosec = fsec = 1;
2407 	in_save = in_end = orig;
2408 
2409 	do {
2410 		if (*in_end == '"')
2411 			open_quote = !open_quote;
2412 		if ((*in_end == ',' && open_quote == 0) ||
2413 				*in_end == '\0') {
2414 			int len = in_end - in_curr;
2415 
2416 			if (selinux_option(in_curr, len))
2417 				take_selinux_option(&sec_curr, in_curr, &fsec, len);
2418 			else
2419 				take_option(&nosec, in_curr, &fnosec, len);
2420 
2421 			in_curr = in_end + 1;
2422 		}
2423 	} while (*in_end++);
2424 
2425 	strcpy(in_save, nosec_save);
2426 	free_page((unsigned long)nosec_save);
2427 out:
2428 	return rc;
2429 }
2430 
2431 static int selinux_sb_kern_mount(struct super_block *sb, void *data)
2432 {
2433 	struct avc_audit_data ad;
2434 	int rc;
2435 
2436 	rc = superblock_doinit(sb, data);
2437 	if (rc)
2438 		return rc;
2439 
2440 	AVC_AUDIT_DATA_INIT(&ad, FS);
2441 	ad.u.fs.path.dentry = sb->s_root;
2442 	return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
2443 }
2444 
2445 static int selinux_sb_statfs(struct dentry *dentry)
2446 {
2447 	struct avc_audit_data ad;
2448 
2449 	AVC_AUDIT_DATA_INIT(&ad, FS);
2450 	ad.u.fs.path.dentry = dentry->d_sb->s_root;
2451 	return superblock_has_perm(current, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2452 }
2453 
2454 static int selinux_mount(char *dev_name,
2455 			 struct path *path,
2456 			 char *type,
2457 			 unsigned long flags,
2458 			 void *data)
2459 {
2460 	int rc;
2461 
2462 	rc = secondary_ops->sb_mount(dev_name, path, type, flags, data);
2463 	if (rc)
2464 		return rc;
2465 
2466 	if (flags & MS_REMOUNT)
2467 		return superblock_has_perm(current, path->mnt->mnt_sb,
2468 					   FILESYSTEM__REMOUNT, NULL);
2469 	else
2470 		return dentry_has_perm(current, path->mnt, path->dentry,
2471 				       FILE__MOUNTON);
2472 }
2473 
2474 static int selinux_umount(struct vfsmount *mnt, int flags)
2475 {
2476 	int rc;
2477 
2478 	rc = secondary_ops->sb_umount(mnt, flags);
2479 	if (rc)
2480 		return rc;
2481 
2482 	return superblock_has_perm(current, mnt->mnt_sb,
2483 				   FILESYSTEM__UNMOUNT, NULL);
2484 }
2485 
2486 /* inode security operations */
2487 
2488 static int selinux_inode_alloc_security(struct inode *inode)
2489 {
2490 	return inode_alloc_security(inode);
2491 }
2492 
2493 static void selinux_inode_free_security(struct inode *inode)
2494 {
2495 	inode_free_security(inode);
2496 }
2497 
2498 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2499 				       char **name, void **value,
2500 				       size_t *len)
2501 {
2502 	struct task_security_struct *tsec;
2503 	struct inode_security_struct *dsec;
2504 	struct superblock_security_struct *sbsec;
2505 	u32 newsid, clen;
2506 	int rc;
2507 	char *namep = NULL, *context;
2508 
2509 	tsec = current->security;
2510 	dsec = dir->i_security;
2511 	sbsec = dir->i_sb->s_security;
2512 
2513 	if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
2514 		newsid = tsec->create_sid;
2515 	} else {
2516 		rc = security_transition_sid(tsec->sid, dsec->sid,
2517 					     inode_mode_to_security_class(inode->i_mode),
2518 					     &newsid);
2519 		if (rc) {
2520 			printk(KERN_WARNING "%s:  "
2521 			       "security_transition_sid failed, rc=%d (dev=%s "
2522 			       "ino=%ld)\n",
2523 			       __func__,
2524 			       -rc, inode->i_sb->s_id, inode->i_ino);
2525 			return rc;
2526 		}
2527 	}
2528 
2529 	/* Possibly defer initialization to selinux_complete_init. */
2530 	if (sbsec->initialized) {
2531 		struct inode_security_struct *isec = inode->i_security;
2532 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
2533 		isec->sid = newsid;
2534 		isec->initialized = 1;
2535 	}
2536 
2537 	if (!ss_initialized || sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2538 		return -EOPNOTSUPP;
2539 
2540 	if (name) {
2541 		namep = kstrdup(XATTR_SELINUX_SUFFIX, GFP_NOFS);
2542 		if (!namep)
2543 			return -ENOMEM;
2544 		*name = namep;
2545 	}
2546 
2547 	if (value && len) {
2548 		rc = security_sid_to_context_force(newsid, &context, &clen);
2549 		if (rc) {
2550 			kfree(namep);
2551 			return rc;
2552 		}
2553 		*value = context;
2554 		*len = clen;
2555 	}
2556 
2557 	return 0;
2558 }
2559 
2560 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2561 {
2562 	return may_create(dir, dentry, SECCLASS_FILE);
2563 }
2564 
2565 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2566 {
2567 	int rc;
2568 
2569 	rc = secondary_ops->inode_link(old_dentry, dir, new_dentry);
2570 	if (rc)
2571 		return rc;
2572 	return may_link(dir, old_dentry, MAY_LINK);
2573 }
2574 
2575 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2576 {
2577 	int rc;
2578 
2579 	rc = secondary_ops->inode_unlink(dir, dentry);
2580 	if (rc)
2581 		return rc;
2582 	return may_link(dir, dentry, MAY_UNLINK);
2583 }
2584 
2585 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2586 {
2587 	return may_create(dir, dentry, SECCLASS_LNK_FILE);
2588 }
2589 
2590 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2591 {
2592 	return may_create(dir, dentry, SECCLASS_DIR);
2593 }
2594 
2595 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2596 {
2597 	return may_link(dir, dentry, MAY_RMDIR);
2598 }
2599 
2600 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2601 {
2602 	int rc;
2603 
2604 	rc = secondary_ops->inode_mknod(dir, dentry, mode, dev);
2605 	if (rc)
2606 		return rc;
2607 
2608 	return may_create(dir, dentry, inode_mode_to_security_class(mode));
2609 }
2610 
2611 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2612 				struct inode *new_inode, struct dentry *new_dentry)
2613 {
2614 	return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2615 }
2616 
2617 static int selinux_inode_readlink(struct dentry *dentry)
2618 {
2619 	return dentry_has_perm(current, NULL, dentry, FILE__READ);
2620 }
2621 
2622 static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2623 {
2624 	int rc;
2625 
2626 	rc = secondary_ops->inode_follow_link(dentry, nameidata);
2627 	if (rc)
2628 		return rc;
2629 	return dentry_has_perm(current, NULL, dentry, FILE__READ);
2630 }
2631 
2632 static int selinux_inode_permission(struct inode *inode, int mask)
2633 {
2634 	int rc;
2635 
2636 	rc = secondary_ops->inode_permission(inode, mask);
2637 	if (rc)
2638 		return rc;
2639 
2640 	if (!mask) {
2641 		/* No permission to check.  Existence test. */
2642 		return 0;
2643 	}
2644 
2645 	return inode_has_perm(current, inode,
2646 			       open_file_mask_to_av(inode->i_mode, mask), NULL);
2647 }
2648 
2649 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2650 {
2651 	int rc;
2652 
2653 	rc = secondary_ops->inode_setattr(dentry, iattr);
2654 	if (rc)
2655 		return rc;
2656 
2657 	if (iattr->ia_valid & ATTR_FORCE)
2658 		return 0;
2659 
2660 	if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2661 			       ATTR_ATIME_SET | ATTR_MTIME_SET))
2662 		return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2663 
2664 	return dentry_has_perm(current, NULL, dentry, FILE__WRITE);
2665 }
2666 
2667 static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2668 {
2669 	return dentry_has_perm(current, mnt, dentry, FILE__GETATTR);
2670 }
2671 
2672 static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
2673 {
2674 	if (!strncmp(name, XATTR_SECURITY_PREFIX,
2675 		     sizeof XATTR_SECURITY_PREFIX - 1)) {
2676 		if (!strcmp(name, XATTR_NAME_CAPS)) {
2677 			if (!capable(CAP_SETFCAP))
2678 				return -EPERM;
2679 		} else if (!capable(CAP_SYS_ADMIN)) {
2680 			/* A different attribute in the security namespace.
2681 			   Restrict to administrator. */
2682 			return -EPERM;
2683 		}
2684 	}
2685 
2686 	/* Not an attribute we recognize, so just check the
2687 	   ordinary setattr permission. */
2688 	return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2689 }
2690 
2691 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2692 				  const void *value, size_t size, int flags)
2693 {
2694 	struct task_security_struct *tsec = current->security;
2695 	struct inode *inode = dentry->d_inode;
2696 	struct inode_security_struct *isec = inode->i_security;
2697 	struct superblock_security_struct *sbsec;
2698 	struct avc_audit_data ad;
2699 	u32 newsid;
2700 	int rc = 0;
2701 
2702 	if (strcmp(name, XATTR_NAME_SELINUX))
2703 		return selinux_inode_setotherxattr(dentry, name);
2704 
2705 	sbsec = inode->i_sb->s_security;
2706 	if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2707 		return -EOPNOTSUPP;
2708 
2709 	if (!is_owner_or_cap(inode))
2710 		return -EPERM;
2711 
2712 	AVC_AUDIT_DATA_INIT(&ad, FS);
2713 	ad.u.fs.path.dentry = dentry;
2714 
2715 	rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
2716 			  FILE__RELABELFROM, &ad);
2717 	if (rc)
2718 		return rc;
2719 
2720 	rc = security_context_to_sid(value, size, &newsid);
2721 	if (rc == -EINVAL) {
2722 		if (!capable(CAP_MAC_ADMIN))
2723 			return rc;
2724 		rc = security_context_to_sid_force(value, size, &newsid);
2725 	}
2726 	if (rc)
2727 		return rc;
2728 
2729 	rc = avc_has_perm(tsec->sid, newsid, isec->sclass,
2730 			  FILE__RELABELTO, &ad);
2731 	if (rc)
2732 		return rc;
2733 
2734 	rc = security_validate_transition(isec->sid, newsid, tsec->sid,
2735 					  isec->sclass);
2736 	if (rc)
2737 		return rc;
2738 
2739 	return avc_has_perm(newsid,
2740 			    sbsec->sid,
2741 			    SECCLASS_FILESYSTEM,
2742 			    FILESYSTEM__ASSOCIATE,
2743 			    &ad);
2744 }
2745 
2746 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
2747 					const void *value, size_t size,
2748 					int flags)
2749 {
2750 	struct inode *inode = dentry->d_inode;
2751 	struct inode_security_struct *isec = inode->i_security;
2752 	u32 newsid;
2753 	int rc;
2754 
2755 	if (strcmp(name, XATTR_NAME_SELINUX)) {
2756 		/* Not an attribute we recognize, so nothing to do. */
2757 		return;
2758 	}
2759 
2760 	rc = security_context_to_sid_force(value, size, &newsid);
2761 	if (rc) {
2762 		printk(KERN_ERR "SELinux:  unable to map context to SID"
2763 		       "for (%s, %lu), rc=%d\n",
2764 		       inode->i_sb->s_id, inode->i_ino, -rc);
2765 		return;
2766 	}
2767 
2768 	isec->sid = newsid;
2769 	return;
2770 }
2771 
2772 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
2773 {
2774 	return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2775 }
2776 
2777 static int selinux_inode_listxattr(struct dentry *dentry)
2778 {
2779 	return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2780 }
2781 
2782 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
2783 {
2784 	if (strcmp(name, XATTR_NAME_SELINUX))
2785 		return selinux_inode_setotherxattr(dentry, name);
2786 
2787 	/* No one is allowed to remove a SELinux security label.
2788 	   You can change the label, but all data must be labeled. */
2789 	return -EACCES;
2790 }
2791 
2792 /*
2793  * Copy the inode security context value to the user.
2794  *
2795  * Permission check is handled by selinux_inode_getxattr hook.
2796  */
2797 static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
2798 {
2799 	u32 size;
2800 	int error;
2801 	char *context = NULL;
2802 	struct task_security_struct *tsec = current->security;
2803 	struct inode_security_struct *isec = inode->i_security;
2804 
2805 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
2806 		return -EOPNOTSUPP;
2807 
2808 	/*
2809 	 * If the caller has CAP_MAC_ADMIN, then get the raw context
2810 	 * value even if it is not defined by current policy; otherwise,
2811 	 * use the in-core value under current policy.
2812 	 * Use the non-auditing forms of the permission checks since
2813 	 * getxattr may be called by unprivileged processes commonly
2814 	 * and lack of permission just means that we fall back to the
2815 	 * in-core context value, not a denial.
2816 	 */
2817 	error = secondary_ops->capable(current, CAP_MAC_ADMIN);
2818 	if (!error)
2819 		error = avc_has_perm_noaudit(tsec->sid, tsec->sid,
2820 					     SECCLASS_CAPABILITY2,
2821 					     CAPABILITY2__MAC_ADMIN,
2822 					     0,
2823 					     NULL);
2824 	if (!error)
2825 		error = security_sid_to_context_force(isec->sid, &context,
2826 						      &size);
2827 	else
2828 		error = security_sid_to_context(isec->sid, &context, &size);
2829 	if (error)
2830 		return error;
2831 	error = size;
2832 	if (alloc) {
2833 		*buffer = context;
2834 		goto out_nofree;
2835 	}
2836 	kfree(context);
2837 out_nofree:
2838 	return error;
2839 }
2840 
2841 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2842 				     const void *value, size_t size, int flags)
2843 {
2844 	struct inode_security_struct *isec = inode->i_security;
2845 	u32 newsid;
2846 	int rc;
2847 
2848 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
2849 		return -EOPNOTSUPP;
2850 
2851 	if (!value || !size)
2852 		return -EACCES;
2853 
2854 	rc = security_context_to_sid((void *)value, size, &newsid);
2855 	if (rc)
2856 		return rc;
2857 
2858 	isec->sid = newsid;
2859 	return 0;
2860 }
2861 
2862 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2863 {
2864 	const int len = sizeof(XATTR_NAME_SELINUX);
2865 	if (buffer && len <= buffer_size)
2866 		memcpy(buffer, XATTR_NAME_SELINUX, len);
2867 	return len;
2868 }
2869 
2870 static int selinux_inode_need_killpriv(struct dentry *dentry)
2871 {
2872 	return secondary_ops->inode_need_killpriv(dentry);
2873 }
2874 
2875 static int selinux_inode_killpriv(struct dentry *dentry)
2876 {
2877 	return secondary_ops->inode_killpriv(dentry);
2878 }
2879 
2880 static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2881 {
2882 	struct inode_security_struct *isec = inode->i_security;
2883 	*secid = isec->sid;
2884 }
2885 
2886 /* file security operations */
2887 
2888 static int selinux_revalidate_file_permission(struct file *file, int mask)
2889 {
2890 	int rc;
2891 	struct inode *inode = file->f_path.dentry->d_inode;
2892 
2893 	if (!mask) {
2894 		/* No permission to check.  Existence test. */
2895 		return 0;
2896 	}
2897 
2898 	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2899 	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2900 		mask |= MAY_APPEND;
2901 
2902 	rc = file_has_perm(current, file,
2903 			   file_mask_to_av(inode->i_mode, mask));
2904 	if (rc)
2905 		return rc;
2906 
2907 	return selinux_netlbl_inode_permission(inode, mask);
2908 }
2909 
2910 static int selinux_file_permission(struct file *file, int mask)
2911 {
2912 	struct inode *inode = file->f_path.dentry->d_inode;
2913 	struct task_security_struct *tsec = current->security;
2914 	struct file_security_struct *fsec = file->f_security;
2915 	struct inode_security_struct *isec = inode->i_security;
2916 
2917 	if (!mask) {
2918 		/* No permission to check.  Existence test. */
2919 		return 0;
2920 	}
2921 
2922 	if (tsec->sid == fsec->sid && fsec->isid == isec->sid
2923 	    && fsec->pseqno == avc_policy_seqno())
2924 		return selinux_netlbl_inode_permission(inode, mask);
2925 
2926 	return selinux_revalidate_file_permission(file, mask);
2927 }
2928 
2929 static int selinux_file_alloc_security(struct file *file)
2930 {
2931 	return file_alloc_security(file);
2932 }
2933 
2934 static void selinux_file_free_security(struct file *file)
2935 {
2936 	file_free_security(file);
2937 }
2938 
2939 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2940 			      unsigned long arg)
2941 {
2942 	u32 av = 0;
2943 
2944 	if (_IOC_DIR(cmd) & _IOC_WRITE)
2945 		av |= FILE__WRITE;
2946 	if (_IOC_DIR(cmd) & _IOC_READ)
2947 		av |= FILE__READ;
2948 	if (!av)
2949 		av = FILE__IOCTL;
2950 
2951 	return file_has_perm(current, file, av);
2952 }
2953 
2954 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
2955 {
2956 #ifndef CONFIG_PPC32
2957 	if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
2958 		/*
2959 		 * We are making executable an anonymous mapping or a
2960 		 * private file mapping that will also be writable.
2961 		 * This has an additional check.
2962 		 */
2963 		int rc = task_has_perm(current, current, PROCESS__EXECMEM);
2964 		if (rc)
2965 			return rc;
2966 	}
2967 #endif
2968 
2969 	if (file) {
2970 		/* read access is always possible with a mapping */
2971 		u32 av = FILE__READ;
2972 
2973 		/* write access only matters if the mapping is shared */
2974 		if (shared && (prot & PROT_WRITE))
2975 			av |= FILE__WRITE;
2976 
2977 		if (prot & PROT_EXEC)
2978 			av |= FILE__EXECUTE;
2979 
2980 		return file_has_perm(current, file, av);
2981 	}
2982 	return 0;
2983 }
2984 
2985 static int selinux_file_mmap(struct file *file, unsigned long reqprot,
2986 			     unsigned long prot, unsigned long flags,
2987 			     unsigned long addr, unsigned long addr_only)
2988 {
2989 	int rc = 0;
2990 	u32 sid = ((struct task_security_struct *)(current->security))->sid;
2991 
2992 	if (addr < mmap_min_addr)
2993 		rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
2994 				  MEMPROTECT__MMAP_ZERO, NULL);
2995 	if (rc || addr_only)
2996 		return rc;
2997 
2998 	if (selinux_checkreqprot)
2999 		prot = reqprot;
3000 
3001 	return file_map_prot_check(file, prot,
3002 				   (flags & MAP_TYPE) == MAP_SHARED);
3003 }
3004 
3005 static int selinux_file_mprotect(struct vm_area_struct *vma,
3006 				 unsigned long reqprot,
3007 				 unsigned long prot)
3008 {
3009 	int rc;
3010 
3011 	rc = secondary_ops->file_mprotect(vma, reqprot, prot);
3012 	if (rc)
3013 		return rc;
3014 
3015 	if (selinux_checkreqprot)
3016 		prot = reqprot;
3017 
3018 #ifndef CONFIG_PPC32
3019 	if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3020 		rc = 0;
3021 		if (vma->vm_start >= vma->vm_mm->start_brk &&
3022 		    vma->vm_end <= vma->vm_mm->brk) {
3023 			rc = task_has_perm(current, current,
3024 					   PROCESS__EXECHEAP);
3025 		} else if (!vma->vm_file &&
3026 			   vma->vm_start <= vma->vm_mm->start_stack &&
3027 			   vma->vm_end >= vma->vm_mm->start_stack) {
3028 			rc = task_has_perm(current, current, PROCESS__EXECSTACK);
3029 		} else if (vma->vm_file && vma->anon_vma) {
3030 			/*
3031 			 * We are making executable a file mapping that has
3032 			 * had some COW done. Since pages might have been
3033 			 * written, check ability to execute the possibly
3034 			 * modified content.  This typically should only
3035 			 * occur for text relocations.
3036 			 */
3037 			rc = file_has_perm(current, vma->vm_file,
3038 					   FILE__EXECMOD);
3039 		}
3040 		if (rc)
3041 			return rc;
3042 	}
3043 #endif
3044 
3045 	return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3046 }
3047 
3048 static int selinux_file_lock(struct file *file, unsigned int cmd)
3049 {
3050 	return file_has_perm(current, file, FILE__LOCK);
3051 }
3052 
3053 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3054 			      unsigned long arg)
3055 {
3056 	int err = 0;
3057 
3058 	switch (cmd) {
3059 	case F_SETFL:
3060 		if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3061 			err = -EINVAL;
3062 			break;
3063 		}
3064 
3065 		if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3066 			err = file_has_perm(current, file, FILE__WRITE);
3067 			break;
3068 		}
3069 		/* fall through */
3070 	case F_SETOWN:
3071 	case F_SETSIG:
3072 	case F_GETFL:
3073 	case F_GETOWN:
3074 	case F_GETSIG:
3075 		/* Just check FD__USE permission */
3076 		err = file_has_perm(current, file, 0);
3077 		break;
3078 	case F_GETLK:
3079 	case F_SETLK:
3080 	case F_SETLKW:
3081 #if BITS_PER_LONG == 32
3082 	case F_GETLK64:
3083 	case F_SETLK64:
3084 	case F_SETLKW64:
3085 #endif
3086 		if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3087 			err = -EINVAL;
3088 			break;
3089 		}
3090 		err = file_has_perm(current, file, FILE__LOCK);
3091 		break;
3092 	}
3093 
3094 	return err;
3095 }
3096 
3097 static int selinux_file_set_fowner(struct file *file)
3098 {
3099 	struct task_security_struct *tsec;
3100 	struct file_security_struct *fsec;
3101 
3102 	tsec = current->security;
3103 	fsec = file->f_security;
3104 	fsec->fown_sid = tsec->sid;
3105 
3106 	return 0;
3107 }
3108 
3109 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3110 				       struct fown_struct *fown, int signum)
3111 {
3112 	struct file *file;
3113 	u32 perm;
3114 	struct task_security_struct *tsec;
3115 	struct file_security_struct *fsec;
3116 
3117 	/* struct fown_struct is never outside the context of a struct file */
3118 	file = container_of(fown, struct file, f_owner);
3119 
3120 	tsec = tsk->security;
3121 	fsec = file->f_security;
3122 
3123 	if (!signum)
3124 		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3125 	else
3126 		perm = signal_to_av(signum);
3127 
3128 	return avc_has_perm(fsec->fown_sid, tsec->sid,
3129 			    SECCLASS_PROCESS, perm, NULL);
3130 }
3131 
3132 static int selinux_file_receive(struct file *file)
3133 {
3134 	return file_has_perm(current, file, file_to_av(file));
3135 }
3136 
3137 static int selinux_dentry_open(struct file *file)
3138 {
3139 	struct file_security_struct *fsec;
3140 	struct inode *inode;
3141 	struct inode_security_struct *isec;
3142 	inode = file->f_path.dentry->d_inode;
3143 	fsec = file->f_security;
3144 	isec = inode->i_security;
3145 	/*
3146 	 * Save inode label and policy sequence number
3147 	 * at open-time so that selinux_file_permission
3148 	 * can determine whether revalidation is necessary.
3149 	 * Task label is already saved in the file security
3150 	 * struct as its SID.
3151 	 */
3152 	fsec->isid = isec->sid;
3153 	fsec->pseqno = avc_policy_seqno();
3154 	/*
3155 	 * Since the inode label or policy seqno may have changed
3156 	 * between the selinux_inode_permission check and the saving
3157 	 * of state above, recheck that access is still permitted.
3158 	 * Otherwise, access might never be revalidated against the
3159 	 * new inode label or new policy.
3160 	 * This check is not redundant - do not remove.
3161 	 */
3162 	return inode_has_perm(current, inode, file_to_av(file), NULL);
3163 }
3164 
3165 /* task security operations */
3166 
3167 static int selinux_task_create(unsigned long clone_flags)
3168 {
3169 	int rc;
3170 
3171 	rc = secondary_ops->task_create(clone_flags);
3172 	if (rc)
3173 		return rc;
3174 
3175 	return task_has_perm(current, current, PROCESS__FORK);
3176 }
3177 
3178 static int selinux_task_alloc_security(struct task_struct *tsk)
3179 {
3180 	struct task_security_struct *tsec1, *tsec2;
3181 	int rc;
3182 
3183 	tsec1 = current->security;
3184 
3185 	rc = task_alloc_security(tsk);
3186 	if (rc)
3187 		return rc;
3188 	tsec2 = tsk->security;
3189 
3190 	tsec2->osid = tsec1->osid;
3191 	tsec2->sid = tsec1->sid;
3192 
3193 	/* Retain the exec, fs, key, and sock SIDs across fork */
3194 	tsec2->exec_sid = tsec1->exec_sid;
3195 	tsec2->create_sid = tsec1->create_sid;
3196 	tsec2->keycreate_sid = tsec1->keycreate_sid;
3197 	tsec2->sockcreate_sid = tsec1->sockcreate_sid;
3198 
3199 	return 0;
3200 }
3201 
3202 static void selinux_task_free_security(struct task_struct *tsk)
3203 {
3204 	task_free_security(tsk);
3205 }
3206 
3207 static int selinux_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
3208 {
3209 	/* Since setuid only affects the current process, and
3210 	   since the SELinux controls are not based on the Linux
3211 	   identity attributes, SELinux does not need to control
3212 	   this operation.  However, SELinux does control the use
3213 	   of the CAP_SETUID and CAP_SETGID capabilities using the
3214 	   capable hook. */
3215 	return 0;
3216 }
3217 
3218 static int selinux_task_post_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
3219 {
3220 	return secondary_ops->task_post_setuid(id0, id1, id2, flags);
3221 }
3222 
3223 static int selinux_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags)
3224 {
3225 	/* See the comment for setuid above. */
3226 	return 0;
3227 }
3228 
3229 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3230 {
3231 	return task_has_perm(current, p, PROCESS__SETPGID);
3232 }
3233 
3234 static int selinux_task_getpgid(struct task_struct *p)
3235 {
3236 	return task_has_perm(current, p, PROCESS__GETPGID);
3237 }
3238 
3239 static int selinux_task_getsid(struct task_struct *p)
3240 {
3241 	return task_has_perm(current, p, PROCESS__GETSESSION);
3242 }
3243 
3244 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3245 {
3246 	struct task_security_struct *tsec = p->security;
3247 	*secid = tsec->sid;
3248 }
3249 
3250 static int selinux_task_setgroups(struct group_info *group_info)
3251 {
3252 	/* See the comment for setuid above. */
3253 	return 0;
3254 }
3255 
3256 static int selinux_task_setnice(struct task_struct *p, int nice)
3257 {
3258 	int rc;
3259 
3260 	rc = secondary_ops->task_setnice(p, nice);
3261 	if (rc)
3262 		return rc;
3263 
3264 	return task_has_perm(current, p, PROCESS__SETSCHED);
3265 }
3266 
3267 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3268 {
3269 	int rc;
3270 
3271 	rc = secondary_ops->task_setioprio(p, ioprio);
3272 	if (rc)
3273 		return rc;
3274 
3275 	return task_has_perm(current, p, PROCESS__SETSCHED);
3276 }
3277 
3278 static int selinux_task_getioprio(struct task_struct *p)
3279 {
3280 	return task_has_perm(current, p, PROCESS__GETSCHED);
3281 }
3282 
3283 static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
3284 {
3285 	struct rlimit *old_rlim = current->signal->rlim + resource;
3286 	int rc;
3287 
3288 	rc = secondary_ops->task_setrlimit(resource, new_rlim);
3289 	if (rc)
3290 		return rc;
3291 
3292 	/* Control the ability to change the hard limit (whether
3293 	   lowering or raising it), so that the hard limit can
3294 	   later be used as a safe reset point for the soft limit
3295 	   upon context transitions. See selinux_bprm_apply_creds. */
3296 	if (old_rlim->rlim_max != new_rlim->rlim_max)
3297 		return task_has_perm(current, current, PROCESS__SETRLIMIT);
3298 
3299 	return 0;
3300 }
3301 
3302 static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
3303 {
3304 	int rc;
3305 
3306 	rc = secondary_ops->task_setscheduler(p, policy, lp);
3307 	if (rc)
3308 		return rc;
3309 
3310 	return task_has_perm(current, p, PROCESS__SETSCHED);
3311 }
3312 
3313 static int selinux_task_getscheduler(struct task_struct *p)
3314 {
3315 	return task_has_perm(current, p, PROCESS__GETSCHED);
3316 }
3317 
3318 static int selinux_task_movememory(struct task_struct *p)
3319 {
3320 	return task_has_perm(current, p, PROCESS__SETSCHED);
3321 }
3322 
3323 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3324 				int sig, u32 secid)
3325 {
3326 	u32 perm;
3327 	int rc;
3328 	struct task_security_struct *tsec;
3329 
3330 	rc = secondary_ops->task_kill(p, info, sig, secid);
3331 	if (rc)
3332 		return rc;
3333 
3334 	if (!sig)
3335 		perm = PROCESS__SIGNULL; /* null signal; existence test */
3336 	else
3337 		perm = signal_to_av(sig);
3338 	tsec = p->security;
3339 	if (secid)
3340 		rc = avc_has_perm(secid, tsec->sid, SECCLASS_PROCESS, perm, NULL);
3341 	else
3342 		rc = task_has_perm(current, p, perm);
3343 	return rc;
3344 }
3345 
3346 static int selinux_task_prctl(int option,
3347 			      unsigned long arg2,
3348 			      unsigned long arg3,
3349 			      unsigned long arg4,
3350 			      unsigned long arg5,
3351 			      long *rc_p)
3352 {
3353 	/* The current prctl operations do not appear to require
3354 	   any SELinux controls since they merely observe or modify
3355 	   the state of the current process. */
3356 	return secondary_ops->task_prctl(option, arg2, arg3, arg4, arg5, rc_p);
3357 }
3358 
3359 static int selinux_task_wait(struct task_struct *p)
3360 {
3361 	return task_has_perm(p, current, PROCESS__SIGCHLD);
3362 }
3363 
3364 static void selinux_task_reparent_to_init(struct task_struct *p)
3365 {
3366 	struct task_security_struct *tsec;
3367 
3368 	secondary_ops->task_reparent_to_init(p);
3369 
3370 	tsec = p->security;
3371 	tsec->osid = tsec->sid;
3372 	tsec->sid = SECINITSID_KERNEL;
3373 	return;
3374 }
3375 
3376 static void selinux_task_to_inode(struct task_struct *p,
3377 				  struct inode *inode)
3378 {
3379 	struct task_security_struct *tsec = p->security;
3380 	struct inode_security_struct *isec = inode->i_security;
3381 
3382 	isec->sid = tsec->sid;
3383 	isec->initialized = 1;
3384 	return;
3385 }
3386 
3387 /* Returns error only if unable to parse addresses */
3388 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3389 			struct avc_audit_data *ad, u8 *proto)
3390 {
3391 	int offset, ihlen, ret = -EINVAL;
3392 	struct iphdr _iph, *ih;
3393 
3394 	offset = skb_network_offset(skb);
3395 	ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3396 	if (ih == NULL)
3397 		goto out;
3398 
3399 	ihlen = ih->ihl * 4;
3400 	if (ihlen < sizeof(_iph))
3401 		goto out;
3402 
3403 	ad->u.net.v4info.saddr = ih->saddr;
3404 	ad->u.net.v4info.daddr = ih->daddr;
3405 	ret = 0;
3406 
3407 	if (proto)
3408 		*proto = ih->protocol;
3409 
3410 	switch (ih->protocol) {
3411 	case IPPROTO_TCP: {
3412 		struct tcphdr _tcph, *th;
3413 
3414 		if (ntohs(ih->frag_off) & IP_OFFSET)
3415 			break;
3416 
3417 		offset += ihlen;
3418 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3419 		if (th == NULL)
3420 			break;
3421 
3422 		ad->u.net.sport = th->source;
3423 		ad->u.net.dport = th->dest;
3424 		break;
3425 	}
3426 
3427 	case IPPROTO_UDP: {
3428 		struct udphdr _udph, *uh;
3429 
3430 		if (ntohs(ih->frag_off) & IP_OFFSET)
3431 			break;
3432 
3433 		offset += ihlen;
3434 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3435 		if (uh == NULL)
3436 			break;
3437 
3438 		ad->u.net.sport = uh->source;
3439 		ad->u.net.dport = uh->dest;
3440 		break;
3441 	}
3442 
3443 	case IPPROTO_DCCP: {
3444 		struct dccp_hdr _dccph, *dh;
3445 
3446 		if (ntohs(ih->frag_off) & IP_OFFSET)
3447 			break;
3448 
3449 		offset += ihlen;
3450 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3451 		if (dh == NULL)
3452 			break;
3453 
3454 		ad->u.net.sport = dh->dccph_sport;
3455 		ad->u.net.dport = dh->dccph_dport;
3456 		break;
3457 	}
3458 
3459 	default:
3460 		break;
3461 	}
3462 out:
3463 	return ret;
3464 }
3465 
3466 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3467 
3468 /* Returns error only if unable to parse addresses */
3469 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3470 			struct avc_audit_data *ad, u8 *proto)
3471 {
3472 	u8 nexthdr;
3473 	int ret = -EINVAL, offset;
3474 	struct ipv6hdr _ipv6h, *ip6;
3475 
3476 	offset = skb_network_offset(skb);
3477 	ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
3478 	if (ip6 == NULL)
3479 		goto out;
3480 
3481 	ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
3482 	ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
3483 	ret = 0;
3484 
3485 	nexthdr = ip6->nexthdr;
3486 	offset += sizeof(_ipv6h);
3487 	offset = ipv6_skip_exthdr(skb, offset, &nexthdr);
3488 	if (offset < 0)
3489 		goto out;
3490 
3491 	if (proto)
3492 		*proto = nexthdr;
3493 
3494 	switch (nexthdr) {
3495 	case IPPROTO_TCP: {
3496 		struct tcphdr _tcph, *th;
3497 
3498 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3499 		if (th == NULL)
3500 			break;
3501 
3502 		ad->u.net.sport = th->source;
3503 		ad->u.net.dport = th->dest;
3504 		break;
3505 	}
3506 
3507 	case IPPROTO_UDP: {
3508 		struct udphdr _udph, *uh;
3509 
3510 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3511 		if (uh == NULL)
3512 			break;
3513 
3514 		ad->u.net.sport = uh->source;
3515 		ad->u.net.dport = uh->dest;
3516 		break;
3517 	}
3518 
3519 	case IPPROTO_DCCP: {
3520 		struct dccp_hdr _dccph, *dh;
3521 
3522 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3523 		if (dh == NULL)
3524 			break;
3525 
3526 		ad->u.net.sport = dh->dccph_sport;
3527 		ad->u.net.dport = dh->dccph_dport;
3528 		break;
3529 	}
3530 
3531 	/* includes fragments */
3532 	default:
3533 		break;
3534 	}
3535 out:
3536 	return ret;
3537 }
3538 
3539 #endif /* IPV6 */
3540 
3541 static int selinux_parse_skb(struct sk_buff *skb, struct avc_audit_data *ad,
3542 			     char **addrp, int src, u8 *proto)
3543 {
3544 	int ret = 0;
3545 
3546 	switch (ad->u.net.family) {
3547 	case PF_INET:
3548 		ret = selinux_parse_skb_ipv4(skb, ad, proto);
3549 		if (ret || !addrp)
3550 			break;
3551 		*addrp = (char *)(src ? &ad->u.net.v4info.saddr :
3552 					&ad->u.net.v4info.daddr);
3553 		break;
3554 
3555 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3556 	case PF_INET6:
3557 		ret = selinux_parse_skb_ipv6(skb, ad, proto);
3558 		if (ret || !addrp)
3559 			break;
3560 		*addrp = (char *)(src ? &ad->u.net.v6info.saddr :
3561 					&ad->u.net.v6info.daddr);
3562 		break;
3563 #endif	/* IPV6 */
3564 	default:
3565 		break;
3566 	}
3567 
3568 	if (unlikely(ret))
3569 		printk(KERN_WARNING
3570 		       "SELinux: failure in selinux_parse_skb(),"
3571 		       " unable to parse packet\n");
3572 
3573 	return ret;
3574 }
3575 
3576 /**
3577  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
3578  * @skb: the packet
3579  * @family: protocol family
3580  * @sid: the packet's peer label SID
3581  *
3582  * Description:
3583  * Check the various different forms of network peer labeling and determine
3584  * the peer label/SID for the packet; most of the magic actually occurs in
3585  * the security server function security_net_peersid_cmp().  The function
3586  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
3587  * or -EACCES if @sid is invalid due to inconsistencies with the different
3588  * peer labels.
3589  *
3590  */
3591 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
3592 {
3593 	int err;
3594 	u32 xfrm_sid;
3595 	u32 nlbl_sid;
3596 	u32 nlbl_type;
3597 
3598 	selinux_skb_xfrm_sid(skb, &xfrm_sid);
3599 	selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
3600 
3601 	err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
3602 	if (unlikely(err)) {
3603 		printk(KERN_WARNING
3604 		       "SELinux: failure in selinux_skb_peerlbl_sid(),"
3605 		       " unable to determine packet's peer label\n");
3606 		return -EACCES;
3607 	}
3608 
3609 	return 0;
3610 }
3611 
3612 /* socket security operations */
3613 static int socket_has_perm(struct task_struct *task, struct socket *sock,
3614 			   u32 perms)
3615 {
3616 	struct inode_security_struct *isec;
3617 	struct task_security_struct *tsec;
3618 	struct avc_audit_data ad;
3619 	int err = 0;
3620 
3621 	tsec = task->security;
3622 	isec = SOCK_INODE(sock)->i_security;
3623 
3624 	if (isec->sid == SECINITSID_KERNEL)
3625 		goto out;
3626 
3627 	AVC_AUDIT_DATA_INIT(&ad, NET);
3628 	ad.u.net.sk = sock->sk;
3629 	err = avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, &ad);
3630 
3631 out:
3632 	return err;
3633 }
3634 
3635 static int selinux_socket_create(int family, int type,
3636 				 int protocol, int kern)
3637 {
3638 	int err = 0;
3639 	struct task_security_struct *tsec;
3640 	u32 newsid;
3641 
3642 	if (kern)
3643 		goto out;
3644 
3645 	tsec = current->security;
3646 	newsid = tsec->sockcreate_sid ? : tsec->sid;
3647 	err = avc_has_perm(tsec->sid, newsid,
3648 			   socket_type_to_security_class(family, type,
3649 			   protocol), SOCKET__CREATE, NULL);
3650 
3651 out:
3652 	return err;
3653 }
3654 
3655 static int selinux_socket_post_create(struct socket *sock, int family,
3656 				      int type, int protocol, int kern)
3657 {
3658 	int err = 0;
3659 	struct inode_security_struct *isec;
3660 	struct task_security_struct *tsec;
3661 	struct sk_security_struct *sksec;
3662 	u32 newsid;
3663 
3664 	isec = SOCK_INODE(sock)->i_security;
3665 
3666 	tsec = current->security;
3667 	newsid = tsec->sockcreate_sid ? : tsec->sid;
3668 	isec->sclass = socket_type_to_security_class(family, type, protocol);
3669 	isec->sid = kern ? SECINITSID_KERNEL : newsid;
3670 	isec->initialized = 1;
3671 
3672 	if (sock->sk) {
3673 		sksec = sock->sk->sk_security;
3674 		sksec->sid = isec->sid;
3675 		sksec->sclass = isec->sclass;
3676 		err = selinux_netlbl_socket_post_create(sock);
3677 	}
3678 
3679 	return err;
3680 }
3681 
3682 /* Range of port numbers used to automatically bind.
3683    Need to determine whether we should perform a name_bind
3684    permission check between the socket and the port number. */
3685 
3686 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
3687 {
3688 	u16 family;
3689 	int err;
3690 
3691 	err = socket_has_perm(current, sock, SOCKET__BIND);
3692 	if (err)
3693 		goto out;
3694 
3695 	/*
3696 	 * If PF_INET or PF_INET6, check name_bind permission for the port.
3697 	 * Multiple address binding for SCTP is not supported yet: we just
3698 	 * check the first address now.
3699 	 */
3700 	family = sock->sk->sk_family;
3701 	if (family == PF_INET || family == PF_INET6) {
3702 		char *addrp;
3703 		struct inode_security_struct *isec;
3704 		struct task_security_struct *tsec;
3705 		struct avc_audit_data ad;
3706 		struct sockaddr_in *addr4 = NULL;
3707 		struct sockaddr_in6 *addr6 = NULL;
3708 		unsigned short snum;
3709 		struct sock *sk = sock->sk;
3710 		u32 sid, node_perm;
3711 
3712 		tsec = current->security;
3713 		isec = SOCK_INODE(sock)->i_security;
3714 
3715 		if (family == PF_INET) {
3716 			addr4 = (struct sockaddr_in *)address;
3717 			snum = ntohs(addr4->sin_port);
3718 			addrp = (char *)&addr4->sin_addr.s_addr;
3719 		} else {
3720 			addr6 = (struct sockaddr_in6 *)address;
3721 			snum = ntohs(addr6->sin6_port);
3722 			addrp = (char *)&addr6->sin6_addr.s6_addr;
3723 		}
3724 
3725 		if (snum) {
3726 			int low, high;
3727 
3728 			inet_get_local_port_range(&low, &high);
3729 
3730 			if (snum < max(PROT_SOCK, low) || snum > high) {
3731 				err = sel_netport_sid(sk->sk_protocol,
3732 						      snum, &sid);
3733 				if (err)
3734 					goto out;
3735 				AVC_AUDIT_DATA_INIT(&ad, NET);
3736 				ad.u.net.sport = htons(snum);
3737 				ad.u.net.family = family;
3738 				err = avc_has_perm(isec->sid, sid,
3739 						   isec->sclass,
3740 						   SOCKET__NAME_BIND, &ad);
3741 				if (err)
3742 					goto out;
3743 			}
3744 		}
3745 
3746 		switch (isec->sclass) {
3747 		case SECCLASS_TCP_SOCKET:
3748 			node_perm = TCP_SOCKET__NODE_BIND;
3749 			break;
3750 
3751 		case SECCLASS_UDP_SOCKET:
3752 			node_perm = UDP_SOCKET__NODE_BIND;
3753 			break;
3754 
3755 		case SECCLASS_DCCP_SOCKET:
3756 			node_perm = DCCP_SOCKET__NODE_BIND;
3757 			break;
3758 
3759 		default:
3760 			node_perm = RAWIP_SOCKET__NODE_BIND;
3761 			break;
3762 		}
3763 
3764 		err = sel_netnode_sid(addrp, family, &sid);
3765 		if (err)
3766 			goto out;
3767 
3768 		AVC_AUDIT_DATA_INIT(&ad, NET);
3769 		ad.u.net.sport = htons(snum);
3770 		ad.u.net.family = family;
3771 
3772 		if (family == PF_INET)
3773 			ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3774 		else
3775 			ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3776 
3777 		err = avc_has_perm(isec->sid, sid,
3778 				   isec->sclass, node_perm, &ad);
3779 		if (err)
3780 			goto out;
3781 	}
3782 out:
3783 	return err;
3784 }
3785 
3786 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3787 {
3788 	struct inode_security_struct *isec;
3789 	int err;
3790 
3791 	err = socket_has_perm(current, sock, SOCKET__CONNECT);
3792 	if (err)
3793 		return err;
3794 
3795 	/*
3796 	 * If a TCP or DCCP socket, check name_connect permission for the port.
3797 	 */
3798 	isec = SOCK_INODE(sock)->i_security;
3799 	if (isec->sclass == SECCLASS_TCP_SOCKET ||
3800 	    isec->sclass == SECCLASS_DCCP_SOCKET) {
3801 		struct sock *sk = sock->sk;
3802 		struct avc_audit_data ad;
3803 		struct sockaddr_in *addr4 = NULL;
3804 		struct sockaddr_in6 *addr6 = NULL;
3805 		unsigned short snum;
3806 		u32 sid, perm;
3807 
3808 		if (sk->sk_family == PF_INET) {
3809 			addr4 = (struct sockaddr_in *)address;
3810 			if (addrlen < sizeof(struct sockaddr_in))
3811 				return -EINVAL;
3812 			snum = ntohs(addr4->sin_port);
3813 		} else {
3814 			addr6 = (struct sockaddr_in6 *)address;
3815 			if (addrlen < SIN6_LEN_RFC2133)
3816 				return -EINVAL;
3817 			snum = ntohs(addr6->sin6_port);
3818 		}
3819 
3820 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);
3821 		if (err)
3822 			goto out;
3823 
3824 		perm = (isec->sclass == SECCLASS_TCP_SOCKET) ?
3825 		       TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
3826 
3827 		AVC_AUDIT_DATA_INIT(&ad, NET);
3828 		ad.u.net.dport = htons(snum);
3829 		ad.u.net.family = sk->sk_family;
3830 		err = avc_has_perm(isec->sid, sid, isec->sclass, perm, &ad);
3831 		if (err)
3832 			goto out;
3833 	}
3834 
3835 out:
3836 	return err;
3837 }
3838 
3839 static int selinux_socket_listen(struct socket *sock, int backlog)
3840 {
3841 	return socket_has_perm(current, sock, SOCKET__LISTEN);
3842 }
3843 
3844 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3845 {
3846 	int err;
3847 	struct inode_security_struct *isec;
3848 	struct inode_security_struct *newisec;
3849 
3850 	err = socket_has_perm(current, sock, SOCKET__ACCEPT);
3851 	if (err)
3852 		return err;
3853 
3854 	newisec = SOCK_INODE(newsock)->i_security;
3855 
3856 	isec = SOCK_INODE(sock)->i_security;
3857 	newisec->sclass = isec->sclass;
3858 	newisec->sid = isec->sid;
3859 	newisec->initialized = 1;
3860 
3861 	return 0;
3862 }
3863 
3864 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3865 				  int size)
3866 {
3867 	int rc;
3868 
3869 	rc = socket_has_perm(current, sock, SOCKET__WRITE);
3870 	if (rc)
3871 		return rc;
3872 
3873 	return selinux_netlbl_inode_permission(SOCK_INODE(sock), MAY_WRITE);
3874 }
3875 
3876 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3877 				  int size, int flags)
3878 {
3879 	return socket_has_perm(current, sock, SOCKET__READ);
3880 }
3881 
3882 static int selinux_socket_getsockname(struct socket *sock)
3883 {
3884 	return socket_has_perm(current, sock, SOCKET__GETATTR);
3885 }
3886 
3887 static int selinux_socket_getpeername(struct socket *sock)
3888 {
3889 	return socket_has_perm(current, sock, SOCKET__GETATTR);
3890 }
3891 
3892 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
3893 {
3894 	int err;
3895 
3896 	err = socket_has_perm(current, sock, SOCKET__SETOPT);
3897 	if (err)
3898 		return err;
3899 
3900 	return selinux_netlbl_socket_setsockopt(sock, level, optname);
3901 }
3902 
3903 static int selinux_socket_getsockopt(struct socket *sock, int level,
3904 				     int optname)
3905 {
3906 	return socket_has_perm(current, sock, SOCKET__GETOPT);
3907 }
3908 
3909 static int selinux_socket_shutdown(struct socket *sock, int how)
3910 {
3911 	return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
3912 }
3913 
3914 static int selinux_socket_unix_stream_connect(struct socket *sock,
3915 					      struct socket *other,
3916 					      struct sock *newsk)
3917 {
3918 	struct sk_security_struct *ssec;
3919 	struct inode_security_struct *isec;
3920 	struct inode_security_struct *other_isec;
3921 	struct avc_audit_data ad;
3922 	int err;
3923 
3924 	err = secondary_ops->unix_stream_connect(sock, other, newsk);
3925 	if (err)
3926 		return err;
3927 
3928 	isec = SOCK_INODE(sock)->i_security;
3929 	other_isec = SOCK_INODE(other)->i_security;
3930 
3931 	AVC_AUDIT_DATA_INIT(&ad, NET);
3932 	ad.u.net.sk = other->sk;
3933 
3934 	err = avc_has_perm(isec->sid, other_isec->sid,
3935 			   isec->sclass,
3936 			   UNIX_STREAM_SOCKET__CONNECTTO, &ad);
3937 	if (err)
3938 		return err;
3939 
3940 	/* connecting socket */
3941 	ssec = sock->sk->sk_security;
3942 	ssec->peer_sid = other_isec->sid;
3943 
3944 	/* server child socket */
3945 	ssec = newsk->sk_security;
3946 	ssec->peer_sid = isec->sid;
3947 	err = security_sid_mls_copy(other_isec->sid, ssec->peer_sid, &ssec->sid);
3948 
3949 	return err;
3950 }
3951 
3952 static int selinux_socket_unix_may_send(struct socket *sock,
3953 					struct socket *other)
3954 {
3955 	struct inode_security_struct *isec;
3956 	struct inode_security_struct *other_isec;
3957 	struct avc_audit_data ad;
3958 	int err;
3959 
3960 	isec = SOCK_INODE(sock)->i_security;
3961 	other_isec = SOCK_INODE(other)->i_security;
3962 
3963 	AVC_AUDIT_DATA_INIT(&ad, NET);
3964 	ad.u.net.sk = other->sk;
3965 
3966 	err = avc_has_perm(isec->sid, other_isec->sid,
3967 			   isec->sclass, SOCKET__SENDTO, &ad);
3968 	if (err)
3969 		return err;
3970 
3971 	return 0;
3972 }
3973 
3974 static int selinux_inet_sys_rcv_skb(int ifindex, char *addrp, u16 family,
3975 				    u32 peer_sid,
3976 				    struct avc_audit_data *ad)
3977 {
3978 	int err;
3979 	u32 if_sid;
3980 	u32 node_sid;
3981 
3982 	err = sel_netif_sid(ifindex, &if_sid);
3983 	if (err)
3984 		return err;
3985 	err = avc_has_perm(peer_sid, if_sid,
3986 			   SECCLASS_NETIF, NETIF__INGRESS, ad);
3987 	if (err)
3988 		return err;
3989 
3990 	err = sel_netnode_sid(addrp, family, &node_sid);
3991 	if (err)
3992 		return err;
3993 	return avc_has_perm(peer_sid, node_sid,
3994 			    SECCLASS_NODE, NODE__RECVFROM, ad);
3995 }
3996 
3997 static int selinux_sock_rcv_skb_iptables_compat(struct sock *sk,
3998 						struct sk_buff *skb,
3999 						struct avc_audit_data *ad,
4000 						u16 family,
4001 						char *addrp)
4002 {
4003 	int err;
4004 	struct sk_security_struct *sksec = sk->sk_security;
4005 	u16 sk_class;
4006 	u32 netif_perm, node_perm, recv_perm;
4007 	u32 port_sid, node_sid, if_sid, sk_sid;
4008 
4009 	sk_sid = sksec->sid;
4010 	sk_class = sksec->sclass;
4011 
4012 	switch (sk_class) {
4013 	case SECCLASS_UDP_SOCKET:
4014 		netif_perm = NETIF__UDP_RECV;
4015 		node_perm = NODE__UDP_RECV;
4016 		recv_perm = UDP_SOCKET__RECV_MSG;
4017 		break;
4018 	case SECCLASS_TCP_SOCKET:
4019 		netif_perm = NETIF__TCP_RECV;
4020 		node_perm = NODE__TCP_RECV;
4021 		recv_perm = TCP_SOCKET__RECV_MSG;
4022 		break;
4023 	case SECCLASS_DCCP_SOCKET:
4024 		netif_perm = NETIF__DCCP_RECV;
4025 		node_perm = NODE__DCCP_RECV;
4026 		recv_perm = DCCP_SOCKET__RECV_MSG;
4027 		break;
4028 	default:
4029 		netif_perm = NETIF__RAWIP_RECV;
4030 		node_perm = NODE__RAWIP_RECV;
4031 		recv_perm = 0;
4032 		break;
4033 	}
4034 
4035 	err = sel_netif_sid(skb->iif, &if_sid);
4036 	if (err)
4037 		return err;
4038 	err = avc_has_perm(sk_sid, if_sid, SECCLASS_NETIF, netif_perm, ad);
4039 	if (err)
4040 		return err;
4041 
4042 	err = sel_netnode_sid(addrp, family, &node_sid);
4043 	if (err)
4044 		return err;
4045 	err = avc_has_perm(sk_sid, node_sid, SECCLASS_NODE, node_perm, ad);
4046 	if (err)
4047 		return err;
4048 
4049 	if (!recv_perm)
4050 		return 0;
4051 	err = sel_netport_sid(sk->sk_protocol,
4052 			      ntohs(ad->u.net.sport), &port_sid);
4053 	if (unlikely(err)) {
4054 		printk(KERN_WARNING
4055 		       "SELinux: failure in"
4056 		       " selinux_sock_rcv_skb_iptables_compat(),"
4057 		       " network port label not found\n");
4058 		return err;
4059 	}
4060 	return avc_has_perm(sk_sid, port_sid, sk_class, recv_perm, ad);
4061 }
4062 
4063 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4064 				       struct avc_audit_data *ad,
4065 				       u16 family, char *addrp)
4066 {
4067 	int err;
4068 	struct sk_security_struct *sksec = sk->sk_security;
4069 	u32 peer_sid;
4070 	u32 sk_sid = sksec->sid;
4071 
4072 	if (selinux_compat_net)
4073 		err = selinux_sock_rcv_skb_iptables_compat(sk, skb, ad,
4074 							   family, addrp);
4075 	else
4076 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4077 				   PACKET__RECV, ad);
4078 	if (err)
4079 		return err;
4080 
4081 	if (selinux_policycap_netpeer) {
4082 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4083 		if (err)
4084 			return err;
4085 		err = avc_has_perm(sk_sid, peer_sid,
4086 				   SECCLASS_PEER, PEER__RECV, ad);
4087 	} else {
4088 		err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, ad);
4089 		if (err)
4090 			return err;
4091 		err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, ad);
4092 	}
4093 
4094 	return err;
4095 }
4096 
4097 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4098 {
4099 	int err;
4100 	struct sk_security_struct *sksec = sk->sk_security;
4101 	u16 family = sk->sk_family;
4102 	u32 sk_sid = sksec->sid;
4103 	struct avc_audit_data ad;
4104 	char *addrp;
4105 
4106 	if (family != PF_INET && family != PF_INET6)
4107 		return 0;
4108 
4109 	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
4110 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4111 		family = PF_INET;
4112 
4113 	AVC_AUDIT_DATA_INIT(&ad, NET);
4114 	ad.u.net.netif = skb->iif;
4115 	ad.u.net.family = family;
4116 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4117 	if (err)
4118 		return err;
4119 
4120 	/* If any sort of compatibility mode is enabled then handoff processing
4121 	 * to the selinux_sock_rcv_skb_compat() function to deal with the
4122 	 * special handling.  We do this in an attempt to keep this function
4123 	 * as fast and as clean as possible. */
4124 	if (selinux_compat_net || !selinux_policycap_netpeer)
4125 		return selinux_sock_rcv_skb_compat(sk, skb, &ad,
4126 						   family, addrp);
4127 
4128 	if (netlbl_enabled() || selinux_xfrm_enabled()) {
4129 		u32 peer_sid;
4130 
4131 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4132 		if (err)
4133 			return err;
4134 		err = selinux_inet_sys_rcv_skb(skb->iif, addrp, family,
4135 					       peer_sid, &ad);
4136 		if (err)
4137 			return err;
4138 		err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4139 				   PEER__RECV, &ad);
4140 	}
4141 
4142 	if (selinux_secmark_enabled()) {
4143 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4144 				   PACKET__RECV, &ad);
4145 		if (err)
4146 			return err;
4147 	}
4148 
4149 	return err;
4150 }
4151 
4152 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4153 					    int __user *optlen, unsigned len)
4154 {
4155 	int err = 0;
4156 	char *scontext;
4157 	u32 scontext_len;
4158 	struct sk_security_struct *ssec;
4159 	struct inode_security_struct *isec;
4160 	u32 peer_sid = SECSID_NULL;
4161 
4162 	isec = SOCK_INODE(sock)->i_security;
4163 
4164 	if (isec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4165 	    isec->sclass == SECCLASS_TCP_SOCKET) {
4166 		ssec = sock->sk->sk_security;
4167 		peer_sid = ssec->peer_sid;
4168 	}
4169 	if (peer_sid == SECSID_NULL) {
4170 		err = -ENOPROTOOPT;
4171 		goto out;
4172 	}
4173 
4174 	err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4175 
4176 	if (err)
4177 		goto out;
4178 
4179 	if (scontext_len > len) {
4180 		err = -ERANGE;
4181 		goto out_len;
4182 	}
4183 
4184 	if (copy_to_user(optval, scontext, scontext_len))
4185 		err = -EFAULT;
4186 
4187 out_len:
4188 	if (put_user(scontext_len, optlen))
4189 		err = -EFAULT;
4190 
4191 	kfree(scontext);
4192 out:
4193 	return err;
4194 }
4195 
4196 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4197 {
4198 	u32 peer_secid = SECSID_NULL;
4199 	u16 family;
4200 
4201 	if (sock)
4202 		family = sock->sk->sk_family;
4203 	else if (skb && skb->sk)
4204 		family = skb->sk->sk_family;
4205 	else
4206 		goto out;
4207 
4208 	if (sock && family == PF_UNIX)
4209 		selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
4210 	else if (skb)
4211 		selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4212 
4213 out:
4214 	*secid = peer_secid;
4215 	if (peer_secid == SECSID_NULL)
4216 		return -EINVAL;
4217 	return 0;
4218 }
4219 
4220 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4221 {
4222 	return sk_alloc_security(sk, family, priority);
4223 }
4224 
4225 static void selinux_sk_free_security(struct sock *sk)
4226 {
4227 	sk_free_security(sk);
4228 }
4229 
4230 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4231 {
4232 	struct sk_security_struct *ssec = sk->sk_security;
4233 	struct sk_security_struct *newssec = newsk->sk_security;
4234 
4235 	newssec->sid = ssec->sid;
4236 	newssec->peer_sid = ssec->peer_sid;
4237 	newssec->sclass = ssec->sclass;
4238 
4239 	selinux_netlbl_sk_security_reset(newssec, newsk->sk_family);
4240 }
4241 
4242 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4243 {
4244 	if (!sk)
4245 		*secid = SECINITSID_ANY_SOCKET;
4246 	else {
4247 		struct sk_security_struct *sksec = sk->sk_security;
4248 
4249 		*secid = sksec->sid;
4250 	}
4251 }
4252 
4253 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4254 {
4255 	struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
4256 	struct sk_security_struct *sksec = sk->sk_security;
4257 
4258 	if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4259 	    sk->sk_family == PF_UNIX)
4260 		isec->sid = sksec->sid;
4261 	sksec->sclass = isec->sclass;
4262 
4263 	selinux_netlbl_sock_graft(sk, parent);
4264 }
4265 
4266 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4267 				     struct request_sock *req)
4268 {
4269 	struct sk_security_struct *sksec = sk->sk_security;
4270 	int err;
4271 	u32 newsid;
4272 	u32 peersid;
4273 
4274 	err = selinux_skb_peerlbl_sid(skb, sk->sk_family, &peersid);
4275 	if (err)
4276 		return err;
4277 	if (peersid == SECSID_NULL) {
4278 		req->secid = sksec->sid;
4279 		req->peer_secid = SECSID_NULL;
4280 		return 0;
4281 	}
4282 
4283 	err = security_sid_mls_copy(sksec->sid, peersid, &newsid);
4284 	if (err)
4285 		return err;
4286 
4287 	req->secid = newsid;
4288 	req->peer_secid = peersid;
4289 	return 0;
4290 }
4291 
4292 static void selinux_inet_csk_clone(struct sock *newsk,
4293 				   const struct request_sock *req)
4294 {
4295 	struct sk_security_struct *newsksec = newsk->sk_security;
4296 
4297 	newsksec->sid = req->secid;
4298 	newsksec->peer_sid = req->peer_secid;
4299 	/* NOTE: Ideally, we should also get the isec->sid for the
4300 	   new socket in sync, but we don't have the isec available yet.
4301 	   So we will wait until sock_graft to do it, by which
4302 	   time it will have been created and available. */
4303 
4304 	/* We don't need to take any sort of lock here as we are the only
4305 	 * thread with access to newsksec */
4306 	selinux_netlbl_sk_security_reset(newsksec, req->rsk_ops->family);
4307 }
4308 
4309 static void selinux_inet_conn_established(struct sock *sk,
4310 				struct sk_buff *skb)
4311 {
4312 	struct sk_security_struct *sksec = sk->sk_security;
4313 
4314 	selinux_skb_peerlbl_sid(skb, sk->sk_family, &sksec->peer_sid);
4315 }
4316 
4317 static void selinux_req_classify_flow(const struct request_sock *req,
4318 				      struct flowi *fl)
4319 {
4320 	fl->secid = req->secid;
4321 }
4322 
4323 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4324 {
4325 	int err = 0;
4326 	u32 perm;
4327 	struct nlmsghdr *nlh;
4328 	struct socket *sock = sk->sk_socket;
4329 	struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
4330 
4331 	if (skb->len < NLMSG_SPACE(0)) {
4332 		err = -EINVAL;
4333 		goto out;
4334 	}
4335 	nlh = nlmsg_hdr(skb);
4336 
4337 	err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);
4338 	if (err) {
4339 		if (err == -EINVAL) {
4340 			audit_log(current->audit_context, GFP_KERNEL, AUDIT_SELINUX_ERR,
4341 				  "SELinux:  unrecognized netlink message"
4342 				  " type=%hu for sclass=%hu\n",
4343 				  nlh->nlmsg_type, isec->sclass);
4344 			if (!selinux_enforcing)
4345 				err = 0;
4346 		}
4347 
4348 		/* Ignore */
4349 		if (err == -ENOENT)
4350 			err = 0;
4351 		goto out;
4352 	}
4353 
4354 	err = socket_has_perm(current, sock, perm);
4355 out:
4356 	return err;
4357 }
4358 
4359 #ifdef CONFIG_NETFILTER
4360 
4361 static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
4362 				       u16 family)
4363 {
4364 	char *addrp;
4365 	u32 peer_sid;
4366 	struct avc_audit_data ad;
4367 	u8 secmark_active;
4368 	u8 peerlbl_active;
4369 
4370 	if (!selinux_policycap_netpeer)
4371 		return NF_ACCEPT;
4372 
4373 	secmark_active = selinux_secmark_enabled();
4374 	peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4375 	if (!secmark_active && !peerlbl_active)
4376 		return NF_ACCEPT;
4377 
4378 	AVC_AUDIT_DATA_INIT(&ad, NET);
4379 	ad.u.net.netif = ifindex;
4380 	ad.u.net.family = family;
4381 	if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4382 		return NF_DROP;
4383 
4384 	if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4385 		return NF_DROP;
4386 
4387 	if (peerlbl_active)
4388 		if (selinux_inet_sys_rcv_skb(ifindex, addrp, family,
4389 					     peer_sid, &ad) != 0)
4390 			return NF_DROP;
4391 
4392 	if (secmark_active)
4393 		if (avc_has_perm(peer_sid, skb->secmark,
4394 				 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
4395 			return NF_DROP;
4396 
4397 	return NF_ACCEPT;
4398 }
4399 
4400 static unsigned int selinux_ipv4_forward(unsigned int hooknum,
4401 					 struct sk_buff *skb,
4402 					 const struct net_device *in,
4403 					 const struct net_device *out,
4404 					 int (*okfn)(struct sk_buff *))
4405 {
4406 	return selinux_ip_forward(skb, in->ifindex, PF_INET);
4407 }
4408 
4409 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4410 static unsigned int selinux_ipv6_forward(unsigned int hooknum,
4411 					 struct sk_buff *skb,
4412 					 const struct net_device *in,
4413 					 const struct net_device *out,
4414 					 int (*okfn)(struct sk_buff *))
4415 {
4416 	return selinux_ip_forward(skb, in->ifindex, PF_INET6);
4417 }
4418 #endif	/* IPV6 */
4419 
4420 static int selinux_ip_postroute_iptables_compat(struct sock *sk,
4421 						int ifindex,
4422 						struct avc_audit_data *ad,
4423 						u16 family, char *addrp)
4424 {
4425 	int err;
4426 	struct sk_security_struct *sksec = sk->sk_security;
4427 	u16 sk_class;
4428 	u32 netif_perm, node_perm, send_perm;
4429 	u32 port_sid, node_sid, if_sid, sk_sid;
4430 
4431 	sk_sid = sksec->sid;
4432 	sk_class = sksec->sclass;
4433 
4434 	switch (sk_class) {
4435 	case SECCLASS_UDP_SOCKET:
4436 		netif_perm = NETIF__UDP_SEND;
4437 		node_perm = NODE__UDP_SEND;
4438 		send_perm = UDP_SOCKET__SEND_MSG;
4439 		break;
4440 	case SECCLASS_TCP_SOCKET:
4441 		netif_perm = NETIF__TCP_SEND;
4442 		node_perm = NODE__TCP_SEND;
4443 		send_perm = TCP_SOCKET__SEND_MSG;
4444 		break;
4445 	case SECCLASS_DCCP_SOCKET:
4446 		netif_perm = NETIF__DCCP_SEND;
4447 		node_perm = NODE__DCCP_SEND;
4448 		send_perm = DCCP_SOCKET__SEND_MSG;
4449 		break;
4450 	default:
4451 		netif_perm = NETIF__RAWIP_SEND;
4452 		node_perm = NODE__RAWIP_SEND;
4453 		send_perm = 0;
4454 		break;
4455 	}
4456 
4457 	err = sel_netif_sid(ifindex, &if_sid);
4458 	if (err)
4459 		return err;
4460 	err = avc_has_perm(sk_sid, if_sid, SECCLASS_NETIF, netif_perm, ad);
4461 		return err;
4462 
4463 	err = sel_netnode_sid(addrp, family, &node_sid);
4464 	if (err)
4465 		return err;
4466 	err = avc_has_perm(sk_sid, node_sid, SECCLASS_NODE, node_perm, ad);
4467 	if (err)
4468 		return err;
4469 
4470 	if (send_perm != 0)
4471 		return 0;
4472 
4473 	err = sel_netport_sid(sk->sk_protocol,
4474 			      ntohs(ad->u.net.dport), &port_sid);
4475 	if (unlikely(err)) {
4476 		printk(KERN_WARNING
4477 		       "SELinux: failure in"
4478 		       " selinux_ip_postroute_iptables_compat(),"
4479 		       " network port label not found\n");
4480 		return err;
4481 	}
4482 	return avc_has_perm(sk_sid, port_sid, sk_class, send_perm, ad);
4483 }
4484 
4485 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
4486 						int ifindex,
4487 						struct avc_audit_data *ad,
4488 						u16 family,
4489 						char *addrp,
4490 						u8 proto)
4491 {
4492 	struct sock *sk = skb->sk;
4493 	struct sk_security_struct *sksec;
4494 
4495 	if (sk == NULL)
4496 		return NF_ACCEPT;
4497 	sksec = sk->sk_security;
4498 
4499 	if (selinux_compat_net) {
4500 		if (selinux_ip_postroute_iptables_compat(skb->sk, ifindex,
4501 							 ad, family, addrp))
4502 			return NF_DROP;
4503 	} else {
4504 		if (avc_has_perm(sksec->sid, skb->secmark,
4505 				 SECCLASS_PACKET, PACKET__SEND, ad))
4506 			return NF_DROP;
4507 	}
4508 
4509 	if (selinux_policycap_netpeer)
4510 		if (selinux_xfrm_postroute_last(sksec->sid, skb, ad, proto))
4511 			return NF_DROP;
4512 
4513 	return NF_ACCEPT;
4514 }
4515 
4516 static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
4517 					 u16 family)
4518 {
4519 	u32 secmark_perm;
4520 	u32 peer_sid;
4521 	struct sock *sk;
4522 	struct avc_audit_data ad;
4523 	char *addrp;
4524 	u8 proto;
4525 	u8 secmark_active;
4526 	u8 peerlbl_active;
4527 
4528 	AVC_AUDIT_DATA_INIT(&ad, NET);
4529 	ad.u.net.netif = ifindex;
4530 	ad.u.net.family = family;
4531 	if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
4532 		return NF_DROP;
4533 
4534 	/* If any sort of compatibility mode is enabled then handoff processing
4535 	 * to the selinux_ip_postroute_compat() function to deal with the
4536 	 * special handling.  We do this in an attempt to keep this function
4537 	 * as fast and as clean as possible. */
4538 	if (selinux_compat_net || !selinux_policycap_netpeer)
4539 		return selinux_ip_postroute_compat(skb, ifindex, &ad,
4540 						   family, addrp, proto);
4541 
4542 	/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
4543 	 * packet transformation so allow the packet to pass without any checks
4544 	 * since we'll have another chance to perform access control checks
4545 	 * when the packet is on it's final way out.
4546 	 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
4547 	 *       is NULL, in this case go ahead and apply access control. */
4548 	if (skb->dst != NULL && skb->dst->xfrm != NULL)
4549 		return NF_ACCEPT;
4550 
4551 	secmark_active = selinux_secmark_enabled();
4552 	peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4553 	if (!secmark_active && !peerlbl_active)
4554 		return NF_ACCEPT;
4555 
4556 	/* if the packet is locally generated (skb->sk != NULL) then use the
4557 	 * socket's label as the peer label, otherwise the packet is being
4558 	 * forwarded through this system and we need to fetch the peer label
4559 	 * directly from the packet */
4560 	sk = skb->sk;
4561 	if (sk) {
4562 		struct sk_security_struct *sksec = sk->sk_security;
4563 		peer_sid = sksec->sid;
4564 		secmark_perm = PACKET__SEND;
4565 	} else {
4566 		if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
4567 				return NF_DROP;
4568 		secmark_perm = PACKET__FORWARD_OUT;
4569 	}
4570 
4571 	if (secmark_active)
4572 		if (avc_has_perm(peer_sid, skb->secmark,
4573 				 SECCLASS_PACKET, secmark_perm, &ad))
4574 			return NF_DROP;
4575 
4576 	if (peerlbl_active) {
4577 		u32 if_sid;
4578 		u32 node_sid;
4579 
4580 		if (sel_netif_sid(ifindex, &if_sid))
4581 			return NF_DROP;
4582 		if (avc_has_perm(peer_sid, if_sid,
4583 				 SECCLASS_NETIF, NETIF__EGRESS, &ad))
4584 			return NF_DROP;
4585 
4586 		if (sel_netnode_sid(addrp, family, &node_sid))
4587 			return NF_DROP;
4588 		if (avc_has_perm(peer_sid, node_sid,
4589 				 SECCLASS_NODE, NODE__SENDTO, &ad))
4590 			return NF_DROP;
4591 	}
4592 
4593 	return NF_ACCEPT;
4594 }
4595 
4596 static unsigned int selinux_ipv4_postroute(unsigned int hooknum,
4597 					   struct sk_buff *skb,
4598 					   const struct net_device *in,
4599 					   const struct net_device *out,
4600 					   int (*okfn)(struct sk_buff *))
4601 {
4602 	return selinux_ip_postroute(skb, out->ifindex, PF_INET);
4603 }
4604 
4605 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4606 static unsigned int selinux_ipv6_postroute(unsigned int hooknum,
4607 					   struct sk_buff *skb,
4608 					   const struct net_device *in,
4609 					   const struct net_device *out,
4610 					   int (*okfn)(struct sk_buff *))
4611 {
4612 	return selinux_ip_postroute(skb, out->ifindex, PF_INET6);
4613 }
4614 #endif	/* IPV6 */
4615 
4616 #endif	/* CONFIG_NETFILTER */
4617 
4618 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
4619 {
4620 	int err;
4621 
4622 	err = secondary_ops->netlink_send(sk, skb);
4623 	if (err)
4624 		return err;
4625 
4626 	if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS)
4627 		err = selinux_nlmsg_perm(sk, skb);
4628 
4629 	return err;
4630 }
4631 
4632 static int selinux_netlink_recv(struct sk_buff *skb, int capability)
4633 {
4634 	int err;
4635 	struct avc_audit_data ad;
4636 
4637 	err = secondary_ops->netlink_recv(skb, capability);
4638 	if (err)
4639 		return err;
4640 
4641 	AVC_AUDIT_DATA_INIT(&ad, CAP);
4642 	ad.u.cap = capability;
4643 
4644 	return avc_has_perm(NETLINK_CB(skb).sid, NETLINK_CB(skb).sid,
4645 			    SECCLASS_CAPABILITY, CAP_TO_MASK(capability), &ad);
4646 }
4647 
4648 static int ipc_alloc_security(struct task_struct *task,
4649 			      struct kern_ipc_perm *perm,
4650 			      u16 sclass)
4651 {
4652 	struct task_security_struct *tsec = task->security;
4653 	struct ipc_security_struct *isec;
4654 
4655 	isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
4656 	if (!isec)
4657 		return -ENOMEM;
4658 
4659 	isec->sclass = sclass;
4660 	isec->sid = tsec->sid;
4661 	perm->security = isec;
4662 
4663 	return 0;
4664 }
4665 
4666 static void ipc_free_security(struct kern_ipc_perm *perm)
4667 {
4668 	struct ipc_security_struct *isec = perm->security;
4669 	perm->security = NULL;
4670 	kfree(isec);
4671 }
4672 
4673 static int msg_msg_alloc_security(struct msg_msg *msg)
4674 {
4675 	struct msg_security_struct *msec;
4676 
4677 	msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
4678 	if (!msec)
4679 		return -ENOMEM;
4680 
4681 	msec->sid = SECINITSID_UNLABELED;
4682 	msg->security = msec;
4683 
4684 	return 0;
4685 }
4686 
4687 static void msg_msg_free_security(struct msg_msg *msg)
4688 {
4689 	struct msg_security_struct *msec = msg->security;
4690 
4691 	msg->security = NULL;
4692 	kfree(msec);
4693 }
4694 
4695 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
4696 			u32 perms)
4697 {
4698 	struct task_security_struct *tsec;
4699 	struct ipc_security_struct *isec;
4700 	struct avc_audit_data ad;
4701 
4702 	tsec = current->security;
4703 	isec = ipc_perms->security;
4704 
4705 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4706 	ad.u.ipc_id = ipc_perms->key;
4707 
4708 	return avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, &ad);
4709 }
4710 
4711 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
4712 {
4713 	return msg_msg_alloc_security(msg);
4714 }
4715 
4716 static void selinux_msg_msg_free_security(struct msg_msg *msg)
4717 {
4718 	msg_msg_free_security(msg);
4719 }
4720 
4721 /* message queue security operations */
4722 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
4723 {
4724 	struct task_security_struct *tsec;
4725 	struct ipc_security_struct *isec;
4726 	struct avc_audit_data ad;
4727 	int rc;
4728 
4729 	rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
4730 	if (rc)
4731 		return rc;
4732 
4733 	tsec = current->security;
4734 	isec = msq->q_perm.security;
4735 
4736 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4737 	ad.u.ipc_id = msq->q_perm.key;
4738 
4739 	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
4740 			  MSGQ__CREATE, &ad);
4741 	if (rc) {
4742 		ipc_free_security(&msq->q_perm);
4743 		return rc;
4744 	}
4745 	return 0;
4746 }
4747 
4748 static void selinux_msg_queue_free_security(struct msg_queue *msq)
4749 {
4750 	ipc_free_security(&msq->q_perm);
4751 }
4752 
4753 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
4754 {
4755 	struct task_security_struct *tsec;
4756 	struct ipc_security_struct *isec;
4757 	struct avc_audit_data ad;
4758 
4759 	tsec = current->security;
4760 	isec = msq->q_perm.security;
4761 
4762 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4763 	ad.u.ipc_id = msq->q_perm.key;
4764 
4765 	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
4766 			    MSGQ__ASSOCIATE, &ad);
4767 }
4768 
4769 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
4770 {
4771 	int err;
4772 	int perms;
4773 
4774 	switch (cmd) {
4775 	case IPC_INFO:
4776 	case MSG_INFO:
4777 		/* No specific object, just general system-wide information. */
4778 		return task_has_system(current, SYSTEM__IPC_INFO);
4779 	case IPC_STAT:
4780 	case MSG_STAT:
4781 		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
4782 		break;
4783 	case IPC_SET:
4784 		perms = MSGQ__SETATTR;
4785 		break;
4786 	case IPC_RMID:
4787 		perms = MSGQ__DESTROY;
4788 		break;
4789 	default:
4790 		return 0;
4791 	}
4792 
4793 	err = ipc_has_perm(&msq->q_perm, perms);
4794 	return err;
4795 }
4796 
4797 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
4798 {
4799 	struct task_security_struct *tsec;
4800 	struct ipc_security_struct *isec;
4801 	struct msg_security_struct *msec;
4802 	struct avc_audit_data ad;
4803 	int rc;
4804 
4805 	tsec = current->security;
4806 	isec = msq->q_perm.security;
4807 	msec = msg->security;
4808 
4809 	/*
4810 	 * First time through, need to assign label to the message
4811 	 */
4812 	if (msec->sid == SECINITSID_UNLABELED) {
4813 		/*
4814 		 * Compute new sid based on current process and
4815 		 * message queue this message will be stored in
4816 		 */
4817 		rc = security_transition_sid(tsec->sid,
4818 					     isec->sid,
4819 					     SECCLASS_MSG,
4820 					     &msec->sid);
4821 		if (rc)
4822 			return rc;
4823 	}
4824 
4825 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4826 	ad.u.ipc_id = msq->q_perm.key;
4827 
4828 	/* Can this process write to the queue? */
4829 	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
4830 			  MSGQ__WRITE, &ad);
4831 	if (!rc)
4832 		/* Can this process send the message */
4833 		rc = avc_has_perm(tsec->sid, msec->sid,
4834 				  SECCLASS_MSG, MSG__SEND, &ad);
4835 	if (!rc)
4836 		/* Can the message be put in the queue? */
4837 		rc = avc_has_perm(msec->sid, isec->sid,
4838 				  SECCLASS_MSGQ, MSGQ__ENQUEUE, &ad);
4839 
4840 	return rc;
4841 }
4842 
4843 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
4844 				    struct task_struct *target,
4845 				    long type, int mode)
4846 {
4847 	struct task_security_struct *tsec;
4848 	struct ipc_security_struct *isec;
4849 	struct msg_security_struct *msec;
4850 	struct avc_audit_data ad;
4851 	int rc;
4852 
4853 	tsec = target->security;
4854 	isec = msq->q_perm.security;
4855 	msec = msg->security;
4856 
4857 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4858 	ad.u.ipc_id = msq->q_perm.key;
4859 
4860 	rc = avc_has_perm(tsec->sid, isec->sid,
4861 			  SECCLASS_MSGQ, MSGQ__READ, &ad);
4862 	if (!rc)
4863 		rc = avc_has_perm(tsec->sid, msec->sid,
4864 				  SECCLASS_MSG, MSG__RECEIVE, &ad);
4865 	return rc;
4866 }
4867 
4868 /* Shared Memory security operations */
4869 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
4870 {
4871 	struct task_security_struct *tsec;
4872 	struct ipc_security_struct *isec;
4873 	struct avc_audit_data ad;
4874 	int rc;
4875 
4876 	rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
4877 	if (rc)
4878 		return rc;
4879 
4880 	tsec = current->security;
4881 	isec = shp->shm_perm.security;
4882 
4883 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4884 	ad.u.ipc_id = shp->shm_perm.key;
4885 
4886 	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
4887 			  SHM__CREATE, &ad);
4888 	if (rc) {
4889 		ipc_free_security(&shp->shm_perm);
4890 		return rc;
4891 	}
4892 	return 0;
4893 }
4894 
4895 static void selinux_shm_free_security(struct shmid_kernel *shp)
4896 {
4897 	ipc_free_security(&shp->shm_perm);
4898 }
4899 
4900 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
4901 {
4902 	struct task_security_struct *tsec;
4903 	struct ipc_security_struct *isec;
4904 	struct avc_audit_data ad;
4905 
4906 	tsec = current->security;
4907 	isec = shp->shm_perm.security;
4908 
4909 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4910 	ad.u.ipc_id = shp->shm_perm.key;
4911 
4912 	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
4913 			    SHM__ASSOCIATE, &ad);
4914 }
4915 
4916 /* Note, at this point, shp is locked down */
4917 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
4918 {
4919 	int perms;
4920 	int err;
4921 
4922 	switch (cmd) {
4923 	case IPC_INFO:
4924 	case SHM_INFO:
4925 		/* No specific object, just general system-wide information. */
4926 		return task_has_system(current, SYSTEM__IPC_INFO);
4927 	case IPC_STAT:
4928 	case SHM_STAT:
4929 		perms = SHM__GETATTR | SHM__ASSOCIATE;
4930 		break;
4931 	case IPC_SET:
4932 		perms = SHM__SETATTR;
4933 		break;
4934 	case SHM_LOCK:
4935 	case SHM_UNLOCK:
4936 		perms = SHM__LOCK;
4937 		break;
4938 	case IPC_RMID:
4939 		perms = SHM__DESTROY;
4940 		break;
4941 	default:
4942 		return 0;
4943 	}
4944 
4945 	err = ipc_has_perm(&shp->shm_perm, perms);
4946 	return err;
4947 }
4948 
4949 static int selinux_shm_shmat(struct shmid_kernel *shp,
4950 			     char __user *shmaddr, int shmflg)
4951 {
4952 	u32 perms;
4953 	int rc;
4954 
4955 	rc = secondary_ops->shm_shmat(shp, shmaddr, shmflg);
4956 	if (rc)
4957 		return rc;
4958 
4959 	if (shmflg & SHM_RDONLY)
4960 		perms = SHM__READ;
4961 	else
4962 		perms = SHM__READ | SHM__WRITE;
4963 
4964 	return ipc_has_perm(&shp->shm_perm, perms);
4965 }
4966 
4967 /* Semaphore security operations */
4968 static int selinux_sem_alloc_security(struct sem_array *sma)
4969 {
4970 	struct task_security_struct *tsec;
4971 	struct ipc_security_struct *isec;
4972 	struct avc_audit_data ad;
4973 	int rc;
4974 
4975 	rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
4976 	if (rc)
4977 		return rc;
4978 
4979 	tsec = current->security;
4980 	isec = sma->sem_perm.security;
4981 
4982 	AVC_AUDIT_DATA_INIT(&ad, IPC);
4983 	ad.u.ipc_id = sma->sem_perm.key;
4984 
4985 	rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
4986 			  SEM__CREATE, &ad);
4987 	if (rc) {
4988 		ipc_free_security(&sma->sem_perm);
4989 		return rc;
4990 	}
4991 	return 0;
4992 }
4993 
4994 static void selinux_sem_free_security(struct sem_array *sma)
4995 {
4996 	ipc_free_security(&sma->sem_perm);
4997 }
4998 
4999 static int selinux_sem_associate(struct sem_array *sma, int semflg)
5000 {
5001 	struct task_security_struct *tsec;
5002 	struct ipc_security_struct *isec;
5003 	struct avc_audit_data ad;
5004 
5005 	tsec = current->security;
5006 	isec = sma->sem_perm.security;
5007 
5008 	AVC_AUDIT_DATA_INIT(&ad, IPC);
5009 	ad.u.ipc_id = sma->sem_perm.key;
5010 
5011 	return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
5012 			    SEM__ASSOCIATE, &ad);
5013 }
5014 
5015 /* Note, at this point, sma is locked down */
5016 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5017 {
5018 	int err;
5019 	u32 perms;
5020 
5021 	switch (cmd) {
5022 	case IPC_INFO:
5023 	case SEM_INFO:
5024 		/* No specific object, just general system-wide information. */
5025 		return task_has_system(current, SYSTEM__IPC_INFO);
5026 	case GETPID:
5027 	case GETNCNT:
5028 	case GETZCNT:
5029 		perms = SEM__GETATTR;
5030 		break;
5031 	case GETVAL:
5032 	case GETALL:
5033 		perms = SEM__READ;
5034 		break;
5035 	case SETVAL:
5036 	case SETALL:
5037 		perms = SEM__WRITE;
5038 		break;
5039 	case IPC_RMID:
5040 		perms = SEM__DESTROY;
5041 		break;
5042 	case IPC_SET:
5043 		perms = SEM__SETATTR;
5044 		break;
5045 	case IPC_STAT:
5046 	case SEM_STAT:
5047 		perms = SEM__GETATTR | SEM__ASSOCIATE;
5048 		break;
5049 	default:
5050 		return 0;
5051 	}
5052 
5053 	err = ipc_has_perm(&sma->sem_perm, perms);
5054 	return err;
5055 }
5056 
5057 static int selinux_sem_semop(struct sem_array *sma,
5058 			     struct sembuf *sops, unsigned nsops, int alter)
5059 {
5060 	u32 perms;
5061 
5062 	if (alter)
5063 		perms = SEM__READ | SEM__WRITE;
5064 	else
5065 		perms = SEM__READ;
5066 
5067 	return ipc_has_perm(&sma->sem_perm, perms);
5068 }
5069 
5070 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5071 {
5072 	u32 av = 0;
5073 
5074 	av = 0;
5075 	if (flag & S_IRUGO)
5076 		av |= IPC__UNIX_READ;
5077 	if (flag & S_IWUGO)
5078 		av |= IPC__UNIX_WRITE;
5079 
5080 	if (av == 0)
5081 		return 0;
5082 
5083 	return ipc_has_perm(ipcp, av);
5084 }
5085 
5086 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5087 {
5088 	struct ipc_security_struct *isec = ipcp->security;
5089 	*secid = isec->sid;
5090 }
5091 
5092 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5093 {
5094 	if (inode)
5095 		inode_doinit_with_dentry(inode, dentry);
5096 }
5097 
5098 static int selinux_getprocattr(struct task_struct *p,
5099 			       char *name, char **value)
5100 {
5101 	struct task_security_struct *tsec;
5102 	u32 sid;
5103 	int error;
5104 	unsigned len;
5105 
5106 	if (current != p) {
5107 		error = task_has_perm(current, p, PROCESS__GETATTR);
5108 		if (error)
5109 			return error;
5110 	}
5111 
5112 	tsec = p->security;
5113 
5114 	if (!strcmp(name, "current"))
5115 		sid = tsec->sid;
5116 	else if (!strcmp(name, "prev"))
5117 		sid = tsec->osid;
5118 	else if (!strcmp(name, "exec"))
5119 		sid = tsec->exec_sid;
5120 	else if (!strcmp(name, "fscreate"))
5121 		sid = tsec->create_sid;
5122 	else if (!strcmp(name, "keycreate"))
5123 		sid = tsec->keycreate_sid;
5124 	else if (!strcmp(name, "sockcreate"))
5125 		sid = tsec->sockcreate_sid;
5126 	else
5127 		return -EINVAL;
5128 
5129 	if (!sid)
5130 		return 0;
5131 
5132 	error = security_sid_to_context(sid, value, &len);
5133 	if (error)
5134 		return error;
5135 	return len;
5136 }
5137 
5138 static int selinux_setprocattr(struct task_struct *p,
5139 			       char *name, void *value, size_t size)
5140 {
5141 	struct task_security_struct *tsec;
5142 	struct task_struct *tracer;
5143 	u32 sid = 0;
5144 	int error;
5145 	char *str = value;
5146 
5147 	if (current != p) {
5148 		/* SELinux only allows a process to change its own
5149 		   security attributes. */
5150 		return -EACCES;
5151 	}
5152 
5153 	/*
5154 	 * Basic control over ability to set these attributes at all.
5155 	 * current == p, but we'll pass them separately in case the
5156 	 * above restriction is ever removed.
5157 	 */
5158 	if (!strcmp(name, "exec"))
5159 		error = task_has_perm(current, p, PROCESS__SETEXEC);
5160 	else if (!strcmp(name, "fscreate"))
5161 		error = task_has_perm(current, p, PROCESS__SETFSCREATE);
5162 	else if (!strcmp(name, "keycreate"))
5163 		error = task_has_perm(current, p, PROCESS__SETKEYCREATE);
5164 	else if (!strcmp(name, "sockcreate"))
5165 		error = task_has_perm(current, p, PROCESS__SETSOCKCREATE);
5166 	else if (!strcmp(name, "current"))
5167 		error = task_has_perm(current, p, PROCESS__SETCURRENT);
5168 	else
5169 		error = -EINVAL;
5170 	if (error)
5171 		return error;
5172 
5173 	/* Obtain a SID for the context, if one was specified. */
5174 	if (size && str[1] && str[1] != '\n') {
5175 		if (str[size-1] == '\n') {
5176 			str[size-1] = 0;
5177 			size--;
5178 		}
5179 		error = security_context_to_sid(value, size, &sid);
5180 		if (error == -EINVAL && !strcmp(name, "fscreate")) {
5181 			if (!capable(CAP_MAC_ADMIN))
5182 				return error;
5183 			error = security_context_to_sid_force(value, size,
5184 							      &sid);
5185 		}
5186 		if (error)
5187 			return error;
5188 	}
5189 
5190 	/* Permission checking based on the specified context is
5191 	   performed during the actual operation (execve,
5192 	   open/mkdir/...), when we know the full context of the
5193 	   operation.  See selinux_bprm_set_security for the execve
5194 	   checks and may_create for the file creation checks. The
5195 	   operation will then fail if the context is not permitted. */
5196 	tsec = p->security;
5197 	if (!strcmp(name, "exec"))
5198 		tsec->exec_sid = sid;
5199 	else if (!strcmp(name, "fscreate"))
5200 		tsec->create_sid = sid;
5201 	else if (!strcmp(name, "keycreate")) {
5202 		error = may_create_key(sid, p);
5203 		if (error)
5204 			return error;
5205 		tsec->keycreate_sid = sid;
5206 	} else if (!strcmp(name, "sockcreate"))
5207 		tsec->sockcreate_sid = sid;
5208 	else if (!strcmp(name, "current")) {
5209 		struct av_decision avd;
5210 
5211 		if (sid == 0)
5212 			return -EINVAL;
5213 
5214 		/* Only allow single threaded processes to change context */
5215 		if (atomic_read(&p->mm->mm_users) != 1) {
5216 			struct task_struct *g, *t;
5217 			struct mm_struct *mm = p->mm;
5218 			read_lock(&tasklist_lock);
5219 			do_each_thread(g, t) {
5220 				if (t->mm == mm && t != p) {
5221 					read_unlock(&tasklist_lock);
5222 					return -EPERM;
5223 				}
5224 			} while_each_thread(g, t);
5225 			read_unlock(&tasklist_lock);
5226 		}
5227 
5228 		/* Check permissions for the transition. */
5229 		error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5230 				     PROCESS__DYNTRANSITION, NULL);
5231 		if (error)
5232 			return error;
5233 
5234 		/* Check for ptracing, and update the task SID if ok.
5235 		   Otherwise, leave SID unchanged and fail. */
5236 		task_lock(p);
5237 		rcu_read_lock();
5238 		tracer = tracehook_tracer_task(p);
5239 		if (tracer != NULL) {
5240 			struct task_security_struct *ptsec = tracer->security;
5241 			u32 ptsid = ptsec->sid;
5242 			rcu_read_unlock();
5243 			error = avc_has_perm_noaudit(ptsid, sid,
5244 						     SECCLASS_PROCESS,
5245 						     PROCESS__PTRACE, 0, &avd);
5246 			if (!error)
5247 				tsec->sid = sid;
5248 			task_unlock(p);
5249 			avc_audit(ptsid, sid, SECCLASS_PROCESS,
5250 				  PROCESS__PTRACE, &avd, error, NULL);
5251 			if (error)
5252 				return error;
5253 		} else {
5254 			rcu_read_unlock();
5255 			tsec->sid = sid;
5256 			task_unlock(p);
5257 		}
5258 	} else
5259 		return -EINVAL;
5260 
5261 	return size;
5262 }
5263 
5264 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5265 {
5266 	return security_sid_to_context(secid, secdata, seclen);
5267 }
5268 
5269 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5270 {
5271 	return security_context_to_sid(secdata, seclen, secid);
5272 }
5273 
5274 static void selinux_release_secctx(char *secdata, u32 seclen)
5275 {
5276 	kfree(secdata);
5277 }
5278 
5279 #ifdef CONFIG_KEYS
5280 
5281 static int selinux_key_alloc(struct key *k, struct task_struct *tsk,
5282 			     unsigned long flags)
5283 {
5284 	struct task_security_struct *tsec = tsk->security;
5285 	struct key_security_struct *ksec;
5286 
5287 	ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5288 	if (!ksec)
5289 		return -ENOMEM;
5290 
5291 	if (tsec->keycreate_sid)
5292 		ksec->sid = tsec->keycreate_sid;
5293 	else
5294 		ksec->sid = tsec->sid;
5295 	k->security = ksec;
5296 
5297 	return 0;
5298 }
5299 
5300 static void selinux_key_free(struct key *k)
5301 {
5302 	struct key_security_struct *ksec = k->security;
5303 
5304 	k->security = NULL;
5305 	kfree(ksec);
5306 }
5307 
5308 static int selinux_key_permission(key_ref_t key_ref,
5309 			    struct task_struct *ctx,
5310 			    key_perm_t perm)
5311 {
5312 	struct key *key;
5313 	struct task_security_struct *tsec;
5314 	struct key_security_struct *ksec;
5315 
5316 	key = key_ref_to_ptr(key_ref);
5317 
5318 	tsec = ctx->security;
5319 	ksec = key->security;
5320 
5321 	/* if no specific permissions are requested, we skip the
5322 	   permission check. No serious, additional covert channels
5323 	   appear to be created. */
5324 	if (perm == 0)
5325 		return 0;
5326 
5327 	return avc_has_perm(tsec->sid, ksec->sid,
5328 			    SECCLASS_KEY, perm, NULL);
5329 }
5330 
5331 static int selinux_key_getsecurity(struct key *key, char **_buffer)
5332 {
5333 	struct key_security_struct *ksec = key->security;
5334 	char *context = NULL;
5335 	unsigned len;
5336 	int rc;
5337 
5338 	rc = security_sid_to_context(ksec->sid, &context, &len);
5339 	if (!rc)
5340 		rc = len;
5341 	*_buffer = context;
5342 	return rc;
5343 }
5344 
5345 #endif
5346 
5347 static struct security_operations selinux_ops = {
5348 	.name =				"selinux",
5349 
5350 	.ptrace =			selinux_ptrace,
5351 	.capget =			selinux_capget,
5352 	.capset_check =			selinux_capset_check,
5353 	.capset_set =			selinux_capset_set,
5354 	.sysctl =			selinux_sysctl,
5355 	.capable =			selinux_capable,
5356 	.quotactl =			selinux_quotactl,
5357 	.quota_on =			selinux_quota_on,
5358 	.syslog =			selinux_syslog,
5359 	.vm_enough_memory =		selinux_vm_enough_memory,
5360 
5361 	.netlink_send =			selinux_netlink_send,
5362 	.netlink_recv =			selinux_netlink_recv,
5363 
5364 	.bprm_alloc_security =		selinux_bprm_alloc_security,
5365 	.bprm_free_security =		selinux_bprm_free_security,
5366 	.bprm_apply_creds =		selinux_bprm_apply_creds,
5367 	.bprm_post_apply_creds =	selinux_bprm_post_apply_creds,
5368 	.bprm_set_security =		selinux_bprm_set_security,
5369 	.bprm_check_security =		selinux_bprm_check_security,
5370 	.bprm_secureexec =		selinux_bprm_secureexec,
5371 
5372 	.sb_alloc_security =		selinux_sb_alloc_security,
5373 	.sb_free_security =		selinux_sb_free_security,
5374 	.sb_copy_data =			selinux_sb_copy_data,
5375 	.sb_kern_mount =		selinux_sb_kern_mount,
5376 	.sb_show_options =		selinux_sb_show_options,
5377 	.sb_statfs =			selinux_sb_statfs,
5378 	.sb_mount =			selinux_mount,
5379 	.sb_umount =			selinux_umount,
5380 	.sb_set_mnt_opts =		selinux_set_mnt_opts,
5381 	.sb_clone_mnt_opts =		selinux_sb_clone_mnt_opts,
5382 	.sb_parse_opts_str = 		selinux_parse_opts_str,
5383 
5384 
5385 	.inode_alloc_security =		selinux_inode_alloc_security,
5386 	.inode_free_security =		selinux_inode_free_security,
5387 	.inode_init_security =		selinux_inode_init_security,
5388 	.inode_create =			selinux_inode_create,
5389 	.inode_link =			selinux_inode_link,
5390 	.inode_unlink =			selinux_inode_unlink,
5391 	.inode_symlink =		selinux_inode_symlink,
5392 	.inode_mkdir =			selinux_inode_mkdir,
5393 	.inode_rmdir =			selinux_inode_rmdir,
5394 	.inode_mknod =			selinux_inode_mknod,
5395 	.inode_rename =			selinux_inode_rename,
5396 	.inode_readlink =		selinux_inode_readlink,
5397 	.inode_follow_link =		selinux_inode_follow_link,
5398 	.inode_permission =		selinux_inode_permission,
5399 	.inode_setattr =		selinux_inode_setattr,
5400 	.inode_getattr =		selinux_inode_getattr,
5401 	.inode_setxattr =		selinux_inode_setxattr,
5402 	.inode_post_setxattr =		selinux_inode_post_setxattr,
5403 	.inode_getxattr =		selinux_inode_getxattr,
5404 	.inode_listxattr =		selinux_inode_listxattr,
5405 	.inode_removexattr =		selinux_inode_removexattr,
5406 	.inode_getsecurity =		selinux_inode_getsecurity,
5407 	.inode_setsecurity =		selinux_inode_setsecurity,
5408 	.inode_listsecurity =		selinux_inode_listsecurity,
5409 	.inode_need_killpriv =		selinux_inode_need_killpriv,
5410 	.inode_killpriv =		selinux_inode_killpriv,
5411 	.inode_getsecid =		selinux_inode_getsecid,
5412 
5413 	.file_permission =		selinux_file_permission,
5414 	.file_alloc_security =		selinux_file_alloc_security,
5415 	.file_free_security =		selinux_file_free_security,
5416 	.file_ioctl =			selinux_file_ioctl,
5417 	.file_mmap =			selinux_file_mmap,
5418 	.file_mprotect =		selinux_file_mprotect,
5419 	.file_lock =			selinux_file_lock,
5420 	.file_fcntl =			selinux_file_fcntl,
5421 	.file_set_fowner =		selinux_file_set_fowner,
5422 	.file_send_sigiotask =		selinux_file_send_sigiotask,
5423 	.file_receive =			selinux_file_receive,
5424 
5425 	.dentry_open =			selinux_dentry_open,
5426 
5427 	.task_create =			selinux_task_create,
5428 	.task_alloc_security =		selinux_task_alloc_security,
5429 	.task_free_security =		selinux_task_free_security,
5430 	.task_setuid =			selinux_task_setuid,
5431 	.task_post_setuid =		selinux_task_post_setuid,
5432 	.task_setgid =			selinux_task_setgid,
5433 	.task_setpgid =			selinux_task_setpgid,
5434 	.task_getpgid =			selinux_task_getpgid,
5435 	.task_getsid =			selinux_task_getsid,
5436 	.task_getsecid =		selinux_task_getsecid,
5437 	.task_setgroups =		selinux_task_setgroups,
5438 	.task_setnice =			selinux_task_setnice,
5439 	.task_setioprio =		selinux_task_setioprio,
5440 	.task_getioprio =		selinux_task_getioprio,
5441 	.task_setrlimit =		selinux_task_setrlimit,
5442 	.task_setscheduler =		selinux_task_setscheduler,
5443 	.task_getscheduler =		selinux_task_getscheduler,
5444 	.task_movememory =		selinux_task_movememory,
5445 	.task_kill =			selinux_task_kill,
5446 	.task_wait =			selinux_task_wait,
5447 	.task_prctl =			selinux_task_prctl,
5448 	.task_reparent_to_init =	selinux_task_reparent_to_init,
5449 	.task_to_inode =		selinux_task_to_inode,
5450 
5451 	.ipc_permission =		selinux_ipc_permission,
5452 	.ipc_getsecid =			selinux_ipc_getsecid,
5453 
5454 	.msg_msg_alloc_security =	selinux_msg_msg_alloc_security,
5455 	.msg_msg_free_security =	selinux_msg_msg_free_security,
5456 
5457 	.msg_queue_alloc_security =	selinux_msg_queue_alloc_security,
5458 	.msg_queue_free_security =	selinux_msg_queue_free_security,
5459 	.msg_queue_associate =		selinux_msg_queue_associate,
5460 	.msg_queue_msgctl =		selinux_msg_queue_msgctl,
5461 	.msg_queue_msgsnd =		selinux_msg_queue_msgsnd,
5462 	.msg_queue_msgrcv =		selinux_msg_queue_msgrcv,
5463 
5464 	.shm_alloc_security =		selinux_shm_alloc_security,
5465 	.shm_free_security =		selinux_shm_free_security,
5466 	.shm_associate =		selinux_shm_associate,
5467 	.shm_shmctl =			selinux_shm_shmctl,
5468 	.shm_shmat =			selinux_shm_shmat,
5469 
5470 	.sem_alloc_security =		selinux_sem_alloc_security,
5471 	.sem_free_security =		selinux_sem_free_security,
5472 	.sem_associate =		selinux_sem_associate,
5473 	.sem_semctl =			selinux_sem_semctl,
5474 	.sem_semop =			selinux_sem_semop,
5475 
5476 	.d_instantiate =		selinux_d_instantiate,
5477 
5478 	.getprocattr =			selinux_getprocattr,
5479 	.setprocattr =			selinux_setprocattr,
5480 
5481 	.secid_to_secctx =		selinux_secid_to_secctx,
5482 	.secctx_to_secid =		selinux_secctx_to_secid,
5483 	.release_secctx =		selinux_release_secctx,
5484 
5485 	.unix_stream_connect =		selinux_socket_unix_stream_connect,
5486 	.unix_may_send =		selinux_socket_unix_may_send,
5487 
5488 	.socket_create =		selinux_socket_create,
5489 	.socket_post_create =		selinux_socket_post_create,
5490 	.socket_bind =			selinux_socket_bind,
5491 	.socket_connect =		selinux_socket_connect,
5492 	.socket_listen =		selinux_socket_listen,
5493 	.socket_accept =		selinux_socket_accept,
5494 	.socket_sendmsg =		selinux_socket_sendmsg,
5495 	.socket_recvmsg =		selinux_socket_recvmsg,
5496 	.socket_getsockname =		selinux_socket_getsockname,
5497 	.socket_getpeername =		selinux_socket_getpeername,
5498 	.socket_getsockopt =		selinux_socket_getsockopt,
5499 	.socket_setsockopt =		selinux_socket_setsockopt,
5500 	.socket_shutdown =		selinux_socket_shutdown,
5501 	.socket_sock_rcv_skb =		selinux_socket_sock_rcv_skb,
5502 	.socket_getpeersec_stream =	selinux_socket_getpeersec_stream,
5503 	.socket_getpeersec_dgram =	selinux_socket_getpeersec_dgram,
5504 	.sk_alloc_security =		selinux_sk_alloc_security,
5505 	.sk_free_security =		selinux_sk_free_security,
5506 	.sk_clone_security =		selinux_sk_clone_security,
5507 	.sk_getsecid =			selinux_sk_getsecid,
5508 	.sock_graft =			selinux_sock_graft,
5509 	.inet_conn_request =		selinux_inet_conn_request,
5510 	.inet_csk_clone =		selinux_inet_csk_clone,
5511 	.inet_conn_established =	selinux_inet_conn_established,
5512 	.req_classify_flow =		selinux_req_classify_flow,
5513 
5514 #ifdef CONFIG_SECURITY_NETWORK_XFRM
5515 	.xfrm_policy_alloc_security =	selinux_xfrm_policy_alloc,
5516 	.xfrm_policy_clone_security =	selinux_xfrm_policy_clone,
5517 	.xfrm_policy_free_security =	selinux_xfrm_policy_free,
5518 	.xfrm_policy_delete_security =	selinux_xfrm_policy_delete,
5519 	.xfrm_state_alloc_security =	selinux_xfrm_state_alloc,
5520 	.xfrm_state_free_security =	selinux_xfrm_state_free,
5521 	.xfrm_state_delete_security =	selinux_xfrm_state_delete,
5522 	.xfrm_policy_lookup =		selinux_xfrm_policy_lookup,
5523 	.xfrm_state_pol_flow_match =	selinux_xfrm_state_pol_flow_match,
5524 	.xfrm_decode_session =		selinux_xfrm_decode_session,
5525 #endif
5526 
5527 #ifdef CONFIG_KEYS
5528 	.key_alloc =			selinux_key_alloc,
5529 	.key_free =			selinux_key_free,
5530 	.key_permission =		selinux_key_permission,
5531 	.key_getsecurity =		selinux_key_getsecurity,
5532 #endif
5533 
5534 #ifdef CONFIG_AUDIT
5535 	.audit_rule_init =		selinux_audit_rule_init,
5536 	.audit_rule_known =		selinux_audit_rule_known,
5537 	.audit_rule_match =		selinux_audit_rule_match,
5538 	.audit_rule_free =		selinux_audit_rule_free,
5539 #endif
5540 };
5541 
5542 static __init int selinux_init(void)
5543 {
5544 	struct task_security_struct *tsec;
5545 
5546 	if (!security_module_enable(&selinux_ops)) {
5547 		selinux_enabled = 0;
5548 		return 0;
5549 	}
5550 
5551 	if (!selinux_enabled) {
5552 		printk(KERN_INFO "SELinux:  Disabled at boot.\n");
5553 		return 0;
5554 	}
5555 
5556 	printk(KERN_INFO "SELinux:  Initializing.\n");
5557 
5558 	/* Set the security state for the initial task. */
5559 	if (task_alloc_security(current))
5560 		panic("SELinux:  Failed to initialize initial task.\n");
5561 	tsec = current->security;
5562 	tsec->osid = tsec->sid = SECINITSID_KERNEL;
5563 
5564 	sel_inode_cache = kmem_cache_create("selinux_inode_security",
5565 					    sizeof(struct inode_security_struct),
5566 					    0, SLAB_PANIC, NULL);
5567 	avc_init();
5568 
5569 	secondary_ops = security_ops;
5570 	if (!secondary_ops)
5571 		panic("SELinux: No initial security operations\n");
5572 	if (register_security(&selinux_ops))
5573 		panic("SELinux: Unable to register with kernel.\n");
5574 
5575 	if (selinux_enforcing)
5576 		printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
5577 	else
5578 		printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
5579 
5580 	return 0;
5581 }
5582 
5583 void selinux_complete_init(void)
5584 {
5585 	printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
5586 
5587 	/* Set up any superblocks initialized prior to the policy load. */
5588 	printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
5589 	spin_lock(&sb_lock);
5590 	spin_lock(&sb_security_lock);
5591 next_sb:
5592 	if (!list_empty(&superblock_security_head)) {
5593 		struct superblock_security_struct *sbsec =
5594 				list_entry(superblock_security_head.next,
5595 					   struct superblock_security_struct,
5596 					   list);
5597 		struct super_block *sb = sbsec->sb;
5598 		sb->s_count++;
5599 		spin_unlock(&sb_security_lock);
5600 		spin_unlock(&sb_lock);
5601 		down_read(&sb->s_umount);
5602 		if (sb->s_root)
5603 			superblock_doinit(sb, NULL);
5604 		drop_super(sb);
5605 		spin_lock(&sb_lock);
5606 		spin_lock(&sb_security_lock);
5607 		list_del_init(&sbsec->list);
5608 		goto next_sb;
5609 	}
5610 	spin_unlock(&sb_security_lock);
5611 	spin_unlock(&sb_lock);
5612 }
5613 
5614 /* SELinux requires early initialization in order to label
5615    all processes and objects when they are created. */
5616 security_initcall(selinux_init);
5617 
5618 #if defined(CONFIG_NETFILTER)
5619 
5620 static struct nf_hook_ops selinux_ipv4_ops[] = {
5621 	{
5622 		.hook =		selinux_ipv4_postroute,
5623 		.owner =	THIS_MODULE,
5624 		.pf =		PF_INET,
5625 		.hooknum =	NF_INET_POST_ROUTING,
5626 		.priority =	NF_IP_PRI_SELINUX_LAST,
5627 	},
5628 	{
5629 		.hook =		selinux_ipv4_forward,
5630 		.owner =	THIS_MODULE,
5631 		.pf =		PF_INET,
5632 		.hooknum =	NF_INET_FORWARD,
5633 		.priority =	NF_IP_PRI_SELINUX_FIRST,
5634 	}
5635 };
5636 
5637 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5638 
5639 static struct nf_hook_ops selinux_ipv6_ops[] = {
5640 	{
5641 		.hook =		selinux_ipv6_postroute,
5642 		.owner =	THIS_MODULE,
5643 		.pf =		PF_INET6,
5644 		.hooknum =	NF_INET_POST_ROUTING,
5645 		.priority =	NF_IP6_PRI_SELINUX_LAST,
5646 	},
5647 	{
5648 		.hook =		selinux_ipv6_forward,
5649 		.owner =	THIS_MODULE,
5650 		.pf =		PF_INET6,
5651 		.hooknum =	NF_INET_FORWARD,
5652 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
5653 	}
5654 };
5655 
5656 #endif	/* IPV6 */
5657 
5658 static int __init selinux_nf_ip_init(void)
5659 {
5660 	int err = 0;
5661 
5662 	if (!selinux_enabled)
5663 		goto out;
5664 
5665 	printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
5666 
5667 	err = nf_register_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5668 	if (err)
5669 		panic("SELinux: nf_register_hooks for IPv4: error %d\n", err);
5670 
5671 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5672 	err = nf_register_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5673 	if (err)
5674 		panic("SELinux: nf_register_hooks for IPv6: error %d\n", err);
5675 #endif	/* IPV6 */
5676 
5677 out:
5678 	return err;
5679 }
5680 
5681 __initcall(selinux_nf_ip_init);
5682 
5683 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5684 static void selinux_nf_ip_exit(void)
5685 {
5686 	printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
5687 
5688 	nf_unregister_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5689 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5690 	nf_unregister_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5691 #endif	/* IPV6 */
5692 }
5693 #endif
5694 
5695 #else /* CONFIG_NETFILTER */
5696 
5697 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5698 #define selinux_nf_ip_exit()
5699 #endif
5700 
5701 #endif /* CONFIG_NETFILTER */
5702 
5703 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5704 static int selinux_disabled;
5705 
5706 int selinux_disable(void)
5707 {
5708 	extern void exit_sel_fs(void);
5709 
5710 	if (ss_initialized) {
5711 		/* Not permitted after initial policy load. */
5712 		return -EINVAL;
5713 	}
5714 
5715 	if (selinux_disabled) {
5716 		/* Only do this once. */
5717 		return -EINVAL;
5718 	}
5719 
5720 	printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
5721 
5722 	selinux_disabled = 1;
5723 	selinux_enabled = 0;
5724 
5725 	/* Reset security_ops to the secondary module, dummy or capability. */
5726 	security_ops = secondary_ops;
5727 
5728 	/* Unregister netfilter hooks. */
5729 	selinux_nf_ip_exit();
5730 
5731 	/* Unregister selinuxfs. */
5732 	exit_sel_fs();
5733 
5734 	return 0;
5735 }
5736 #endif
5737