diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-13 18:11:14 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-13 18:11:14 +0400 |
commit | 0898d2aa9db8b7770c83590d0326d0e6b62cef2b (patch) | |
tree | 2383c0909c94b389ec75412748aced1678cf5967 /crypto/api.c | |
parent | 5a7d8a28080caed7fd4cb1b81d092adac4445e8e (diff) | |
parent | 26052f9b9bb8de4f6a57165b0a803de9c26138bd (diff) | |
download | linux-0898d2aa9db8b7770c83590d0326d0e6b62cef2b.tar.xz |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu:
"This fixes a 7+ year race condition in the crypto API that causes
sporadic crashes when multiple threads load the same algorithm.
It also fixes the crct10dif algorithm again to prevent boot failures
on systems where the initramfs tool ignores module softdeps"
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
crypto: crct10dif - Add fallback for broken initrds
crypto: api - Fix race condition in larval lookup
Diffstat (limited to 'crypto/api.c')
-rw-r--r-- | crypto/api.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/crypto/api.c b/crypto/api.c index 320ea4d8a0f5..a2b39c5f3649 100644 --- a/crypto/api.c +++ b/crypto/api.c @@ -34,6 +34,8 @@ EXPORT_SYMBOL_GPL(crypto_alg_sem); BLOCKING_NOTIFIER_HEAD(crypto_chain); EXPORT_SYMBOL_GPL(crypto_chain); +static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg); + struct crypto_alg *crypto_mod_get(struct crypto_alg *alg) { return try_module_get(alg->cra_module) ? crypto_alg_get(alg) : NULL; @@ -144,8 +146,11 @@ static struct crypto_alg *crypto_larval_add(const char *name, u32 type, } up_write(&crypto_alg_sem); - if (alg != &larval->alg) + if (alg != &larval->alg) { kfree(larval); + if (crypto_is_larval(alg)) + alg = crypto_larval_wait(alg); + } return alg; } |