Commit b346e492 authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu

crypto: api - fix finding algorithm currently being tested

Commit eb02c38f ("crypto: api - Keep failed instances alive") is
making allocating crypto transforms sometimes fail with ELIBBAD, when
multiple processes try to access encrypted files with fscrypt for the
first time since boot.  The problem is that the "request larval" for the
algorithm is being mistaken for an algorithm which failed its tests.

Fix it by only returning ELIBBAD for "non-larval" algorithms.  Also
don't leak a reference to the algorithm.

Fixes: eb02c38f ("crypto: api - Keep failed instances alive")
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 60cc43fc
...@@ -204,9 +204,14 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, ...@@ -204,9 +204,14 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,
down_read(&crypto_alg_sem); down_read(&crypto_alg_sem);
alg = __crypto_alg_lookup(name, type | test, mask | test); alg = __crypto_alg_lookup(name, type | test, mask | test);
if (!alg && test) if (!alg && test) {
alg = __crypto_alg_lookup(name, type, mask) ? alg = __crypto_alg_lookup(name, type, mask);
ERR_PTR(-ELIBBAD) : NULL; if (alg && !crypto_is_larval(alg)) {
/* Test failed */
crypto_mod_put(alg);
alg = ERR_PTR(-ELIBBAD);
}
}
up_read(&crypto_alg_sem); up_read(&crypto_alg_sem);
return alg; return alg;
......
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