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