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