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