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