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