Re: [PATCH] crypto: talitos - corrrectly handle zero-length assoc data

2013-11-28 Thread Herbert Xu
On Tue, Nov 19, 2013 at 02:57:49PM +0200, Horia Geanta wrote:
 talitos does not handle well zero-length assoc data. From dmesg:
 talitos ffe3.crypto: master data transfer error
 talitos ffe3.crypto: gather return/length error
 
 Check whether assoc data is provided by inspecting assoclen,
 not assoc pointer.
 This is needed in order to pass testmgr tests.
 
 Signed-off-by: Horia Geanta horia.gea...@freescale.com

Patch applied.  Thanks!
-- 
Email: Herbert Xu herb...@gondor.apana.org.au
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
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


[PATCH] crypto: talitos - corrrectly handle zero-length assoc data

2013-11-19 Thread Horia Geanta
talitos does not handle well zero-length assoc data. From dmesg:
talitos ffe3.crypto: master data transfer error
talitos ffe3.crypto: gather return/length error

Check whether assoc data is provided by inspecting assoclen,
not assoc pointer.
This is needed in order to pass testmgr tests.

Signed-off-by: Horia Geanta horia.gea...@freescale.com
---
This patch was submitted late in the 3.6 cycle, but has not
showed up - neither in 3.6 nor in 3.7. Please apply.

 drivers/crypto/talitos.c |   21 -
 1 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index f6f7c68..af3e7dc 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -788,7 +788,7 @@ static void ipsec_esp_unmap(struct device *dev,
 
if (edesc-assoc_chained)
talitos_unmap_sg_chain(dev, areq-assoc, DMA_TO_DEVICE);
-   else
+   else if (areq-assoclen)
/* assoc_nents counts also for IV in non-contiguous cases */
dma_unmap_sg(dev, areq-assoc,
 edesc-assoc_nents ? edesc-assoc_nents - 1 : 1,
@@ -971,7 +971,11 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct 
aead_request *areq,
dma_sync_single_for_device(dev, edesc-dma_link_tbl,
   edesc-dma_len, DMA_BIDIRECTIONAL);
} else {
-   to_talitos_ptr(desc-ptr[1], sg_dma_address(areq-assoc));
+   if (areq-assoclen)
+   to_talitos_ptr(desc-ptr[1],
+  sg_dma_address(areq-assoc));
+   else
+   to_talitos_ptr(desc-ptr[1], edesc-iv_dma);
desc-ptr[1].j_extent = 0;
}
 
@@ -1120,10 +1124,10 @@ static struct talitos_edesc *talitos_edesc_alloc(struct 
device *dev,
return ERR_PTR(-EINVAL);
}
 
-   if (iv)
+   if (ivsize)
iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
 
-   if (assoc) {
+   if (assoclen) {
/*
 * Currently it is assumed that iv is provided whenever assoc
 * is.
@@ -1171,9 +1175,16 @@ static struct talitos_edesc *talitos_edesc_alloc(struct 
device *dev,
 
edesc = kmalloc(alloc_len, GFP_DMA | flags);
if (!edesc) {
-   talitos_unmap_sg_chain(dev, assoc, DMA_TO_DEVICE);
+   if (assoc_chained)
+   talitos_unmap_sg_chain(dev, assoc, DMA_TO_DEVICE);
+   else if (assoclen)
+   dma_unmap_sg(dev, assoc,
+assoc_nents ? assoc_nents - 1 : 1,
+DMA_TO_DEVICE);
+
if (iv_dma)
dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE);
+
dev_err(dev, could not allocate edescriptor\n);
return ERR_PTR(-ENOMEM);
}
-- 
1.7.7.6


--
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