mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
crypto: talitos - corrrectly handle zero-length assoc data
talitos does not handle well zero-length assoc data. From dmesg: talitos ffe30000.crypto: master data transfer error talitos ffe30000.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.geanta@freescale.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
41da8b5adb
commit
935e99a3af
@ -790,7 +790,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,
|
||||
@ -973,7 +973,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;
|
||||
}
|
||||
|
||||
@ -1122,10 +1126,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.
|
||||
@ -1173,9 +1177,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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user