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