[PATCH v2] LSM: Make security_hook_heads a local variable.
Casey Schaufler
casey at schaufler-ca.com
Fri Mar 24 15:46:28 UTC 2017
On 3/24/2017 4:16 AM, Tetsuo Handa wrote:
> Since commit 3dfc9b02864b19f4 ("LSM: Initialize security_hook_heads upon
> registration.") changed to access security_hook_heads as an array of
> "struct list_head", we no longer need to pass address of each member inside
> "struct security_hook_heads". Therefore, we can make security_hook_heads
> a local variable by passing index number inside "struct list_head" array.
>
> Signed-off-by: Tetsuo Handa <penguin-kernel at I-love.SAKURA.ne.jp>
> Cc: Kees Cook <keescook at chromium.org>
> Cc: Paul Moore <paul at paul-moore.com>
> Cc: Stephen Smalley <sds at tycho.nsa.gov>
> Cc: Casey Schaufler <casey at schaufler-ca.com>
> Cc: James Morris <james.l.morris at oracle.com>
> ---
> include/linux/lsm_hooks.h | 6 +++---
> security/security.c | 13 +++++++++++--
> 2 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
> index 1aa6333..54191cf 100644
> --- a/include/linux/lsm_hooks.h
> +++ b/include/linux/lsm_hooks.h
> @@ -1877,8 +1877,8 @@ struct security_hook_heads {
> */
> struct security_hook_list {
> struct list_head list;
> - struct list_head *head;
> union security_list_options hook;
> + const unsigned int idx;
> char *lsm;
> };
>
> @@ -1889,9 +1889,9 @@ struct security_hook_list {
> * text involved.
> */
> #define LSM_HOOK_INIT(HEAD, HOOK) \
> - { .head = &security_hook_heads.HEAD, .hook = { .HEAD = HOOK } }
> + { .idx = offsetof(struct security_hook_heads, HEAD) / \
> + sizeof(struct list_head), .hook = { .HEAD = HOOK } }
You're gaining making security_hook_heads static,
but you're loosing the type checking. I found (much
to my surprise at times) that the type checking is
very helpful even with existing modules. I expect
some module developers to get bitten by this.
>
> -extern struct security_hook_heads security_hook_heads;
> extern char *lsm_names;
>
> extern void security_add_hooks(struct security_hook_list *hooks, int count,
> diff --git a/security/security.c b/security/security.c
> index 2f15488..45af8fb 100644
> --- a/security/security.c
> +++ b/security/security.c
> @@ -32,7 +32,7 @@
> /* Maximum number of letters for an LSM name string */
> #define SECURITY_NAME_MAX 10
>
> -struct security_hook_heads security_hook_heads __lsm_ro_after_init;
> +static struct security_hook_heads security_hook_heads __lsm_ro_after_init;
> char *lsm_names;
> /* Boot-time LSM user choice */
> static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
> @@ -133,10 +133,19 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count,
> char *lsm)
> {
> int i;
> + unsigned int idx;
> + struct list_head *list = (struct list_head *) &security_hook_heads;
>
> for (i = 0; i < count; i++) {
> hooks[i].lsm = lsm;
> - list_add_tail_rcu(&hooks[i].list, hooks[i].head);
> + /*
> + * LSM_HOOK_INIT() must have set correct idx value.
> + * But just in case something went wrong.
> + */
> + idx = hooks[i].idx;
> + BUG_ON(idx >= sizeof(struct security_hook_heads) /
> + sizeof(struct list_head));
> + list_add_tail_rcu(&hooks[i].list, &list[idx]);
> }
> if (lsm_append(lsm, &lsm_names) < 0)
> panic("%s - Cannot get early memory.\n", __func__);
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the Linux-security-module-archive
mailing list