Add the RHEL 211.21.1..211.22.1 backports (1288-1351) from centos-stream-10 and upstream stable, on top of 211.20.1. Bump pkgrelease and specrelease to 211.22.1. (The redhat/ automotive rebuild-changelog tooling change is omitted: it patches redhat/scripts not present in this build base and does not affect the kernel.)
173 lines
5.7 KiB
Diff
173 lines
5.7 KiB
Diff
From 92ed776aa54bac14d013ad9b08ad44b7ed8af0ea Mon Sep 17 00:00:00 2001
|
|
From: Ondrej Mosnacek <omosnace@redhat.com>
|
|
Date: Fri, 29 May 2026 18:31:38 +0200
|
|
Subject: [PATCH] lsm: introduce looping macros for the initialization code
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-179440
|
|
CVE: CVE-2026-46054
|
|
|
|
commit 37f788f65528611f4482e2135d11ca34afb25828
|
|
Author: Paul Moore <paul@paul-moore.com>
|
|
Date: Wed Apr 9 17:59:42 2025 -0400
|
|
|
|
lsm: introduce looping macros for the initialization code
|
|
|
|
There are three common for loop patterns in the LSM initialization code
|
|
to loop through the ordered LSM list and the registered "early" LSMs.
|
|
This patch implements these loop patterns as macros to help simplify the
|
|
code and reduce the chance for errors.
|
|
|
|
Reviewed-by: Casey Schaufler <casey@schaufler-ca.com>
|
|
Reviewed-by: John Johansen <john.johhansen@canonical.com>
|
|
Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>
|
|
Signed-off-by: Paul Moore <paul@paul-moore.com>
|
|
|
|
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
|
|
|
|
diff --git a/security/lsm_init.c b/security/lsm_init.c
|
|
index 719835ec8f0a..2424975ca0eb 100644
|
|
--- a/security/lsm_init.c
|
|
+++ b/security/lsm_init.c
|
|
@@ -32,6 +32,15 @@ static __initdata bool debug;
|
|
pr_info(__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
+#define lsm_order_for_each(iter) \
|
|
+ for ((iter) = ordered_lsms; *(iter); (iter)++)
|
|
+#define lsm_for_each_raw(iter) \
|
|
+ for ((iter) = __start_lsm_info; \
|
|
+ (iter) < __end_lsm_info; (iter)++)
|
|
+#define lsm_early_for_each_raw(iter) \
|
|
+ for ((iter) = __start_early_lsm_info; \
|
|
+ (iter) < __end_early_lsm_info; (iter)++)
|
|
+
|
|
static int lsm_append(const char *new, char **result);
|
|
|
|
/* Save user chosen LSM */
|
|
@@ -96,9 +105,10 @@ static bool __init exists_ordered_lsm(struct lsm_info *lsm)
|
|
{
|
|
struct lsm_info **check;
|
|
|
|
- for (check = ordered_lsms; *check; check++)
|
|
+ lsm_order_for_each(check) {
|
|
if (*check == lsm)
|
|
return true;
|
|
+ }
|
|
|
|
return false;
|
|
}
|
|
@@ -206,7 +216,7 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
|
|
char *sep, *name, *next;
|
|
|
|
/* LSM_ORDER_FIRST is always first. */
|
|
- for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
|
|
+ lsm_for_each_raw(lsm) {
|
|
if (lsm->order == LSM_ORDER_FIRST)
|
|
append_ordered_lsm(lsm, " first");
|
|
}
|
|
@@ -221,8 +231,7 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
|
|
* if the selected one was separately disabled: disable
|
|
* all non-matching Legacy Major LSMs.
|
|
*/
|
|
- for (major = __start_lsm_info; major < __end_lsm_info;
|
|
- major++) {
|
|
+ lsm_for_each_raw(major) {
|
|
if ((major->flags & LSM_FLAG_LEGACY_MAJOR) &&
|
|
strcmp(major->name, chosen_major_lsm) != 0) {
|
|
set_enabled(major, false);
|
|
@@ -238,7 +247,7 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
|
|
while ((name = strsep(&next, ",")) != NULL) {
|
|
bool found = false;
|
|
|
|
- for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
|
|
+ lsm_for_each_raw(lsm) {
|
|
if (strcmp(lsm->name, name) == 0) {
|
|
if (lsm->order == LSM_ORDER_MUTABLE)
|
|
append_ordered_lsm(lsm, origin);
|
|
@@ -253,7 +262,7 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
|
|
|
|
/* Process "security=", if given. */
|
|
if (chosen_major_lsm) {
|
|
- for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
|
|
+ lsm_for_each_raw(lsm) {
|
|
if (exists_ordered_lsm(lsm))
|
|
continue;
|
|
if (strcmp(lsm->name, chosen_major_lsm) == 0)
|
|
@@ -262,13 +271,13 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
|
|
}
|
|
|
|
/* LSM_ORDER_LAST is always last. */
|
|
- for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
|
|
+ lsm_for_each_raw(lsm) {
|
|
if (lsm->order == LSM_ORDER_LAST)
|
|
append_ordered_lsm(lsm, " last");
|
|
}
|
|
|
|
/* Disable all LSMs not in the ordered list. */
|
|
- for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
|
|
+ lsm_for_each_raw(lsm) {
|
|
if (exists_ordered_lsm(lsm))
|
|
continue;
|
|
set_enabled(lsm, false);
|
|
@@ -287,13 +296,14 @@ static void __init report_lsm_order(void)
|
|
pr_info("initializing lsm=");
|
|
|
|
/* Report each enabled LSM name, comma separated. */
|
|
- for (early = __start_early_lsm_info;
|
|
- early < __end_early_lsm_info; early++)
|
|
+ lsm_early_for_each_raw(early) {
|
|
if (is_enabled(early))
|
|
pr_cont("%s%s", first++ == 0 ? "" : ",", early->name);
|
|
- for (lsm = ordered_lsms; *lsm; lsm++)
|
|
+ }
|
|
+ lsm_order_for_each(lsm) {
|
|
if (is_enabled(*lsm))
|
|
pr_cont("%s%s", first++ == 0 ? "" : ",", (*lsm)->name);
|
|
+ }
|
|
|
|
pr_cont("\n");
|
|
}
|
|
@@ -340,8 +350,9 @@ static void __init ordered_lsm_init(void)
|
|
} else
|
|
ordered_lsm_parse(builtin_lsm_order, "builtin");
|
|
|
|
- for (lsm = ordered_lsms; *lsm; lsm++)
|
|
+ lsm_order_for_each(lsm) {
|
|
lsm_prepare(*lsm);
|
|
+ }
|
|
|
|
report_lsm_order();
|
|
|
|
@@ -376,8 +387,9 @@ static void __init ordered_lsm_init(void)
|
|
|
|
lsm_early_cred((struct cred *) current->cred);
|
|
lsm_early_task(current);
|
|
- for (lsm = ordered_lsms; *lsm; lsm++)
|
|
+ lsm_order_for_each(lsm) {
|
|
initialize_lsm(*lsm);
|
|
+ }
|
|
}
|
|
|
|
static bool match_last_lsm(const char *list, const char *lsm)
|
|
@@ -483,7 +495,7 @@ int __init early_security_init(void)
|
|
if (early_security_initialized)
|
|
return 0;
|
|
|
|
- for (lsm = __start_early_lsm_info; lsm < __end_early_lsm_info; lsm++) {
|
|
+ lsm_early_for_each_raw(lsm) {
|
|
if (!lsm->enabled)
|
|
lsm->enabled = &lsm_enabled_true;
|
|
lsm_prepare(lsm);
|
|
@@ -511,7 +523,7 @@ int __init security_init(void)
|
|
* Append the names of the early LSM modules now that kmalloc() is
|
|
* available
|
|
*/
|
|
- for (lsm = __start_early_lsm_info; lsm < __end_early_lsm_info; lsm++) {
|
|
+ lsm_early_for_each_raw(lsm) {
|
|
init_debug(" early started: %s (%s)\n", lsm->name,
|
|
is_enabled(lsm) ? "enabled" : "disabled");
|
|
if (lsm->enabled)
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|