crypto: ccree - zap entire sg on aead request unmap
authorGilad Ben-Yossef <gilad@benyossef.com>
Thu, 18 Apr 2019 13:39:01 +0000 (16:39 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 25 Apr 2019 07:38:15 +0000 (15:38 +0800)
We were trying to be clever zapping out of the cache only the required
length out of scatter list on AEAD request completion and getting it
wrong.

As Knuth said: "when in douby, use brute force". Zap the whole length of
the scatter list.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Cc: stable@vger.kernel.org # v4.19+
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccree/cc_buffer_mgr.c

index fa625bdde3f94a70565e3b55f0655506aed130a4..09dceec7d82868c5bb080449a0c982ad660df330 100644 (file)
@@ -517,9 +517,7 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req)
 {
        struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
        unsigned int hw_iv_size = areq_ctx->hw_iv_size;
-       struct crypto_aead *tfm = crypto_aead_reqtfm(req);
        struct cc_drvdata *drvdata = dev_get_drvdata(dev);
-       u32 size_to_unmap = 0;
 
        if (areq_ctx->mac_buf_dma_addr) {
                dma_unmap_single(dev, areq_ctx->mac_buf_dma_addr,
@@ -576,19 +574,12 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req)
        dev_dbg(dev, "Unmapping src sgl: req->src=%pK areq_ctx->src.nents=%u areq_ctx->assoc.nents=%u assoclen:%u cryptlen=%u\n",
                sg_virt(req->src), areq_ctx->src.nents, areq_ctx->assoc.nents,
                areq_ctx->assoclen, req->cryptlen);
-       size_to_unmap = areq_ctx->assoclen + req->cryptlen;
-       if (areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_ENCRYPT)
-               size_to_unmap += areq_ctx->req_authsize;
-       if (areq_ctx->is_gcm4543)
-               size_to_unmap += crypto_aead_ivsize(tfm);
 
-       dma_unmap_sg(dev, req->src, sg_nents_for_len(req->src, size_to_unmap),
-                    DMA_BIDIRECTIONAL);
+       dma_unmap_sg(dev, req->src, sg_nents(req->src), DMA_BIDIRECTIONAL);
        if (req->src != req->dst) {
                dev_dbg(dev, "Unmapping dst sgl: req->dst=%pK\n",
                        sg_virt(req->dst));
-               dma_unmap_sg(dev, req->dst,
-                            sg_nents_for_len(req->dst, size_to_unmap),
+               dma_unmap_sg(dev, req->dst, sg_nents(req->dst),
                             DMA_BIDIRECTIONAL);
        }
        if (drvdata->coherent &&