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