]> Git Repo - J-linux.git/commitdiff
Merge tag 'selinux-pr-20230829' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Wed, 30 Aug 2023 15:51:16 +0000 (08:51 -0700)
committerLinus Torvalds <[email protected]>
Wed, 30 Aug 2023 15:51:16 +0000 (08:51 -0700)
Pull selinux updates from Paul Moore:
 "Thirty three SELinux patches, which is a pretty big number for us, but
  there isn't really anything scary in here; in fact we actually manage
  to remove 10 lines of code with this :)

   - Promote the SELinux DEBUG_HASHES macro to CONFIG_SECURITY_SELINUX_DEBUG

     The DEBUG_HASHES macro was a buried SELinux specific preprocessor
     debug macro that was a problem waiting to happen. Promoting the
     debug macro to a proper Kconfig setting should help both improve
     the visibility of the feature as well enable improved test
     coverage. We've moved some additional debug functions under the
     CONFIG_SECURITY_SELINUX_DEBUG flag and we may see more work in the
     future.

   - Emit a pr_notice() message if virtual memory is executable by default

     As this impacts the SELinux access control policy enforcement, if
     the system's configuration is such that virtual memory is
     executable by default we print a single line notice to the console.

   - Drop avtab_search() in favor of avtab_search_node()

     Both functions are nearly identical so we removed avtab_search()
     and converted the callers to avtab_search_node().

   - Add some SELinux network auditing helpers

     The helpers not only reduce a small amount of code duplication, but
     they provide an opportunity to improve UDP flood performance
     slightly by delaying initialization of the audit data in some
     cases.

   - Convert GFP_ATOMIC allocators to GFP_KERNEL when reading SELinux policy

     There were two SELinux policy load helper functions that were
     allocating memory using GFP_ATOMIC, they have been converted to
     GFP_KERNEL.

   - Quiet a KMSAN warning in selinux_inet_conn_request()

     A one-line error path (re)set patch that resolves a KMSAN warning.
     It is important to note that this doesn't represent a real bug in
     the current code, but it quiets KMSAN and arguably hardens the code
     against future changes.

   - Cleanup the policy capability accessor functions

     This is a follow-up to the patch which reverted SELinux to using a
     global selinux_state pointer. This patch cleans up some artifacts
     of that change and turns each accessor into a one-line READ_ONCE()
     call into the policy capabilities array.

   - A number of patches from Christian Göttsche

     Christian submitted almost two-thirds of the patches in this pull
     request as he worked to harden the SELinux code against type
     differences, variable overflows, etc.

   - Support for separating early userspace from the kernel in policy,
     with a later revert

     We did have a patch that added a new userspace initial SID which
     would allow SELinux to distinguish between early user processes
     created before the initial policy load and the kernel itself.

     Unfortunately additional post-merge testing revealed a problematic
     interaction with an old SELinux userspace on an old version of
     Ubuntu so we've reverted the patch until we can resolve the
     compatibility issue.

   - Remove some outdated comments dealing with LSM hook registration

     When we removed the runtime disable functionality we forgot to
     remove some old comments discussing the importance of LSM hook
     registration ordering.

   - Minor administrative changes

     Stephen Smalley updated his email address and "debranded" SELinux
     from "NSA SELinux" to simply "SELinux". We've come a long way from
     the original NSA submission and I would consider SELinux a true
     community project at this point so removing the NSA branding just
     makes sense"

* tag 'selinux-pr-20230829' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux: (33 commits)
  selinux: prevent KMSAN warning in selinux_inet_conn_request()
  selinux: use unsigned iterator in nlmsgtab code
  selinux: avoid implicit conversions in policydb code
  selinux: avoid implicit conversions in selinuxfs code
  selinux: make left shifts well defined
  selinux: update type for number of class permissions in services code
  selinux: avoid implicit conversions in avtab code
  selinux: revert SECINITSID_INIT support
  selinux: use GFP_KERNEL while reading binary policy
  selinux: update comment on selinux_hooks[]
  selinux: avoid implicit conversions in services code
  selinux: avoid implicit conversions in mls code
  selinux: use identical iterator type in hashtab_duplicate()
  selinux: move debug functions into debug configuration
  selinux: log about VM being executable by default
  selinux: fix a 0/NULL mistmatch in ad_net_init_from_iif()
  selinux: introduce SECURITY_SELINUX_DEBUG configuration
  selinux: introduce and use lsm_ad_net_init*() helpers
  selinux: update my email address
  selinux: add missing newlines in pr_err() statements
  ...

1  2 
security/selinux/hooks.c
security/selinux/selinuxfs.c
security/selinux/ss/policydb.c

diff --combined security/selinux/hooks.c
index 3363716ee80a6260a80e1a7663b26b0827e8910b,7138083c5beff8158ddea4ec27ae315959398f97..89f3e7c7a5964ea03c4d146c039e93a9301427fa
@@@ -1,10 -1,10 +1,10 @@@
  // SPDX-License-Identifier: GPL-2.0-only
  /*
-  *  NSA Security-Enhanced Linux (SELinux) security module
+  *  Security-Enhanced Linux (SELinux) security module
   *
   *  This file contains the SELinux hook function implementations.
   *
-  *  Authors:  Stephen Smalley, <s[email protected]>
+  *  Authors:  Stephen Smalley, <s[email protected]>
   *          Chris Vance, <[email protected]>
   *          Wayne Salamon, <[email protected]>
   *          James Morris <[email protected]>
@@@ -224,6 -224,31 +224,31 @@@ static inline u32 cred_sid(const struc
        return tsec->sid;
  }
  
+ static void __ad_net_init(struct common_audit_data *ad,
+                         struct lsm_network_audit *net,
+                         int ifindex, struct sock *sk, u16 family)
+ {
+       ad->type = LSM_AUDIT_DATA_NET;
+       ad->u.net = net;
+       net->netif = ifindex;
+       net->sk = sk;
+       net->family = family;
+ }
+ static void ad_net_init_from_sk(struct common_audit_data *ad,
+                               struct lsm_network_audit *net,
+                               struct sock *sk)
+ {
+       __ad_net_init(ad, net, 0, sk, 0);
+ }
+ static void ad_net_init_from_iif(struct common_audit_data *ad,
+                                struct lsm_network_audit *net,
+                                int ifindex, u16 family)
+ {
+       __ad_net_init(ad, net, ifindex, NULL, family);
+ }
  /*
   * get the objective security ID of a task
   */
@@@ -1125,7 -1150,7 +1150,7 @@@ static inline int default_protocol_dgra
  
  static inline u16 socket_type_to_security_class(int family, int type, int protocol)
  {
-       int extsockclass = selinux_policycap_extsockclass();
+       bool extsockclass = selinux_policycap_extsockclass();
  
        switch (family) {
        case PF_UNIX:
@@@ -2745,27 -2770,6 +2770,27 @@@ static int selinux_umount(struct vfsmou
                                   FILESYSTEM__UNMOUNT, NULL);
  }
  
 +static int selinux_fs_context_submount(struct fs_context *fc,
 +                                 struct super_block *reference)
 +{
 +      const struct superblock_security_struct *sbsec;
 +      struct selinux_mnt_opts *opts;
 +
 +      opts = kzalloc(sizeof(*opts), GFP_KERNEL);
 +      if (!opts)
 +              return -ENOMEM;
 +
 +      sbsec = selinux_superblock(reference);
 +      if (sbsec->flags & FSCONTEXT_MNT)
 +              opts->fscontext_sid = sbsec->sid;
 +      if (sbsec->flags & CONTEXT_MNT)
 +              opts->context_sid = sbsec->mntpoint_sid;
 +      if (sbsec->flags & DEFCONTEXT_MNT)
 +              opts->defcontext_sid = sbsec->def_sid;
 +      fc->security = opts;
 +      return 0;
 +}
 +
  static int selinux_fs_context_dup(struct fs_context *fc,
                                  struct fs_context *src_fc)
  {
@@@ -2938,7 -2942,7 +2963,7 @@@ static int selinux_inode_init_security_
                struct inode_security_struct *context_isec =
                        selinux_inode(context_inode);
                if (context_isec->initialized != LABEL_INITIALIZED) {
-                       pr_err("SELinux:  context_inode is not initialized");
+                       pr_err("SELinux:  context_inode is not initialized\n");
                        return -EACCES;
                }
  
@@@ -3783,10 -3787,13 +3808,10 @@@ static int selinux_file_mprotect(struc
        if (default_noexec &&
            (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
                int rc = 0;
 -              if (vma->vm_start >= vma->vm_mm->start_brk &&
 -                  vma->vm_end <= vma->vm_mm->brk) {
 +              if (vma_is_initial_heap(vma)) {
                        rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
                                          PROCESS__EXECHEAP, NULL);
 -              } else if (!vma->vm_file &&
 -                         ((vma->vm_start <= vma->vm_mm->start_stack &&
 -                           vma->vm_end >= vma->vm_mm->start_stack) ||
 +              } else if (!vma->vm_file && (vma_is_initial_stack(vma) ||
                            vma_is_stack_for_current(vma))) {
                        rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
                                          PROCESS__EXECSTACK, NULL);
@@@ -4517,14 -4524,12 +4542,12 @@@ static int sock_has_perm(struct sock *s
  {
        struct sk_security_struct *sksec = sk->sk_security;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
  
        if (sksec->sid == SECINITSID_KERNEL)
                return 0;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->sk = sk;
+       ad_net_init_from_sk(&ad, &net, sk);
  
        return avc_has_perm(current_sid(), sksec->sid, sksec->sclass, perms,
                            &ad);
@@@ -4917,12 -4922,10 +4940,10 @@@ static int selinux_socket_unix_stream_c
        struct sk_security_struct *sksec_other = other->sk_security;
        struct sk_security_struct *sksec_new = newsk->sk_security;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        int err;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->sk = other;
+       ad_net_init_from_sk(&ad, &net, other);
  
        err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
                           sksec_other->sclass,
@@@ -4949,11 -4952,9 +4970,9 @@@ static int selinux_socket_unix_may_send
        struct sk_security_struct *ssec = sock->sk->sk_security;
        struct sk_security_struct *osec = other->sk->sk_security;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->sk = other->sk;
+       ad_net_init_from_sk(&ad, &net, other->sk);
  
        return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
                            &ad);
@@@ -4989,13 -4990,10 +5008,10 @@@ static int selinux_sock_rcv_skb_compat(
        struct sk_security_struct *sksec = sk->sk_security;
        u32 sk_sid = sksec->sid;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        char *addrp;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->netif = skb->skb_iif;
-       ad.u.net->family = family;
+       ad_net_init_from_iif(&ad, &net, skb->skb_iif, family);
        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
        if (err)
                return err;
  
  static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
  {
-       int err;
+       int err, peerlbl_active, secmark_active;
        struct sk_security_struct *sksec = sk->sk_security;
        u16 family = sk->sk_family;
        u32 sk_sid = sksec->sid;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        char *addrp;
-       u8 secmark_active;
-       u8 peerlbl_active;
  
        if (family != PF_INET && family != PF_INET6)
                return 0;
        if (!secmark_active && !peerlbl_active)
                return 0;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->netif = skb->skb_iif;
-       ad.u.net->family = family;
+       ad_net_init_from_iif(&ad, &net, skb->skb_iif, family);
        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
        if (err)
                return err;
@@@ -5185,12 -5178,12 +5196,12 @@@ static void selinux_sk_clone_security(c
        selinux_netlbl_sk_security_reset(newsksec);
  }
  
 -static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
 +static void selinux_sk_getsecid(const struct sock *sk, u32 *secid)
  {
        if (!sk)
                *secid = SECINITSID_ANY_SOCKET;
        else {
 -              struct sk_security_struct *sksec = sk->sk_security;
 +              const struct sk_security_struct *sksec = sk->sk_security;
  
                *secid = sksec->sid;
        }
@@@ -5219,7 -5212,7 +5230,7 @@@ static int selinux_sctp_process_new_ass
        u16 family = sk->sk_family;
        struct sk_security_struct *sksec = sk->sk_security;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        int err;
  
        /* handle mapped IPv4 packets arriving via IPv6 sockets */
                /* Other association peer SIDs are checked to enforce
                 * consistency among the peer SIDs.
                 */
-               ad.type = LSM_AUDIT_DATA_NET;
-               ad.u.net = &net;
-               ad.u.net->sk = asoc->base.sk;
+               ad_net_init_from_sk(&ad, &net, asoc->base.sk);
                err = avc_has_perm(sksec->peer_sid, asoc->peer_secid,
                                   sksec->sclass, SCTP_SOCKET__ASSOCIATION,
                                   &ad);
@@@ -5488,11 -5479,11 +5497,11 @@@ static void selinux_inet_conn_establish
  
  static int selinux_secmark_relabel_packet(u32 sid)
  {
-       const struct task_security_struct *__tsec;
+       const struct task_security_struct *tsec;
        u32 tsid;
  
-       __tsec = selinux_cred(current_cred());
-       tsid = __tsec->sid;
+       tsec = selinux_cred(current_cred());
+       tsid = tsec->sid;
  
        return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO,
                            NULL);
@@@ -5602,7 -5593,7 +5611,7 @@@ static unsigned int selinux_ip_forward(
        char *addrp;
        u32 peer_sid;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        int secmark_active, peerlbl_active;
  
        if (!selinux_policycap_netpeer())
                return NF_DROP;
  
        ifindex = state->in->ifindex;
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->netif = ifindex;
-       ad.u.net->family = family;
+       ad_net_init_from_iif(&ad, &net, ifindex, family);
        if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
                return NF_DROP;
  
@@@ -5701,7 -5689,7 +5707,7 @@@ static unsigned int selinux_ip_postrout
        struct sock *sk;
        struct sk_security_struct *sksec;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        u8 proto = 0;
  
        sk = skb_to_full_sk(skb);
                return NF_ACCEPT;
        sksec = sk->sk_security;
  
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->netif = state->out->ifindex;
-       ad.u.net->family = state->pf;
+       ad_net_init_from_iif(&ad, &net, state->out->ifindex, state->pf);
        if (selinux_parse_skb(skb, &ad, NULL, 0, &proto))
                return NF_DROP;
  
@@@ -5737,7 -5722,7 +5740,7 @@@ static unsigned int selinux_ip_postrout
        int ifindex;
        struct sock *sk;
        struct common_audit_data ad;
-       struct lsm_network_audit net = {0,};
+       struct lsm_network_audit net;
        char *addrp;
        int secmark_active, peerlbl_active;
  
        }
  
        ifindex = state->out->ifindex;
-       ad.type = LSM_AUDIT_DATA_NET;
-       ad.u.net = &net;
-       ad.u.net->netif = ifindex;
-       ad.u.net->family = family;
+       ad_net_init_from_iif(&ad, &net, ifindex, family);
        if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
                return NF_DROP;
  
@@@ -5990,8 -5972,7 +5990,7 @@@ static int selinux_msg_queue_associate(
  
  static int selinux_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
  {
-       int err;
-       int perms;
+       u32 perms;
  
        switch (cmd) {
        case IPC_INFO:
                return 0;
        }
  
-       err = ipc_has_perm(msq, perms);
-       return err;
+       return ipc_has_perm(msq, perms);
  }
  
  static int selinux_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)
@@@ -6120,8 -6100,7 +6118,7 @@@ static int selinux_shm_associate(struc
  /* Note, at this point, shp is locked down */
  static int selinux_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
  {
-       int perms;
-       int err;
+       u32 perms;
  
        switch (cmd) {
        case IPC_INFO:
                return 0;
        }
  
-       err = ipc_has_perm(shp, perms);
-       return err;
+       return ipc_has_perm(shp, perms);
  }
  
  static int selinux_shm_shmat(struct kern_ipc_perm *shp,
@@@ -6918,7 -6896,7 +6914,7 @@@ static int selinux_uring_override_creds
   */
  static int selinux_uring_sqpoll(void)
  {
-       int sid = current_sid();
+       u32 sid = current_sid();
  
        return avc_has_perm(sid, sid,
                            SECCLASS_IO_URING, IO_URING__SQPOLL, NULL);
@@@ -6957,10 -6935,6 +6953,6 @@@ static int selinux_uring_cmd(struct io_
   *    hooks ("allocating" hooks).
   *
   * Please follow block comment delimiters in the list to keep this order.
-  *
-  * This ordering is needed for SELinux runtime disable to work at least somewhat
-  * safely. Breaking the ordering rules above might lead to NULL pointer derefs
-  * when disabling SELinux at runtime.
   */
  static struct security_hook_list selinux_hooks[] __ro_after_init = {
        LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
        /*
         * PUT "CLONING" (ACCESSING + ALLOCATING) HOOKS HERE
         */
 +      LSM_HOOK_INIT(fs_context_submount, selinux_fs_context_submount),
        LSM_HOOK_INIT(fs_context_dup, selinux_fs_context_dup),
        LSM_HOOK_INIT(fs_context_parse_param, selinux_fs_context_parse_param),
        LSM_HOOK_INIT(sb_eat_lsm_opts, selinux_sb_eat_lsm_opts),
@@@ -7260,6 -7233,8 +7252,8 @@@ static __init int selinux_init(void
        cred_init_security();
  
        default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
+       if (!default_noexec)
+               pr_notice("SELinux:  virtual memory is executable by default\n");
  
        avc_init();
  
index 9dafb6ff110d26fd000b0bc02b2dedf689e2e7e7,107b028d5e400c61adaf5f287090a8318a9ab1c1..6fa640263216fc917635228f42536887a5b05901
@@@ -97,7 -97,7 +97,7 @@@ static int selinux_fs_info_create(struc
  static void selinux_fs_info_free(struct super_block *sb)
  {
        struct selinux_fs_info *fsi = sb->s_fs_info;
-       int i;
+       unsigned int i;
  
        if (fsi) {
                for (i = 0; i < fsi->bool_num; i++)
@@@ -138,7 -138,8 +138,8 @@@ static ssize_t sel_write_enforce(struc
  {
        char *page = NULL;
        ssize_t length;
-       int old_value, new_value;
+       int scan_value;
+       bool old_value, new_value;
  
        if (count >= PAGE_SIZE)
                return -ENOMEM;
                return PTR_ERR(page);
  
        length = -EINVAL;
-       if (sscanf(page, "%d", &new_value) != 1)
+       if (sscanf(page, "%d", &scan_value) != 1)
                goto out;
  
-       new_value = !!new_value;
+       new_value = !!scan_value;
  
        old_value = enforcing_enabled();
        if (new_value != old_value) {
@@@ -1074,8 -1075,8 +1075,8 @@@ static ssize_t sel_write_user(struct fi
        u32 sid, *sids = NULL;
        ssize_t length;
        char *newcon;
-       int i, rc;
-       u32 len, nsids;
+       int rc;
+       u32 i, len, nsids;
  
        length = avc_has_perm(current_sid(), SECINITSID_SECURITY,
                              SECCLASS_SECURITY, SECURITY__COMPUTE_USER,
        return length;
  }
  
- static struct inode *sel_make_inode(struct super_block *sb, int mode)
+ static struct inode *sel_make_inode(struct super_block *sb, umode_t mode)
  {
        struct inode *ret = new_inode(sb);
  
        if (ret) {
                ret->i_mode = mode;
 -              ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret);
 +              ret->i_atime = ret->i_mtime = inode_set_ctime_current(ret);
        }
        return ret;
  }
@@@ -1612,7 -1613,7 +1613,7 @@@ static int sel_make_avc_files(struct de
  {
        struct super_block *sb = dir->d_sb;
        struct selinux_fs_info *fsi = sb->s_fs_info;
-       int i;
+       unsigned int i;
        static const struct tree_descr files[] = {
                { "cache_threshold",
                  &sel_avc_cache_threshold_ops, S_IRUGO|S_IWUSR },
@@@ -1648,7 -1649,7 +1649,7 @@@ static int sel_make_ss_files(struct den
  {
        struct super_block *sb = dir->d_sb;
        struct selinux_fs_info *fsi = sb->s_fs_info;
-       int i;
+       unsigned int i;
        static const struct tree_descr files[] = {
                { "sidtab_hash_stats", &sel_sidtab_hash_stats_ops, S_IRUGO },
        };
@@@ -1699,7 -1700,7 +1700,7 @@@ static const struct file_operations sel
  
  static int sel_make_initcon_files(struct dentry *dir)
  {
-       int i;
+       unsigned int i;
  
        for (i = 1; i <= SECINITSID_NUM; i++) {
                struct inode *inode;
@@@ -1797,7 -1798,8 +1798,8 @@@ static int sel_make_perm_files(struct s
                        char *objclass, int classvalue,
                        struct dentry *dir)
  {
-       int i, rc, nperms;
+       u32 i, nperms;
+       int rc;
        char **perms;
  
        rc = security_get_permissions(newpolicy, objclass, &perms, &nperms);
@@@ -1867,8 -1869,8 +1869,8 @@@ static int sel_make_classes(struct seli
                            struct dentry *class_dir,
                            unsigned long *last_class_ino)
  {
-       int rc, nclasses, i;
+       u32 i, nclasses;
+       int rc;
        char **classes;
  
        rc = security_get_classes(newpolicy, &classes, &nclasses);
index dc904865af58e1bd0f096883f19a519c11e16653,28bd75dc6f7165147c3d017cd76f1325c2f5893e..2d528f699a2297ed798a0d1c1a3d29a5e1cf524c
@@@ -2,7 -2,7 +2,7 @@@
  /*
   * Implementation of the policy database.
   *
-  * Author : Stephen Smalley, <s[email protected]>
+  * Author : Stephen Smalley, <s[email protected]>
   */
  
  /*
@@@ -41,7 -41,7 +41,7 @@@
  #include "mls.h"
  #include "services.h"
  
- #ifdef DEBUG_HASHES
+ #ifdef CONFIG_SECURITY_SELINUX_DEBUG
  static const char *const symtab_name[SYM_NUM] = {
        "common prefixes",
        "classes",
@@@ -55,9 -55,9 +55,9 @@@
  #endif
  
  struct policydb_compat_info {
-       int version;
-       int sym_num;
-       int ocon_num;
+       unsigned int version;
+       unsigned int sym_num;
+       unsigned int ocon_num;
  };
  
  /* These need to be updated if SYM_NUM or OCON_NUM changes */
@@@ -159,9 -159,9 +159,9 @@@ static const struct policydb_compat_inf
        },
  };
  
- static const struct policydb_compat_info *policydb_lookup_compat(int version)
+ static const struct policydb_compat_info *policydb_lookup_compat(unsigned int version)
  {
-       int i;
+       unsigned int i;
  
        for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) {
                if (policydb_compat[i].version == version)
@@@ -359,7 -359,7 +359,7 @@@ static int role_tr_destroy(void *key, v
        return 0;
  }
  
- static void ocontext_destroy(struct ocontext *c, int i)
+ static void ocontext_destroy(struct ocontext *c, unsigned int i)
  {
        if (!c)
                return;
@@@ -678,7 -678,7 +678,7 @@@ static int (*const index_f[SYM_NUM]) (v
        cat_index,
  };
  
- #ifdef DEBUG_HASHES
+ #ifdef CONFIG_SECURITY_SELINUX_DEBUG
  static void hash_eval(struct hashtab *h, const char *hash_name)
  {
        struct hashtab_info info;
@@@ -701,7 -701,10 +701,10 @@@ static void symtab_hash_eval(struct sym
  static inline void hash_eval(struct hashtab *h, const char *hash_name)
  {
  }
- #endif
+ static inline void symtab_hash_eval(struct symtab *s)
+ {
+ }
+ #endif /* CONFIG_SECURITY_SELINUX_DEBUG */
  
  /*
   * Define the other val_to_name and val_to_struct arrays
@@@ -725,10 -728,8 +728,8 @@@ static int policydb_index(struct policy
        pr_debug("SELinux:  %d classes, %d rules\n",
                 p->p_classes.nprim, p->te_avtab.nel);
  
- #ifdef DEBUG_HASHES
        avtab_hash_eval(&p->te_avtab, "rules");
        symtab_hash_eval(p->symtab);
- #endif
  
        p->class_val_to_struct = kcalloc(p->p_classes.nprim,
                                         sizeof(*p->class_val_to_struct),
@@@ -781,7 -782,7 +782,7 @@@ void policydb_destroy(struct policydb *
  {
        struct ocontext *c, *ctmp;
        struct genfs *g, *gtmp;
-       int i;
+       u32 i;
        struct role_allow *ra, *lra = NULL;
  
        for (i = 0; i < SYM_NUM; i++) {
@@@ -1127,8 -1128,8 +1128,8 @@@ static int common_read(struct policydb 
        char *key = NULL;
        struct common_datum *comdatum;
        __le32 buf[4];
-       u32 len, nel;
-       int i, rc;
+       u32 i, len, nel;
+       int rc;
  
        comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL);
        if (!comdatum)
@@@ -1193,13 -1194,13 +1194,13 @@@ static int type_set_read(struct type_se
  
  static int read_cons_helper(struct policydb *p,
                                struct constraint_node **nodep,
-                               int ncons, int allowxtarget, void *fp)
+                               u32 ncons, int allowxtarget, void *fp)
  {
        struct constraint_node *c, *lc;
        struct constraint_expr *e, *le;
        __le32 buf[3];
-       u32 nexpr;
-       int rc, i, j, depth;
+       u32 i, j, nexpr;
+       int rc, depth;
  
        lc = NULL;
        for (i = 0; i < ncons; i++) {
@@@ -1291,8 -1292,8 +1292,8 @@@ static int class_read(struct policydb *
        char *key = NULL;
        struct class_datum *cladatum;
        __le32 buf[6];
-       u32 len, len2, ncons, nel;
-       int i, rc;
+       u32 i, len, len2, ncons, nel;
+       int rc;
  
        cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL);
        if (!cladatum)
@@@ -1385,7 -1386,8 +1386,8 @@@ static int role_read(struct policydb *p
  {
        char *key = NULL;
        struct role_datum *role;
-       int rc, to_read = 2;
+       int rc;
+       unsigned int to_read = 2;
        __le32 buf[3];
        u32 len;
  
@@@ -1441,7 -1443,8 +1443,8 @@@ static int type_read(struct policydb *p
  {
        char *key = NULL;
        struct type_datum *typdatum;
-       int rc, to_read = 3;
+       int rc;
+       unsigned int to_read = 3;
        __le32 buf[4];
        u32 len;
  
@@@ -1515,7 -1518,8 +1518,8 @@@ static int user_read(struct policydb *p
  {
        char *key = NULL;
        struct user_datum *usrdatum;
-       int rc, to_read = 2;
+       int rc;
+       unsigned int to_read = 2;
        __le32 buf[3];
        u32 len;
  
@@@ -1569,7 -1573,7 +1573,7 @@@ static int sens_read(struct policydb *p
        __le32 buf[2];
        u32 len;
  
-       levdatum = kzalloc(sizeof(*levdatum), GFP_ATOMIC);
+       levdatum = kzalloc(sizeof(*levdatum), GFP_KERNEL);
        if (!levdatum)
                return -ENOMEM;
  
        len = le32_to_cpu(buf[0]);
        levdatum->isalias = le32_to_cpu(buf[1]);
  
-       rc = str_read(&key, GFP_ATOMIC, fp, len);
+       rc = str_read(&key, GFP_KERNEL, fp, len);
        if (rc)
                goto bad;
  
        rc = -ENOMEM;
-       levdatum->level = kmalloc(sizeof(*levdatum->level), GFP_ATOMIC);
+       levdatum->level = kmalloc(sizeof(*levdatum->level), GFP_KERNEL);
        if (!levdatum->level)
                goto bad;
  
@@@ -1610,7 -1614,7 +1614,7 @@@ static int cat_read(struct policydb *p
        __le32 buf[3];
        u32 len;
  
-       catdatum = kzalloc(sizeof(*catdatum), GFP_ATOMIC);
+       catdatum = kzalloc(sizeof(*catdatum), GFP_KERNEL);
        if (!catdatum)
                return -ENOMEM;
  
        catdatum->value = le32_to_cpu(buf[1]);
        catdatum->isalias = le32_to_cpu(buf[2]);
  
-       rc = str_read(&key, GFP_ATOMIC, fp, len);
+       rc = str_read(&key, GFP_KERNEL, fp, len);
        if (rc)
                goto bad;
  
@@@ -1656,11 -1660,11 +1660,11 @@@ static int user_bounds_sanity_check(voi
        upper = user = datum;
        while (upper->bounds) {
                struct ebitmap_node *node;
-               unsigned long bit;
+               u32 bit;
  
                if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
                        pr_err("SELinux: user %s: "
-                              "too deep or looped boundary",
+                              "too deep or looped boundary\n",
                               (char *) key);
                        return -EINVAL;
                }
@@@ -1692,7 -1696,7 +1696,7 @@@ static int role_bounds_sanity_check(voi
        upper = role = datum;
        while (upper->bounds) {
                struct ebitmap_node *node;
-               unsigned long bit;
+               u32 bit;
  
                if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
                        pr_err("SELinux: role %s: "
@@@ -1739,7 -1743,7 +1743,7 @@@ static int type_bounds_sanity_check(voi
  
                if (upper->attribute) {
                        pr_err("SELinux: type %s: "
-                              "bounded by attribute %s",
+                              "bounded by attribute %s\n",
                               (char *) key,
                               sym_name(p, SYM_TYPES, upper->value - 1));
                        return -EINVAL;
@@@ -1807,9 -1811,9 +1811,9 @@@ static int range_read(struct policydb *
  {
        struct range_trans *rt = NULL;
        struct mls_range *r = NULL;
-       int i, rc;
+       int rc;
        __le32 buf[2];
-       u32 nel;
+       u32 i, nel;
  
        if (p->policyvers < POLICYDB_VERSION_MLS)
                return 0;
@@@ -2005,7 -2009,6 +2009,7 @@@ static int filename_trans_read_helper(s
                if (!datum)
                        goto out;
  
 +              datum->next = NULL;
                *dst = datum;
  
                /* ebitmap_read() will at least init the bitmap */
                        goto out;
  
                datum->otype = le32_to_cpu(buf[0]);
 -              datum->next = NULL;
  
                dst = &datum->next;
        }
@@@ -2055,9 -2059,9 +2059,9 @@@ out
  
  static int filename_trans_read(struct policydb *p, void *fp)
  {
-       u32 nel;
+       u32 nel, i;
        __le32 buf[1];
-       int rc, i;
+       int rc;
  
        if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
                return 0;
  
  static int genfs_read(struct policydb *p, void *fp)
  {
-       int i, j, rc;
-       u32 nel, nel2, len, len2;
+       int rc;
+       u32 i, j, nel, nel2, len, len2;
        __le32 buf[1];
        struct ocontext *l, *c;
        struct ocontext *newc = NULL;
@@@ -2210,8 -2214,9 +2214,9 @@@ out
  static int ocontext_read(struct policydb *p, const struct policydb_compat_info *info,
                         void *fp)
  {
-       int i, j, rc;
-       u32 nel, len;
+       int rc;
+       unsigned int i;
+       u32 j, nel, len;
        __be64 prefixbuf[1];
        __le32 buf[3];
        struct ocontext *l, *c;
@@@ -2402,9 -2407,9 +2407,9 @@@ int policydb_read(struct policydb *p, v
        struct role_allow *ra, *lra;
        struct role_trans_key *rtk = NULL;
        struct role_trans_datum *rtd = NULL;
-       int i, j, rc;
+       int rc;
        __le32 buf[4];
-       u32 len, nprim, nel, perm;
+       u32 i, j, len, nprim, nel, perm;
  
        char *policydb_str;
        const struct policydb_compat_info *info;
@@@ -3255,7 -3260,8 +3260,8 @@@ static int (*const write_f[SYM_NUM]) (v
  static int ocontext_write(struct policydb *p, const struct policydb_compat_info *info,
                          void *fp)
  {
-       unsigned int i, j, rc;
+       unsigned int i, j;
+       int rc;
        size_t nel, len;
        __be64 prefixbuf[1];
        __le32 buf[3];
@@@ -3604,10 -3610,10 +3610,10 @@@ static int filename_trans_write(struct 
   */
  int policydb_write(struct policydb *p, void *fp)
  {
-       unsigned int i, num_syms;
+       unsigned int num_syms;
        int rc;
        __le32 buf[4];
-       u32 config;
+       u32 config, i;
        size_t len;
        const struct policydb_compat_info *info;
  
        info = policydb_lookup_compat(p->policyvers);
        if (!info) {
                pr_err("SELinux: compatibility lookup failed for policy "
-                   "version %d", p->policyvers);
+                   "version %d\n", p->policyvers);
                return -EINVAL;
        }
  
This page took 0.099975 seconds and 4 git commands to generate.