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