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