crypto: amlogic - fix two resources leak
authorCorentin Labbe <clabbe@baylibre.com>
Fri, 8 Nov 2019 09:45:17 +0000 (09:45 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 17 Nov 2019 01:02:38 +0000 (09:02 +0800)
This patch fixes two resources leak that occur on error path.

Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
Addresses-Coverity-ID: 1487403 ("RESOURCE_LEAK")
Addresses-Coverity-ID: 1487401 ("Resource leaks")
Fixes: 48fe583fe541 ("crypto: amlogic - Add crypto accelerator for amlogic GXL")
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/amlogic/amlogic-gxl-cipher.c

index 78e776c5870536418cfa7eb6d101569139b25ca9..1ddb14e9a99ac8d48fdecab9abc2d3f9185c29fa 100644 (file)
@@ -131,7 +131,8 @@ static int meson_cipher(struct skcipher_request *areq)
        if (areq->iv && ivsize > 0) {
                if (ivsize > areq->cryptlen) {
                        dev_err(mc->dev, "invalid ivsize=%d vs len=%d\n", ivsize, areq->cryptlen);
-                       return -EINVAL;
+                       err = -EINVAL;
+                       goto theend;
                }
                memcpy(bkeyiv + 32, areq->iv, ivsize);
                keyivlen = 48;
@@ -151,9 +152,10 @@ static int meson_cipher(struct skcipher_request *areq)
 
        phykeyiv = dma_map_single(mc->dev, bkeyiv, keyivlen,
                                  DMA_TO_DEVICE);
-       if (dma_mapping_error(mc->dev, phykeyiv)) {
+       err = dma_mapping_error(mc->dev, phykeyiv);
+       if (err) {
                dev_err(mc->dev, "Cannot DMA MAP KEY IV\n");
-               return -EFAULT;
+               goto theend;
        }
 
        tloffset = 0;
@@ -245,7 +247,6 @@ static int meson_cipher(struct skcipher_request *areq)
        if (areq->iv && ivsize > 0) {
                if (rctx->op_dir == MESON_DECRYPT) {
                        memcpy(areq->iv, backup_iv, ivsize);
-                       kzfree(backup_iv);
                } else {
                        scatterwalk_map_and_copy(areq->iv, areq->dst,
                                                 areq->cryptlen - ivsize,
@@ -254,6 +255,7 @@ static int meson_cipher(struct skcipher_request *areq)
        }
 theend:
        kzfree(bkeyiv);
+       kzfree(backup_iv);
 
        return err;
 }