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