Do bind neither static calls nor trusted_key_exit() before a successful
init, in order to maintain a consistent state. In addition, depart the
init_trusted() in the case of a real error (i.e. getting back something
else than -ENODEV).

Reported-by: Linus Torvalds <[email protected]>
Closes: 
https://lore.kernel.org/linux-integrity/CAHk-=whOPoLaWM8S8GgoOPT7a2+nMH5h3TLKtn=r_3w4r1_...@mail.gmail.com/
Cc: [email protected] # v5.13+
Fixes: 5d0682be3189 ("KEYS: trusted: Add generic trusted keys framework")
Signed-off-by: Jarkko Sakkinen <[email protected]>
---
 security/keys/trusted-keys/trusted_core.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/security/keys/trusted-keys/trusted_core.c 
b/security/keys/trusted-keys/trusted_core.c
index 85fb5c22529a..fee1ab2c734d 100644
--- a/security/keys/trusted-keys/trusted_core.c
+++ b/security/keys/trusted-keys/trusted_core.c
@@ -358,17 +358,17 @@ static int __init init_trusted(void)
                if (!get_random)
                        get_random = kernel_get_random;
 
-               static_call_update(trusted_key_seal,
-                                  trusted_key_sources[i].ops->seal);
-               static_call_update(trusted_key_unseal,
-                                  trusted_key_sources[i].ops->unseal);
-               static_call_update(trusted_key_get_random,
-                                  get_random);
-               trusted_key_exit = trusted_key_sources[i].ops->exit;
-               migratable = trusted_key_sources[i].ops->migratable;
-
                ret = trusted_key_sources[i].ops->init();
-               if (!ret)
+               if (!ret) {
+                       static_call_update(trusted_key_seal, 
trusted_key_sources[i].ops->seal);
+                       static_call_update(trusted_key_unseal, 
trusted_key_sources[i].ops->unseal);
+                       static_call_update(trusted_key_get_random, get_random);
+
+                       trusted_key_exit = trusted_key_sources[i].ops->exit;
+                       migratable = trusted_key_sources[i].ops->migratable;
+               }
+
+               if (!ret || ret != -ENODEV)
                        break;
        }
 
-- 
2.39.2

Reply via email to