Merge tag 'selinux-pr-20220523' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2022 20:06:32 +0000 (13:06 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2022 20:06:32 +0000 (13:06 -0700)
Pull selinux updates from Paul Moore:
 "We've got twelve patches queued for v5.19, with most being fairly
  minor. The highlights are below:

   - The checkreqprot and runtime disable knobs have been deprecated for
     some time with no active users that we can find. In an effort to
     move things along we are adding a pause when the knobs are used to
     help make the deprecation more noticeable in case anyone is still
     using these hacks in the shadows.

   - We've added the anonymous inode class name to the AVC audit records
     when anonymous inodes are involved. This should make writing policy
     easier when anonymous inodes are involved.

   - More constification work. This is fairly straightforward and the
     source of most of the diffstat.

   - The usual minor cleanups: remove unnecessary assignments, assorted
     style/checkpatch fixes, kdoc fixes, macro while-loop
     encapsulations, #include tweaks, etc"

* tag 'selinux-pr-20220523' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux:
  security: declare member holding string literal const
  selinux: log anon inode class name
  selinux: declare data arrays const
  selinux: fix indentation level of mls_ops block
  selinux: include necessary headers in headers
  selinux: avoid extra semicolon
  selinux: update parameter documentation
  selinux: resolve checkpatch errors
  selinux: don't sleep when CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE is true
  selinux: checkreqprot is deprecated, add some ssleep() discomfort
  selinux: runtime disable is deprecated, add some ssleep() discomfort
  selinux: Remove redundant assignments

25 files changed:
include/linux/lsm_audit.h
include/linux/lsm_hooks.h
scripts/selinux/genheaders/genheaders.c
scripts/selinux/mdp/mdp.c
security/lsm_audit.c
security/security.c
security/selinux/avc.c
security/selinux/hooks.c
security/selinux/include/audit.h
security/selinux/include/avc.h
security/selinux/include/avc_ss.h
security/selinux/include/classmap.h
security/selinux/include/ibpkey.h
security/selinux/include/initial_sid_to_string.h
security/selinux/include/netnode.h
security/selinux/include/netport.h
security/selinux/include/policycap.h
security/selinux/include/policycap_names.h
security/selinux/include/security.h
security/selinux/include/xfrm.h
security/selinux/nlmsgtab.c
security/selinux/selinuxfs.c
security/selinux/ss/avtab.c
security/selinux/ss/policydb.c
security/selinux/ss/services.c

index 17d02ed..97a8b21 100644 (file)
@@ -76,6 +76,7 @@ struct common_audit_data {
 #define LSM_AUDIT_DATA_IBENDPORT 14
 #define LSM_AUDIT_DATA_LOCKDOWN 15
 #define LSM_AUDIT_DATA_NOTIFICATION 16
+#define LSM_AUDIT_DATA_ANONINODE       17
        union   {
                struct path path;
                struct dentry *dentry;
@@ -96,6 +97,7 @@ struct common_audit_data {
                struct lsm_ibpkey_audit *ibpkey;
                struct lsm_ibendport_audit *ibendport;
                int reason;
+               const char *anonclass;
        } u;
        /* this union contains LSM specific data */
        union {
index 419b5fe..47cdf3f 100644 (file)
@@ -1595,7 +1595,7 @@ struct security_hook_list {
        struct hlist_node               list;
        struct hlist_head               *head;
        union security_list_options     hook;
-       char                            *lsm;
+       const char                      *lsm;
 } __randomize_layout;
 
 /*
@@ -1630,7 +1630,7 @@ extern struct security_hook_heads security_hook_heads;
 extern char *lsm_names;
 
 extern void security_add_hooks(struct security_hook_list *hooks, int count,
-                               char *lsm);
+                               const char *lsm);
 
 #define LSM_FLAG_LEGACY_MAJOR  BIT(0)
 #define LSM_FLAG_EXCLUSIVE     BIT(1)
index f355b3e..1552080 100644 (file)
@@ -59,35 +59,27 @@ int main(int argc, char *argv[])
                exit(2);
        }
 
-       for (i = 0; secclass_map[i].name; i++) {
-               struct security_class_mapping *map = &secclass_map[i];
-               map->name = stoupperx(map->name);
-               for (j = 0; map->perms[j]; j++)
-                       map->perms[j] = stoupperx(map->perms[j]);
-       }
-
-       isids_len = sizeof(initial_sid_to_string) / sizeof (char *);
-       for (i = 1; i < isids_len; i++) {
-               const char *s = initial_sid_to_string[i];
-
-               if (s)
-                       initial_sid_to_string[i] = stoupperx(s);
-       }
-
        fprintf(fout, "/* This file is automatically generated.  Do not edit. */\n");
        fprintf(fout, "#ifndef _SELINUX_FLASK_H_\n#define _SELINUX_FLASK_H_\n\n");
 
        for (i = 0; secclass_map[i].name; i++) {
-               struct security_class_mapping *map = &secclass_map[i];
-               fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1);
+               char *name = stoupperx(secclass_map[i].name);
+
+               fprintf(fout, "#define SECCLASS_%-39s %2d\n", name, i+1);
+               free(name);
        }
 
        fprintf(fout, "\n");
 
+       isids_len = sizeof(initial_sid_to_string) / sizeof(char *);
        for (i = 1; i < isids_len; i++) {
                const char *s = initial_sid_to_string[i];
-               if (s)
-                       fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i);
+               if (s) {
+                       char *sidname = stoupperx(s);
+
+                       fprintf(fout, "#define SECINITSID_%-39s %2d\n", sidname, i);
+                       free(sidname);
+               }
        }
        fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1);
        fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n");
@@ -96,10 +88,14 @@ int main(int argc, char *argv[])
        fprintf(fout, "\tswitch (kern_tclass) {\n");
        for (i = 0; secclass_map[i].name; i++) {
                static char s[] = "SOCKET";
-               struct security_class_mapping *map = &secclass_map[i];
-               int len = strlen(map->name), l = sizeof(s) - 1;
-               if (len >= l && memcmp(map->name + len - l, s, l) == 0)
-                       fprintf(fout, "\tcase SECCLASS_%s:\n", map->name);
+               int len, l;
+               char *name = stoupperx(secclass_map[i].name);
+
+               len = strlen(name);
+               l = sizeof(s) - 1;
+               if (len >= l && memcmp(name + len - l, s, l) == 0)
+                       fprintf(fout, "\tcase SECCLASS_%s:\n", name);
+               free(name);
        }
        fprintf(fout, "\t\tsock = true;\n");
        fprintf(fout, "\t\tbreak;\n");
@@ -110,33 +106,52 @@ int main(int argc, char *argv[])
        fprintf(fout, "}\n");
 
        fprintf(fout, "\n#endif\n");
-       fclose(fout);
+
+       if (fclose(fout) != 0) {
+               fprintf(stderr, "Could not successfully close %s:  %s\n",
+                       argv[1], strerror(errno));
+               exit(4);
+       }
 
        fout = fopen(argv[2], "w");
        if (!fout) {
                fprintf(stderr, "Could not open %s for writing:  %s\n",
                        argv[2], strerror(errno));
-               exit(4);
+               exit(5);
        }
 
        fprintf(fout, "/* This file is automatically generated.  Do not edit. */\n");
        fprintf(fout, "#ifndef _SELINUX_AV_PERMISSIONS_H_\n#define _SELINUX_AV_PERMISSIONS_H_\n\n");
 
        for (i = 0; secclass_map[i].name; i++) {
-               struct security_class_mapping *map = &secclass_map[i];
-               int len = strlen(map->name);
+               const struct security_class_mapping *map = &secclass_map[i];
+               int len;
+               char *name = stoupperx(map->name);
+
+               len = strlen(name);
                for (j = 0; map->perms[j]; j++) {
+                       char *permname;
+
                        if (j >= 32) {
                                fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n",
                                        map->name, map->perms[j]);
                                exit(5);
                        }
-                       fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name,
-                               39-len, map->perms[j], 1U<<j);
+                       permname = stoupperx(map->perms[j]);
+                       fprintf(fout, "#define %s__%-*s 0x%08xU\n", name,
+                               39-len, permname, 1U<<j);
+                       free(permname);
                }
+               free(name);
        }
 
        fprintf(fout, "\n#endif\n");
-       fclose(fout);
+
+       if (fclose(fout) != 0) {
+               fprintf(stderr, "Could not successfully close %s:  %s\n",
+                       argv[2], strerror(errno));
+               exit(6);
+       }
+
        exit(0);
 }
index 105c1c3..1415604 100644 (file)
@@ -82,7 +82,7 @@ int main(int argc, char *argv[])
 
        /* print out the class permissions */
        for (i = 0; secclass_map[i].name; i++) {
-               struct security_class_mapping *map = &secclass_map[i];
+               const struct security_class_mapping *map = &secclass_map[i];
                fprintf(fout, "class %s\n", map->name);
                fprintf(fout, "{\n");
                for (j = 0; map->perms[j]; j++)
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
 #define SYSTEMLOW "s0"
 #define SYSTEMHIGH "s1:c0.c1"
                for (i = 0; secclass_map[i].name; i++) {
-                       struct security_class_mapping *map = &secclass_map[i];
+                       const struct security_class_mapping *map = &secclass_map[i];
 
                        fprintf(fout, "mlsconstrain %s {\n", map->name);
                        for (j = 0; map->perms[j]; j++)
index 1897cbf..78a278f 100644 (file)
@@ -433,6 +433,9 @@ static void dump_common_audit_data(struct audit_buffer *ab,
                audit_log_format(ab, " lockdown_reason=\"%s\"",
                                 lockdown_reasons[a->u.reason]);
                break;
+       case LSM_AUDIT_DATA_ANONINODE:
+               audit_log_format(ab, " anonclass=%s", a->u.anonclass);
+               break;
        } /* switch (a->type) */
 }
 
index 08420c6..99956d2 100644 (file)
@@ -479,7 +479,7 @@ static int lsm_append(const char *new, char **result)
  * Each LSM has to register its hooks with the infrastructure.
  */
 void __init security_add_hooks(struct security_hook_list *hooks, int count,
-                               char *lsm)
+                               const char *lsm)
 {
        int i;
 
index abcd974..9a43af0 100644 (file)
@@ -668,7 +668,7 @@ static void avc_audit_pre_callback(struct audit_buffer *ab, void *a)
        struct common_audit_data *ad = a;
        struct selinux_audit_data *sad = ad->selinux_audit_data;
        u32 av = sad->audited;
-       const char **perms;
+       const char *const *perms;
        int i, perm;
 
        audit_log_format(ab, "avc:  %s ", sad->denied ? "denied" : "granted");
@@ -1059,7 +1059,7 @@ int avc_has_extended_perms(struct selinux_state *state,
 
        node = avc_lookup(state->avc, ssid, tsid, tclass);
        if (unlikely(!node)) {
-               node = avc_compute_av(state, ssid, tsid, tclass, &avd, xp_node);
+               avc_compute_av(state, ssid, tsid, tclass, &avd, xp_node);
        } else {
                memcpy(&avd, &node->ae.avd, sizeof(avd));
                xp_node = node->ae.xp_node;
@@ -1151,7 +1151,7 @@ inline int avc_has_perm_noaudit(struct selinux_state *state,
 
        node = avc_lookup(state->avc, ssid, tsid, tclass);
        if (unlikely(!node))
-               node = avc_compute_av(state, ssid, tsid, tclass, avd, &xp_node);
+               avc_compute_av(state, ssid, tsid, tclass, avd, &xp_node);
        else
                memcpy(avd, &node->ae.avd, sizeof(*avd));
 
index e9e9593..beceb89 100644 (file)
@@ -145,7 +145,7 @@ static int __init checkreqprot_setup(char *str)
        if (!kstrtoul(str, 0, &checkreqprot)) {
                selinux_checkreqprot_boot = checkreqprot ? 1 : 0;
                if (checkreqprot)
-                       pr_warn("SELinux: checkreqprot set to 1 via kernel parameter.  This is deprecated and will be rejected in a future kernel release.\n");
+                       pr_err("SELinux: checkreqprot set to 1 via kernel parameter.  This is deprecated and will be rejected in a future kernel release.\n");
        }
        return 1;
 }
@@ -2964,8 +2964,8 @@ static int selinux_inode_init_security_anon(struct inode *inode,
         * allowed to actually create this type of anonymous inode.
         */
 
-       ad.type = LSM_AUDIT_DATA_INODE;
-       ad.u.inode = inode;
+       ad.type = LSM_AUDIT_DATA_ANONINODE;
+       ad.u.anonclass = name ? (const char *)name->name : "?";
 
        return avc_has_perm(&selinux_state,
                            tsec->sid,
@@ -6487,7 +6487,6 @@ static int selinux_setprocattr(const char *name, void *value, size_t size)
                        goto abort_change;
 
                /* Only allow single threaded processes to change context */
-               error = -EPERM;
                if (!current_is_single_threaded()) {
                        error = security_bounded_transition(&selinux_state,
                                                            tsec->sid, sid);
@@ -7294,6 +7293,8 @@ static __init int selinux_init(void)
 
        memset(&selinux_state, 0, sizeof(selinux_state));
        enforcing_set(&selinux_state, selinux_enforcing_boot);
+       if (CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE)
+               pr_err("SELinux: CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE is non-zero.  This is deprecated and will be rejected in a future kernel release.\n");
        checkreqprot_set(&selinux_state, selinux_checkreqprot_boot);
        selinux_avc_init(&selinux_state.avc);
        mutex_init(&selinux_state.status_lock);
index 073a3d3..1cba83d 100644 (file)
@@ -12,6 +12,9 @@
 #ifndef _SELINUX_AUDIT_H
 #define _SELINUX_AUDIT_H
 
+#include <linux/audit.h>
+#include <linux/types.h>
+
 /**
  *     selinux_audit_rule_init - alloc/init an selinux audit rule structure.
  *     @field: the field this rule refers to
@@ -51,7 +54,7 @@ int selinux_audit_rule_match(u32 sid, u32 field, u32 op, void *rule);
  *     @rule: rule to be checked
  *     Returns 1 if there are selinux fields specified in the rule, 0 otherwise.
  */
-int selinux_audit_rule_known(struct audit_krule *krule);
+int selinux_audit_rule_known(struct audit_krule *rule);
 
 #endif /* _SELINUX_AUDIT_H */
 
index 00f78be..2b372f9 100644 (file)
@@ -104,6 +104,7 @@ int slow_avc_audit(struct selinux_state *state,
 
 /**
  * avc_audit - Audit the granting or denial of permissions.
+ * @state: SELinux state
  * @ssid: source security identifier
  * @tsid: target security identifier
  * @tclass: target security class
index 88c384c..42912c9 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef _SELINUX_AVC_SS_H_
 #define _SELINUX_AVC_SS_H_
 
-#include "flask.h"
+#include <linux/types.h>
 
 struct selinux_avc;
 int avc_ss_reset(struct selinux_avc *avc, u32 seqno);
@@ -18,7 +18,7 @@ struct security_class_mapping {
        const char *perms[sizeof(u32) * 8 + 1];
 };
 
-extern struct security_class_mapping secclass_map[];
+extern const struct security_class_mapping secclass_map[];
 
 #endif /* _SELINUX_AVC_SS_H_ */
 
index 35aac62..ff757ae 100644 (file)
@@ -38,7 +38,7 @@
  * Note: The name for any socket class should be suffixed by "socket",
  *      and doesn't contain more than one substr of "socket".
  */
-struct security_class_mapping secclass_map[] = {
+const struct security_class_mapping secclass_map[] = {
        { "security",
          { "compute_av", "compute_create", "compute_member",
            "check_context", "load_policy", "compute_relabel",
index e6ac1d2..c992f83 100644 (file)
@@ -14,6 +14,8 @@
 #ifndef _SELINUX_IB_PKEY_H
 #define _SELINUX_IB_PKEY_H
 
+#include <linux/types.h>
+
 #ifdef CONFIG_SECURITY_INFINIBAND
 void sel_ib_pkey_flush(void);
 int sel_ib_pkey_sid(u64 subnet_prefix, u16 pkey, u32 *sid);
index 5d332ae..6082051 100644 (file)
@@ -1,6 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-static const char *initial_sid_to_string[] =
-{
+static const char *const initial_sid_to_string[] = {
        NULL,
        "kernel",
        "security",
index e3f784a..9b8b655 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef _SELINUX_NETNODE_H
 #define _SELINUX_NETNODE_H
 
+#include <linux/types.h>
+
 void sel_netnode_flush(void);
 
 int sel_netnode_sid(void *addr, u16 family, u32 *sid);
index 31bc16e..9096a82 100644 (file)
@@ -16,6 +16,8 @@
 #ifndef _SELINUX_NETPORT_H
 #define _SELINUX_NETPORT_H
 
+#include <linux/types.h>
+
 void sel_netport_flush(void);
 
 int sel_netport_sid(u8 protocol, u16 pnum, u32 *sid);
index 2680aa2..f35d345 100644 (file)
@@ -16,6 +16,6 @@ enum {
 };
 #define POLICYDB_CAP_MAX (__POLICYDB_CAP_MAX - 1)
 
-extern const char *selinux_policycap_names[__POLICYDB_CAP_MAX];
+extern const char *const selinux_policycap_names[__POLICYDB_CAP_MAX];
 
 #endif /* _SELINUX_POLICYCAP_H_ */
index 100da7d..2a87fc3 100644 (file)
@@ -5,7 +5,7 @@
 #include "policycap.h"
 
 /* Policy capability names */
-const char *selinux_policycap_names[__POLICYDB_CAP_MAX] = {
+const char *const selinux_policycap_names[__POLICYDB_CAP_MAX] = {
        "network_peer_controls",
        "open_perms",
        "extended_socket_class",
index ace4bd1..393aff4 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/rcupdate.h>
 #include <linux/refcount.h>
 #include <linux/workqueue.h>
+#include <linux/delay.h>
+#include <linux/printk.h>
 #include "flask.h"
 #include "policycap.h"
 
@@ -150,6 +152,8 @@ static inline bool checkreqprot_get(const struct selinux_state *state)
 
 static inline void checkreqprot_set(struct selinux_state *state, bool value)
 {
+       if (value)
+               pr_err("SELinux: https://github.com/SELinuxProject/selinux-kernel/wiki/DEPRECATE-checkreqprot\n");
        WRITE_ONCE(state->checkreqprot, value);
 }
 
index 7415940..c758398 100644 (file)
@@ -8,7 +8,9 @@
 #ifndef _SELINUX_XFRM_H_
 #define _SELINUX_XFRM_H_
 
+#include <linux/lsm_audit.h>
 #include <net/flow.h>
+#include <net/xfrm.h>
 
 int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
                              struct xfrm_user_sec_ctx *uctx,
index d8ceee9..2ee7b4e 100644 (file)
@@ -25,8 +25,7 @@ struct nlmsg_perm {
        u32     perm;
 };
 
-static const struct nlmsg_perm nlmsg_route_perms[] =
-{
+static const struct nlmsg_perm nlmsg_route_perms[] = {
        { RTM_NEWLINK,          NETLINK_ROUTE_SOCKET__NLMSG_WRITE },
        { RTM_DELLINK,          NETLINK_ROUTE_SOCKET__NLMSG_WRITE },
        { RTM_GETLINK,          NETLINK_ROUTE_SOCKET__NLMSG_READ  },
@@ -97,16 +96,14 @@ static const struct nlmsg_perm nlmsg_route_perms[] =
        { RTM_GETTUNNEL,        NETLINK_ROUTE_SOCKET__NLMSG_READ  },
 };
 
-static const struct nlmsg_perm nlmsg_tcpdiag_perms[] =
-{
+static const struct nlmsg_perm nlmsg_tcpdiag_perms[] = {
        { TCPDIAG_GETSOCK,      NETLINK_TCPDIAG_SOCKET__NLMSG_READ },
        { DCCPDIAG_GETSOCK,     NETLINK_TCPDIAG_SOCKET__NLMSG_READ },
        { SOCK_DIAG_BY_FAMILY,  NETLINK_TCPDIAG_SOCKET__NLMSG_READ },
        { SOCK_DESTROY,         NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE },
 };
 
-static const struct nlmsg_perm nlmsg_xfrm_perms[] =
-{
+static const struct nlmsg_perm nlmsg_xfrm_perms[] = {
        { XFRM_MSG_NEWSA,       NETLINK_XFRM_SOCKET__NLMSG_WRITE },
        { XFRM_MSG_DELSA,       NETLINK_XFRM_SOCKET__NLMSG_WRITE },
        { XFRM_MSG_GETSA,       NETLINK_XFRM_SOCKET__NLMSG_READ  },
@@ -134,8 +131,7 @@ static const struct nlmsg_perm nlmsg_xfrm_perms[] =
        { XFRM_MSG_GETDEFAULT,  NETLINK_XFRM_SOCKET__NLMSG_READ  },
 };
 
-static const struct nlmsg_perm nlmsg_audit_perms[] =
-{
+static const struct nlmsg_perm nlmsg_audit_perms[] = {
        { AUDIT_GET,            NETLINK_AUDIT_SOCKET__NLMSG_READ     },
        { AUDIT_SET,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
        { AUDIT_LIST,           NETLINK_AUDIT_SOCKET__NLMSG_READPRIV },
index 097c6d8..8fcdd49 100644 (file)
@@ -293,6 +293,8 @@ static ssize_t sel_write_disable(struct file *file, const char __user *buf,
         *       kernel releases until eventually it is removed
         */
        pr_err("SELinux:  Runtime disable is deprecated, use selinux=0 on the kernel cmdline.\n");
+       pr_err("SELinux:  https://github.com/SELinuxProject/selinux-kernel/wiki/DEPRECATE-runtime-disable\n");
+       ssleep(5);
 
        if (count >= PAGE_SIZE)
                return -ENOMEM;
@@ -755,11 +757,13 @@ static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf,
                char comm[sizeof(current->comm)];
 
                memcpy(comm, current->comm, sizeof(comm));
-               pr_warn_once("SELinux: %s (%d) set checkreqprot to 1. This is deprecated and will be rejected in a future kernel release.\n",
-                            comm, current->pid);
+               pr_err("SELinux: %s (%d) set checkreqprot to 1. This is deprecated and will be rejected in a future kernel release.\n",
+                      comm, current->pid);
        }
 
        checkreqprot_set(fsi->state, (new_value ? 1 : 0));
+       if (new_value)
+               ssleep(5);
        length = count;
 
        selinux_ima_measure_state(fsi->state);
index cfdae20..8480ec6 100644 (file)
@@ -40,15 +40,15 @@ static inline int avtab_hash(const struct avtab_key *keyp, u32 mask)
 
        u32 hash = 0;
 
-#define mix(input) { \
-       u32 v = input; \
-       v *= c1; \
-       v = (v << r1) | (v >> (32 - r1)); \
-       v *= c2; \
-       hash ^= v; \
-       hash = (hash << r2) | (hash >> (32 - r2)); \
-       hash = hash * m + n; \
-}
+#define mix(input) do { \
+               u32 v = input; \
+               v *= c1; \
+               v = (v << r1) | (v >> (32 - r1)); \
+               v *= c2; \
+               hash ^= v; \
+               hash = (hash << r2) | (hash >> (32 - r2)); \
+               hash = hash * m + n; \
+       } while (0)
 
        mix(keyp->target_class);
        mix(keyp->target_type);
@@ -385,7 +385,7 @@ void avtab_hash_eval(struct avtab *h, char *tag)
               chain2_len_sum);
 }
 
-static uint16_t spec_order[] = {
+static const uint16_t spec_order[] = {
        AVTAB_ALLOWED,
        AVTAB_AUDITDENY,
        AVTAB_AUDITALLOW,
index d036e12..adcfb63 100644 (file)
@@ -61,7 +61,7 @@ struct policydb_compat_info {
 };
 
 /* These need to be updated if SYM_NUM or OCON_NUM changes */
-static struct policydb_compat_info policydb_compat[] = {
+static const struct policydb_compat_info policydb_compat[] = {
        {
                .version        = POLICYDB_VERSION_BASE,
                .sym_num        = SYM_NUM - 3,
@@ -159,18 +159,16 @@ static struct policydb_compat_info policydb_compat[] = {
        },
 };
 
-static struct policydb_compat_info *policydb_lookup_compat(int version)
+static const struct policydb_compat_info *policydb_lookup_compat(int version)
 {
        int i;
-       struct policydb_compat_info *info = NULL;
 
        for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) {
-               if (policydb_compat[i].version == version) {
-                       info = &policydb_compat[i];
-                       break;
-               }
+               if (policydb_compat[i].version == version)
+                       return &policydb_compat[i];
        }
-       return info;
+
+       return NULL;
 }
 
 /*
@@ -314,8 +312,7 @@ static int cat_destroy(void *key, void *datum, void *p)
        return 0;
 }
 
-static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) =
-{
+static int (*const destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
        common_destroy,
        cls_destroy,
        role_destroy,
@@ -670,8 +667,7 @@ static int cat_index(void *key, void *datum, void *datap)
        return 0;
 }
 
-static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) =
-{
+static int (*const index_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
        common_index,
        class_index,
        role_index,
@@ -1639,8 +1635,8 @@ bad:
        return rc;
 }
 
-static int (*read_f[SYM_NUM]) (struct policydb *p, struct symtab *s, void *fp) =
-{
+static int (*const read_f[SYM_NUM]) (struct policydb *p,
+                                    struct symtab *s, void *fp) = {
        common_read,
        class_read,
        role_read,
@@ -2211,7 +2207,7 @@ out:
        return rc;
 }
 
-static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
+static int ocontext_read(struct policydb *p, const struct policydb_compat_info *info,
                         void *fp)
 {
        int i, j, rc;
@@ -2407,7 +2403,7 @@ int policydb_read(struct policydb *p, void *fp)
        u32 len, nprim, nel, perm;
 
        char *policydb_str;
-       struct policydb_compat_info *info;
+       const struct policydb_compat_info *info;
 
        policydb_init(p);
 
@@ -3241,9 +3237,7 @@ static int user_write(void *vkey, void *datum, void *ptr)
        return 0;
 }
 
-static int (*write_f[SYM_NUM]) (void *key, void *datum,
-                               void *datap) =
-{
+static int (*const write_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
        common_write,
        class_write,
        role_write,
@@ -3254,7 +3248,7 @@ static int (*write_f[SYM_NUM]) (void *key, void *datum,
        cat_write,
 };
 
-static int ocontext_write(struct policydb *p, struct policydb_compat_info *info,
+static int ocontext_write(struct policydb *p, const struct policydb_compat_info *info,
                          void *fp)
 {
        unsigned int i, j, rc;
@@ -3611,7 +3605,7 @@ int policydb_write(struct policydb *p, void *fp)
        __le32 buf[4];
        u32 config;
        size_t len;
-       struct policydb_compat_info *info;
+       const struct policydb_compat_info *info;
 
        /*
         * refuse to write policy older than compressed avtab
index 6901dc0..69b2734 100644 (file)
@@ -99,7 +99,7 @@ static void context_struct_compute_av(struct policydb *policydb,
                                      struct extended_perms *xperms);
 
 static int selinux_set_mapping(struct policydb *pol,
-                              struct security_class_mapping *map,
+                              const struct security_class_mapping *map,
                               struct selinux_map *out_map)
 {
        u16 i, j;
@@ -121,7 +121,7 @@ static int selinux_set_mapping(struct policydb *pol,
        /* Store the raw class and permission values */
        j = 0;
        while (map[j].name) {
-               struct security_class_mapping *p_in = map + (j++);
+               const struct security_class_mapping *p_in = map + (j++);
                struct selinux_mapping *p_out = out_map->mapping + j;
 
                /* An empty class string skips ahead */
@@ -358,27 +358,27 @@ static int constraint_expr_eval(struct policydb *policydb,
                                l2 = &(tcontext->range.level[1]);
                                goto mls_ops;
 mls_ops:
-                       switch (e->op) {
-                       case CEXPR_EQ:
-                               s[++sp] = mls_level_eq(l1, l2);
-                               continue;
-                       case CEXPR_NEQ:
-                               s[++sp] = !mls_level_eq(l1, l2);
-                               continue;
-                       case CEXPR_DOM:
-                               s[++sp] = mls_level_dom(l1, l2);
-                               continue;
-                       case CEXPR_DOMBY:
-                               s[++sp] = mls_level_dom(l2, l1);
-                               continue;
-                       case CEXPR_INCOMP:
-                               s[++sp] = mls_level_incomp(l2, l1);
-                               continue;
-                       default:
-                               BUG();
-                               return 0;
-                       }
-                       break;
+                               switch (e->op) {
+                               case CEXPR_EQ:
+                                       s[++sp] = mls_level_eq(l1, l2);
+                                       continue;
+                               case CEXPR_NEQ:
+                                       s[++sp] = !mls_level_eq(l1, l2);
+                                       continue;
+                               case CEXPR_DOM:
+                                       s[++sp] = mls_level_dom(l1, l2);
+                                       continue;
+                               case CEXPR_DOMBY:
+                                       s[++sp] = mls_level_dom(l2, l1);
+                                       continue;
+                               case CEXPR_INCOMP:
+                                       s[++sp] = mls_level_incomp(l2, l1);
+                                       continue;
+                               default:
+                                       BUG();
+                                       return 0;
+                               }
+                               break;
                        default:
                                BUG();
                                return 0;
@@ -2980,7 +2980,6 @@ int security_fs_use(struct selinux_state *state, struct super_block *sb)
        }
 
 retry:
-       rc = 0;
        rcu_read_lock();
        policy = rcu_dereference(state->policy);
        policydb = &policy->policydb;