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