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