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