crypto: qat - fix leak on error path
authorTadeusz Struk <tadeusz.struk@intel.com>
Wed, 10 Feb 2016 22:59:44 +0000 (14:59 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 16 Feb 2016 20:07:52 +0000 (04:07 +0800)
Fix a leak on error path in qat asym

Reported-by: Salvatore Benedetto <salvatore.benedetto@intel.com>
Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qat/qat_common/qat_asym_algs.c

index 51c594fdacdc7bb2b2887ca400182525ebadc1af..e5c0727d48767fb638cb52541601c0fd55c0471a 100644 (file)
@@ -340,14 +340,16 @@ static int qat_rsa_enc(struct akcipher_request *req)
 
        if (!ret)
                return -EINPROGRESS;
-unmap_src:
-       if (qat_req->src_align)
-               dma_free_coherent(dev, ctx->key_sz, qat_req->src_align,
-                                 qat_req->in.enc.m);
-       else
-               if (!dma_mapping_error(dev, qat_req->in.enc.m))
-                       dma_unmap_single(dev, qat_req->in.enc.m, ctx->key_sz,
-                                        DMA_TO_DEVICE);
+
+       if (!dma_mapping_error(dev, qat_req->phy_out))
+               dma_unmap_single(dev, qat_req->phy_out,
+                                sizeof(struct qat_rsa_output_params),
+                                DMA_TO_DEVICE);
+unmap_in_params:
+       if (!dma_mapping_error(dev, qat_req->phy_in))
+               dma_unmap_single(dev, qat_req->phy_in,
+                                sizeof(struct qat_rsa_input_params),
+                                DMA_TO_DEVICE);
 unmap_dst:
        if (qat_req->dst_align)
                dma_free_coherent(dev, ctx->key_sz, qat_req->dst_align,
@@ -356,15 +358,14 @@ unmap_dst:
                if (!dma_mapping_error(dev, qat_req->out.enc.c))
                        dma_unmap_single(dev, qat_req->out.enc.c, ctx->key_sz,
                                         DMA_FROM_DEVICE);
-unmap_in_params:
-       if (!dma_mapping_error(dev, qat_req->phy_in))
-               dma_unmap_single(dev, qat_req->phy_in,
-                                sizeof(struct qat_rsa_input_params),
-                                DMA_TO_DEVICE);
-       if (!dma_mapping_error(dev, qat_req->phy_out))
-               dma_unmap_single(dev, qat_req->phy_out,
-                                sizeof(struct qat_rsa_output_params),
-                                DMA_TO_DEVICE);
+unmap_src:
+       if (qat_req->src_align)
+               dma_free_coherent(dev, ctx->key_sz, qat_req->src_align,
+                                 qat_req->in.enc.m);
+       else
+               if (!dma_mapping_error(dev, qat_req->in.enc.m))
+                       dma_unmap_single(dev, qat_req->in.enc.m, ctx->key_sz,
+                                        DMA_TO_DEVICE);
        return ret;
 }
 
@@ -472,14 +473,16 @@ static int qat_rsa_dec(struct akcipher_request *req)
 
        if (!ret)
                return -EINPROGRESS;
-unmap_src:
-       if (qat_req->src_align)
-               dma_free_coherent(dev, ctx->key_sz, qat_req->src_align,
-                                 qat_req->in.dec.c);
-       else
-               if (!dma_mapping_error(dev, qat_req->in.dec.c))
-                       dma_unmap_single(dev, qat_req->in.dec.c, ctx->key_sz,
-                                        DMA_TO_DEVICE);
+
+       if (!dma_mapping_error(dev, qat_req->phy_out))
+               dma_unmap_single(dev, qat_req->phy_out,
+                                sizeof(struct qat_rsa_output_params),
+                                DMA_TO_DEVICE);
+unmap_in_params:
+       if (!dma_mapping_error(dev, qat_req->phy_in))
+               dma_unmap_single(dev, qat_req->phy_in,
+                                sizeof(struct qat_rsa_input_params),
+                                DMA_TO_DEVICE);
 unmap_dst:
        if (qat_req->dst_align)
                dma_free_coherent(dev, ctx->key_sz, qat_req->dst_align,
@@ -488,15 +491,14 @@ unmap_dst:
                if (!dma_mapping_error(dev, qat_req->out.dec.m))
                        dma_unmap_single(dev, qat_req->out.dec.m, ctx->key_sz,
                                         DMA_FROM_DEVICE);
-unmap_in_params:
-       if (!dma_mapping_error(dev, qat_req->phy_in))
-               dma_unmap_single(dev, qat_req->phy_in,
-                                sizeof(struct qat_rsa_input_params),
-                                DMA_TO_DEVICE);
-       if (!dma_mapping_error(dev, qat_req->phy_out))
-               dma_unmap_single(dev, qat_req->phy_out,
-                                sizeof(struct qat_rsa_output_params),
-                                DMA_TO_DEVICE);
+unmap_src:
+       if (qat_req->src_align)
+               dma_free_coherent(dev, ctx->key_sz, qat_req->src_align,
+                                 qat_req->in.dec.c);
+       else
+               if (!dma_mapping_error(dev, qat_req->in.dec.c))
+                       dma_unmap_single(dev, qat_req->in.dec.c, ctx->key_sz,
+                                        DMA_TO_DEVICE);
        return ret;
 }