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