mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-19 02:54:00 +08:00
crypto: pcrypt - simplify error handling in pcrypt_create_aead()
Simplify the error handling in pcrypt_create_aead() by taking advantage of crypto_grab_aead() now handling an ERR_PTR() name and by taking advantage of crypto_drop_aead() now accepting (as a no-op) a spawn that hasn't been grabbed yet. This required also making padata_free_shell() accept a NULL argument. Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
d570631033
commit
07b24c7c08
@ -232,17 +232,12 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
|
|||||||
struct crypto_attr_type *algt;
|
struct crypto_attr_type *algt;
|
||||||
struct aead_instance *inst;
|
struct aead_instance *inst;
|
||||||
struct aead_alg *alg;
|
struct aead_alg *alg;
|
||||||
const char *name;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
algt = crypto_get_attr_type(tb);
|
algt = crypto_get_attr_type(tb);
|
||||||
if (IS_ERR(algt))
|
if (IS_ERR(algt))
|
||||||
return PTR_ERR(algt);
|
return PTR_ERR(algt);
|
||||||
|
|
||||||
name = crypto_attr_alg_name(tb[1]);
|
|
||||||
if (IS_ERR(name))
|
|
||||||
return PTR_ERR(name);
|
|
||||||
|
|
||||||
inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
|
inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
|
||||||
if (!inst)
|
if (!inst)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -252,21 +247,21 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
|
|||||||
ctx = aead_instance_ctx(inst);
|
ctx = aead_instance_ctx(inst);
|
||||||
ctx->psenc = padata_alloc_shell(pencrypt);
|
ctx->psenc = padata_alloc_shell(pencrypt);
|
||||||
if (!ctx->psenc)
|
if (!ctx->psenc)
|
||||||
goto out_free_inst;
|
goto err_free_inst;
|
||||||
|
|
||||||
ctx->psdec = padata_alloc_shell(pdecrypt);
|
ctx->psdec = padata_alloc_shell(pdecrypt);
|
||||||
if (!ctx->psdec)
|
if (!ctx->psdec)
|
||||||
goto out_free_psenc;
|
goto err_free_inst;
|
||||||
|
|
||||||
err = crypto_grab_aead(&ctx->spawn, aead_crypto_instance(inst),
|
err = crypto_grab_aead(&ctx->spawn, aead_crypto_instance(inst),
|
||||||
name, 0, 0);
|
crypto_attr_alg_name(tb[1]), 0, 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_free_psdec;
|
goto err_free_inst;
|
||||||
|
|
||||||
alg = crypto_spawn_aead_alg(&ctx->spawn);
|
alg = crypto_spawn_aead_alg(&ctx->spawn);
|
||||||
err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base);
|
err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_drop_aead;
|
goto err_free_inst;
|
||||||
|
|
||||||
inst->alg.base.cra_flags = CRYPTO_ALG_ASYNC;
|
inst->alg.base.cra_flags = CRYPTO_ALG_ASYNC;
|
||||||
|
|
||||||
@ -286,21 +281,11 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
|
|||||||
inst->free = pcrypt_free;
|
inst->free = pcrypt_free;
|
||||||
|
|
||||||
err = aead_register_instance(tmpl, inst);
|
err = aead_register_instance(tmpl, inst);
|
||||||
if (err)
|
if (err) {
|
||||||
goto out_drop_aead;
|
err_free_inst:
|
||||||
|
pcrypt_free(inst);
|
||||||
out:
|
}
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
out_drop_aead:
|
|
||||||
crypto_drop_aead(&ctx->spawn);
|
|
||||||
out_free_psdec:
|
|
||||||
padata_free_shell(ctx->psdec);
|
|
||||||
out_free_psenc:
|
|
||||||
padata_free_shell(ctx->psenc);
|
|
||||||
out_free_inst:
|
|
||||||
kfree(inst);
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcrypt_create(struct crypto_template *tmpl, struct rtattr **tb)
|
static int pcrypt_create(struct crypto_template *tmpl, struct rtattr **tb)
|
||||||
|
@ -1038,12 +1038,13 @@ EXPORT_SYMBOL(padata_alloc_shell);
|
|||||||
*/
|
*/
|
||||||
void padata_free_shell(struct padata_shell *ps)
|
void padata_free_shell(struct padata_shell *ps)
|
||||||
{
|
{
|
||||||
struct padata_instance *pinst = ps->pinst;
|
if (!ps)
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&pinst->lock);
|
mutex_lock(&ps->pinst->lock);
|
||||||
list_del(&ps->list);
|
list_del(&ps->list);
|
||||||
padata_free_pd(rcu_dereference_protected(ps->pd, 1));
|
padata_free_pd(rcu_dereference_protected(ps->pd, 1));
|
||||||
mutex_unlock(&pinst->lock);
|
mutex_unlock(&ps->pinst->lock);
|
||||||
|
|
||||||
kfree(ps);
|
kfree(ps);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user