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