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