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