Skip to content

Commit

Permalink
crypto: pcrypt - simplify error handling in pcrypt_create_aead()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
ebiggers authored and herbertx committed Mar 6, 2020
1 parent d570631 commit 07b24c7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 27 deletions.
33 changes: 9 additions & 24 deletions crypto/pcrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,17 +232,12 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
struct crypto_attr_type *algt;
struct aead_instance *inst;
struct aead_alg *alg;
const char *name;
int err;

algt = crypto_get_attr_type(tb);
if (IS_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);
if (!inst)
return -ENOMEM;
Expand All @@ -252,21 +247,21 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
ctx = aead_instance_ctx(inst);
ctx->psenc = padata_alloc_shell(pencrypt);
if (!ctx->psenc)
goto out_free_inst;
goto err_free_inst;

ctx->psdec = padata_alloc_shell(pdecrypt);
if (!ctx->psdec)
goto out_free_psenc;
goto err_free_inst;

err = crypto_grab_aead(&ctx->spawn, aead_crypto_instance(inst),
name, 0, 0);
crypto_attr_alg_name(tb[1]), 0, 0);
if (err)
goto out_free_psdec;
goto err_free_inst;

alg = crypto_spawn_aead_alg(&ctx->spawn);
err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base);
if (err)
goto out_drop_aead;
goto err_free_inst;

inst->alg.base.cra_flags = CRYPTO_ALG_ASYNC;

Expand All @@ -286,21 +281,11 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
inst->free = pcrypt_free;

err = aead_register_instance(tmpl, inst);
if (err)
goto out_drop_aead;

out:
if (err) {
err_free_inst:
pcrypt_free(inst);
}
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)
Expand Down
7 changes: 4 additions & 3 deletions kernel/padata.c
Original file line number Diff line number Diff line change
Expand Up @@ -1038,12 +1038,13 @@ EXPORT_SYMBOL(padata_alloc_shell);
*/
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);
padata_free_pd(rcu_dereference_protected(ps->pd, 1));
mutex_unlock(&pinst->lock);
mutex_unlock(&ps->pinst->lock);

kfree(ps);
}
Expand Down

0 comments on commit 07b24c7

Please sign in to comment.