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