aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/picoxcell_crypto.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/crypto/picoxcell_crypto.c b/drivers/crypto/picoxcell_crypto.c
index 9eb27c71cedf..c2fd860745ad 100644
--- a/drivers/crypto/picoxcell_crypto.c
+++ b/drivers/crypto/picoxcell_crypto.c
@@ -318,6 +318,7 @@ static int spacc_aead_make_ddts(struct spacc_req *req, u8 *giv)
318 struct spacc_ddt *src_ddt, *dst_ddt; 318 struct spacc_ddt *src_ddt, *dst_ddt;
319 unsigned ivsize = crypto_aead_ivsize(crypto_aead_reqtfm(areq)); 319 unsigned ivsize = crypto_aead_ivsize(crypto_aead_reqtfm(areq));
320 unsigned nents = sg_count(areq->src, areq->cryptlen); 320 unsigned nents = sg_count(areq->src, areq->cryptlen);
321 unsigned total;
321 dma_addr_t iv_addr; 322 dma_addr_t iv_addr;
322 struct scatterlist *cur; 323 struct scatterlist *cur;
323 int i, dst_ents, src_ents, assoc_ents; 324 int i, dst_ents, src_ents, assoc_ents;
@@ -361,11 +362,18 @@ static int spacc_aead_make_ddts(struct spacc_req *req, u8 *giv)
361 * Map the associated data. For decryption we don't copy the 362 * Map the associated data. For decryption we don't copy the
362 * associated data. 363 * associated data.
363 */ 364 */
365 total = areq->assoclen;
364 for_each_sg(areq->assoc, cur, assoc_ents, i) { 366 for_each_sg(areq->assoc, cur, assoc_ents, i) {
365 ddt_set(src_ddt++, sg_dma_address(cur), sg_dma_len(cur)); 367 unsigned len = sg_dma_len(cur);
368
369 if (len > total)
370 len = total;
371
372 total -= len;
373
374 ddt_set(src_ddt++, sg_dma_address(cur), len);
366 if (req->is_encrypt) 375 if (req->is_encrypt)
367 ddt_set(dst_ddt++, sg_dma_address(cur), 376 ddt_set(dst_ddt++, sg_dma_address(cur), len);
368 sg_dma_len(cur));
369 } 377 }
370 ddt_set(src_ddt++, iv_addr, ivsize); 378 ddt_set(src_ddt++, iv_addr, ivsize);
371 379