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