aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2006-10-11 08:29:51 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2006-10-11 08:29:51 -0400
commit9765d262b8230b735c4b2815b041c09a00833cf1 (patch)
treecf24840b4e1f06f1f1f756f52f4f9870b02a5ed3 /crypto
parent53a5fbdc2dff55161a206ed1a1385a8fa8055c34 (diff)
[CRYPTO] api: fix crypto_alloc_base() return value
This patch makes crypto_alloc_base() return proper return value. - If kzalloc() failure happens within __crypto_alloc_tfm(), crypto_alloc_base() returns NULL. But crypto_alloc_base() is supposed to return error code as pointer. So this patch makes it return -ENOMEM in that case. - crypto_alloc_base() is suppose to return -EINTR, if it is interrupted by signal. But it may not return -EINTR. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/api.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/crypto/api.c b/crypto/api.c
index 2e84d4b54790..4fb7fa45cb0d 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -331,7 +331,7 @@ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 flags)
331 tfm_size = sizeof(*tfm) + crypto_ctxsize(alg, flags); 331 tfm_size = sizeof(*tfm) + crypto_ctxsize(alg, flags);
332 tfm = kzalloc(tfm_size, GFP_KERNEL); 332 tfm = kzalloc(tfm_size, GFP_KERNEL);
333 if (tfm == NULL) 333 if (tfm == NULL)
334 goto out; 334 goto out_err;
335 335
336 tfm->__crt_alg = alg; 336 tfm->__crt_alg = alg;
337 337
@@ -355,6 +355,7 @@ cra_init_failed:
355 crypto_exit_ops(tfm); 355 crypto_exit_ops(tfm);
356out_free_tfm: 356out_free_tfm:
357 kfree(tfm); 357 kfree(tfm);
358out_err:
358 tfm = ERR_PTR(err); 359 tfm = ERR_PTR(err);
359out: 360out:
360 return tfm; 361 return tfm;
@@ -414,14 +415,14 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask)
414 struct crypto_alg *alg; 415 struct crypto_alg *alg;
415 416
416 alg = crypto_alg_mod_lookup(alg_name, type, mask); 417 alg = crypto_alg_mod_lookup(alg_name, type, mask);
417 err = PTR_ERR(alg); 418 if (IS_ERR(alg)) {
418 tfm = ERR_PTR(err); 419 err = PTR_ERR(alg);
419 if (IS_ERR(alg))
420 goto err; 420 goto err;
421 }
421 422
422 tfm = __crypto_alloc_tfm(alg, 0); 423 tfm = __crypto_alloc_tfm(alg, 0);
423 if (!IS_ERR(tfm)) 424 if (!IS_ERR(tfm))
424 break; 425 return tfm;
425 426
426 crypto_mod_put(alg); 427 crypto_mod_put(alg);
427 err = PTR_ERR(tfm); 428 err = PTR_ERR(tfm);
@@ -433,9 +434,9 @@ err:
433 err = -EINTR; 434 err = -EINTR;
434 break; 435 break;
435 } 436 }
436 }; 437 }
437 438
438 return tfm; 439 return ERR_PTR(err);
439} 440}
440EXPORT_SYMBOL_GPL(crypto_alloc_base); 441EXPORT_SYMBOL_GPL(crypto_alloc_base);
441 442