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