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