Fix a leak on error path in qat asym

Reported-by: Salvatore Benedetto <salvatore.benede...@intel.com>
Signed-off-by: Tadeusz Struk <tadeusz.st...@intel.com>
---
 drivers/crypto/qat/qat_common/qat_asym_algs.c | 70 ++++++++++++++-------------
 1 file changed, 36 insertions(+), 34 deletions(-)

diff --git a/drivers/crypto/qat/qat_common/qat_asym_algs.c 
b/drivers/crypto/qat/qat_common/qat_asym_algs.c
index 51c594f..e5c0727 100644
--- a/drivers/crypto/qat/qat_common/qat_asym_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_asym_algs.c
@@ -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;
 }
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to