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