Commit 07b24c7c authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu

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: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent d5706310
...@@ -232,17 +232,12 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb, ...@@ -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, ...@@ -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, ...@@ -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); ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment