OSDN Git Service

crypto: pcrypt - simplify error handling in pcrypt_create_aead()
authorEric Biggers <ebiggers@google.com>
Wed, 26 Feb 2020 04:59:22 +0000 (20:59 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 6 Mar 2020 01:28:24 +0000 (12:28 +1100)
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>
crypto/pcrypt.c
kernel/padata.c

index 1b63213..8bddc65 100644 (file)
@@ -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;
@@ -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;
 
@@ -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)
index 6208259..a6afa12 100644 (file)
@@ -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);
 }