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