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