From 34c9a0ffc75ad25b6a60f61e27c4a4b1189b8085 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 16 Apr 2015 11:07:13 +0800 Subject: [PATCH] crypto: fix broken crypto_register_instance() module handling Commit 9c521a200bc3 ("crypto: api - remove instance when test failed") tried to grab a module reference count before the module was even set. Worse, it then goes on to free the module reference count after it is set so you quickly end up with a negative module reference count which prevents people from using any instances belonging to that module. This patch moves the module initialisation before the reference count. Reported-by: Linus Torvalds Signed-off-by: Herbert Xu Signed-off-by: Linus Torvalds --- crypto/algapi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/algapi.c b/crypto/algapi.c index 2d0a1c64ce39..d2627a3d4ed8 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -525,12 +525,12 @@ int crypto_register_instance(struct crypto_template *tmpl, if (err) return err; - if (unlikely(!crypto_mod_get(&inst->alg))) - return -EAGAIN; - inst->alg.cra_module = tmpl->module; inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE; + if (unlikely(!crypto_mod_get(&inst->alg))) + return -EAGAIN; + down_write(&crypto_alg_sem); larval = __crypto_register_alg(&inst->alg); -- 2.20.1