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