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