diff options
Diffstat (limited to 'crypto')
| -rw-r--r-- | crypto/algapi.c | 8 | ||||
| -rw-r--r-- | crypto/api.c | 22 |
2 files changed, 13 insertions, 17 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c index 395b082d03a9..2a0271b5f62a 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
| @@ -543,9 +543,6 @@ int crypto_register_instance(struct crypto_template *tmpl, | |||
| 543 | inst->alg.cra_module = tmpl->module; | 543 | inst->alg.cra_module = tmpl->module; |
| 544 | inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE; | 544 | inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE; |
| 545 | 545 | ||
| 546 | if (unlikely(!crypto_mod_get(&inst->alg))) | ||
| 547 | return -EAGAIN; | ||
| 548 | |||
| 549 | down_write(&crypto_alg_sem); | 546 | down_write(&crypto_alg_sem); |
| 550 | 547 | ||
| 551 | larval = __crypto_register_alg(&inst->alg); | 548 | larval = __crypto_register_alg(&inst->alg); |
| @@ -563,14 +560,9 @@ unlock: | |||
| 563 | goto err; | 560 | goto err; |
| 564 | 561 | ||
| 565 | crypto_wait_for_test(larval); | 562 | crypto_wait_for_test(larval); |
| 566 | |||
| 567 | /* Remove instance if test failed */ | ||
| 568 | if (!(inst->alg.cra_flags & CRYPTO_ALG_TESTED)) | ||
| 569 | crypto_unregister_instance(inst); | ||
| 570 | err = 0; | 563 | err = 0; |
| 571 | 564 | ||
| 572 | err: | 565 | err: |
| 573 | crypto_mod_put(&inst->alg); | ||
| 574 | return err; | 566 | return err; |
| 575 | } | 567 | } |
| 576 | EXPORT_SYMBOL_GPL(crypto_register_instance); | 568 | EXPORT_SYMBOL_GPL(crypto_register_instance); |
diff --git a/crypto/api.c b/crypto/api.c index bb9fe480f092..1d5290c67108 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
| @@ -197,9 +197,16 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, | |||
| 197 | u32 mask) | 197 | u32 mask) |
| 198 | { | 198 | { |
| 199 | struct crypto_alg *alg; | 199 | struct crypto_alg *alg; |
| 200 | u32 test = 0; | ||
| 201 | |||
| 202 | if (!((type | mask) & CRYPTO_ALG_TESTED)) | ||
| 203 | test |= CRYPTO_ALG_TESTED; | ||
| 200 | 204 | ||
| 201 | down_read(&crypto_alg_sem); | 205 | down_read(&crypto_alg_sem); |
| 202 | alg = __crypto_alg_lookup(name, type, mask); | 206 | alg = __crypto_alg_lookup(name, type | test, mask | test); |
| 207 | if (!alg && test) | ||
| 208 | alg = __crypto_alg_lookup(name, type, mask) ? | ||
| 209 | ERR_PTR(-ELIBBAD) : NULL; | ||
| 203 | up_read(&crypto_alg_sem); | 210 | up_read(&crypto_alg_sem); |
| 204 | 211 | ||
| 205 | return alg; | 212 | return alg; |
| @@ -227,10 +234,12 @@ static struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, | |||
| 227 | alg = crypto_alg_lookup(name, type, mask); | 234 | alg = crypto_alg_lookup(name, type, mask); |
| 228 | } | 235 | } |
| 229 | 236 | ||
| 230 | if (alg) | 237 | if (!IS_ERR_OR_NULL(alg) && crypto_is_larval(alg)) |
| 231 | return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; | 238 | alg = crypto_larval_wait(alg); |
| 239 | else if (!alg) | ||
| 240 | alg = crypto_larval_add(name, type, mask); | ||
| 232 | 241 | ||
| 233 | return crypto_larval_add(name, type, mask); | 242 | return alg; |
| 234 | } | 243 | } |
| 235 | 244 | ||
| 236 | int crypto_probing_notify(unsigned long val, void *v) | 245 | int crypto_probing_notify(unsigned long val, void *v) |
| @@ -253,11 +262,6 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | |||
| 253 | struct crypto_alg *larval; | 262 | struct crypto_alg *larval; |
| 254 | int ok; | 263 | int ok; |
| 255 | 264 | ||
| 256 | if (!((type | mask) & CRYPTO_ALG_TESTED)) { | ||
| 257 | type |= CRYPTO_ALG_TESTED; | ||
| 258 | mask |= CRYPTO_ALG_TESTED; | ||
| 259 | } | ||
| 260 | |||
| 261 | /* | 265 | /* |
| 262 | * If the internal flag is set for a cipher, require a caller to | 266 | * If the internal flag is set for a cipher, require a caller to |
| 263 | * to invoke the cipher with the internal flag to use that cipher. | 267 | * to invoke the cipher with the internal flag to use that cipher. |
