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