selinux/stable-5.19 PR 20220523
-----BEGIN PGP SIGNATURE----- iQJIBAABCAAyFiEES0KozwfymdVUl37v6iDy2pc3iXMFAmKLj4oUHHBhdWxAcGF1 bC1tb29yZS5jb20ACgkQ6iDy2pc3iXNIoA//c2Fbgr3tTs6yCWAJk+mQcVwD1eq5 F2f3ild8qpSH15aYZkQPapJ0Ep1W4EDuf/AbRbfVB4t+tknrxtR8IAtiUYOPDlfW eK85ENj5b+Hc6mPPHE8On0kc6oNySYeHXHGZ84c4DxRwjXolnHQTOIHb7pMKTGyU cq6oqsgkpou88rnzJg/eiFkf/Yk2h0oS8jDQcu2OVaeNoBaVg5oAau01HES1IMzB gqiEi0WXQII9lQX2qRLCPiPuHwA//PoMmx342JiIFcrOrprBCYiQ5yNWYR+VKuGP WH85etJOeWh9kqsvRVSMs/y3L+RPFoydwLXsud0lIappbad53KJDq53oDco7PTY/ lhrhgSEipwc18QFZzIj7+h2R53k5YQYWFk5dC1nKfkVLd/sAqAcLPfbyOmeSQ097 /DbzUouiP8zq7WHpPw6dikVeT5wBqBjEcwoCZSjctXi4vDSWNWt6OBunx7bwOhbr IfKESEDJhyG2xtmyYgEpDFXTn4d2SuxspPRmdYDOlvgLLH037+cXm/8TmzoMNiQ3 Xs6/vpzFmh+r+0Astzt+MisQrWDGNF9XQqVz4UrXkSXTqtkXO28/4ZCh0NE2squu 6zXf2KX79HxMos8OELvBV73U6yIEoK18qsygYgHwT+iB+YOMZvwZMpyl35JZWnAK fxVu54GrcQNjCQs= =1ZFj -----END PGP SIGNATURE----- Merge tag 'selinux-pr-20220523' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux 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
This commit is contained in:
commit
efd1df1982
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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++)
|
||||
|
@ -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) */
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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
|
||||
|
@ -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_ */
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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_ */
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 },
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user