| From 77dbd7a95e4a4f15264c333a9e9ab97ee27dc2aa Mon Sep 17 00:00:00 2001 |
| From: Herbert Xu <herbert@gondor.apana.org.au> |
| Date: Sun, 8 Sep 2013 14:33:50 +1000 |
| Subject: crypto: api - Fix race condition in larval lookup |
| |
| From: Herbert Xu <herbert@gondor.apana.org.au> |
| |
| commit 77dbd7a95e4a4f15264c333a9e9ab97ee27dc2aa upstream. |
| |
| crypto_larval_lookup should only return a larval if it created one. |
| Any larval created by another entity must be processed through |
| crypto_larval_wait before being returned. |
| |
| Otherwise this will lead to a larval being killed twice, which |
| will most likely lead to a crash. |
| |
| Reported-by: Kees Cook <keescook@chromium.org> |
| Tested-by: Kees Cook <keescook@chromium.org> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| crypto/api.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- 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_ |
| } |
| 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; |
| } |