Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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