On 7/21/2025 4:21 PM, Paul Moore wrote:
> 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 change for errors.
>
> Signed-off-by: Paul Moore <p...@paul-moore.com>

I'm not a big fan of loop macros, but they seem useful here.

Reviewed-by: Casey Schaufler <ca...@schaufler-ca.com>


> ---
>  security/lsm_init.c | 42 +++++++++++++++++++++++++++---------------
>  1 file changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/security/lsm_init.c b/security/lsm_init.c
> index 7beb028a507b..a73c3769dfea 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)
> @@ -479,7 +491,7 @@ int __init early_security_init(void)
>  {
>       struct lsm_info *lsm;
>  
> -     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);
> @@ -506,7 +518,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)

Reply via email to