Commit 01bbafc6 authored by Sumit Garg's avatar Sumit Garg Committed by Linus Torvalds

KEYS: trusted: Remove redundant static calls usage

Static calls invocations aren't well supported from module __init and
__exit functions. Especially the static call from cleanup_trusted() led
to a crash on x86 kernel with CONFIG_DEBUG_VIRTUAL=y.

However, the usage of static call invocations for trusted_key_init()
and trusted_key_exit() don't add any value from either a performance or
security perspective. Hence switch to use indirect function calls instead.

Note here that although it will fix the current crash report, ultimately
the static call infrastructure should be fixed to either support its
future usage from module __init and __exit functions or not.
Reported-and-tested-by: default avatarHyeonggon Yoo <42.hyeyoo@gmail.com>
Link: https://lore.kernel.org/lkml/ZRhKq6e5nF%2F4ZIV1@fedora/#t
Fixes: 5d0682be ("KEYS: trusted: Add generic trusted keys framework")
Signed-off-by: default avatarSumit Garg <sumit.garg@linaro.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 87813e13
...@@ -44,13 +44,12 @@ static const struct trusted_key_source trusted_key_sources[] = { ...@@ -44,13 +44,12 @@ static const struct trusted_key_source trusted_key_sources[] = {
#endif #endif
}; };
DEFINE_STATIC_CALL_NULL(trusted_key_init, *trusted_key_sources[0].ops->init);
DEFINE_STATIC_CALL_NULL(trusted_key_seal, *trusted_key_sources[0].ops->seal); DEFINE_STATIC_CALL_NULL(trusted_key_seal, *trusted_key_sources[0].ops->seal);
DEFINE_STATIC_CALL_NULL(trusted_key_unseal, DEFINE_STATIC_CALL_NULL(trusted_key_unseal,
*trusted_key_sources[0].ops->unseal); *trusted_key_sources[0].ops->unseal);
DEFINE_STATIC_CALL_NULL(trusted_key_get_random, DEFINE_STATIC_CALL_NULL(trusted_key_get_random,
*trusted_key_sources[0].ops->get_random); *trusted_key_sources[0].ops->get_random);
DEFINE_STATIC_CALL_NULL(trusted_key_exit, *trusted_key_sources[0].ops->exit); static void (*trusted_key_exit)(void);
static unsigned char migratable; static unsigned char migratable;
enum { enum {
...@@ -359,19 +358,16 @@ static int __init init_trusted(void) ...@@ -359,19 +358,16 @@ static int __init init_trusted(void)
if (!get_random) if (!get_random)
get_random = kernel_get_random; get_random = kernel_get_random;
static_call_update(trusted_key_init,
trusted_key_sources[i].ops->init);
static_call_update(trusted_key_seal, static_call_update(trusted_key_seal,
trusted_key_sources[i].ops->seal); trusted_key_sources[i].ops->seal);
static_call_update(trusted_key_unseal, static_call_update(trusted_key_unseal,
trusted_key_sources[i].ops->unseal); trusted_key_sources[i].ops->unseal);
static_call_update(trusted_key_get_random, static_call_update(trusted_key_get_random,
get_random); get_random);
static_call_update(trusted_key_exit, trusted_key_exit = trusted_key_sources[i].ops->exit;
trusted_key_sources[i].ops->exit);
migratable = trusted_key_sources[i].ops->migratable; migratable = trusted_key_sources[i].ops->migratable;
ret = static_call(trusted_key_init)(); ret = trusted_key_sources[i].ops->init();
if (!ret) if (!ret)
break; break;
} }
...@@ -388,7 +384,8 @@ static int __init init_trusted(void) ...@@ -388,7 +384,8 @@ static int __init init_trusted(void)
static void __exit cleanup_trusted(void) static void __exit cleanup_trusted(void)
{ {
static_call_cond(trusted_key_exit)(); if (trusted_key_exit)
(*trusted_key_exit)();
} }
late_initcall(init_trusted); late_initcall(init_trusted);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment