crypto: fix broken crypto_register_instance() module handling
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 16 Apr 2015 03:07:13 +0000 (11:07 +0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Apr 2015 03:26:16 +0000 (20:26 -0700)
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 <torvalds@linux-foundation.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
crypto/algapi.c

index 2d0a1c64ce396f745956fd1f0876b5e00f21f947..d2627a3d4ed8b15cf53127b11daaad412a950711 100644 (file)
@@ -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);