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