crypto: sun8i-ss - handle zero sized sg
authorCorentin Labbe <clabbe@baylibre.com>
Mon, 2 May 2022 20:19:15 +0000 (20:19 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:23:11 +0000 (10:23 +0200)
[ Upstream commit c149e4763d28bb4c0e5daae8a59f2c74e889f407 ]

sun8i-ss does not handle well the possible zero sized sg.

Fixes: d9b45418a917 ("crypto: sun8i-ss - support hash algorithms")
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c

index 1a71ed4..ca4f280 100644 (file)
@@ -380,13 +380,21 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq)
        }
 
        len = areq->nbytes;
-       for_each_sg(areq->src, sg, nr_sgs, i) {
+       sg = areq->src;
+       i = 0;
+       while (len > 0 && sg) {
+               if (sg_dma_len(sg) == 0) {
+                       sg = sg_next(sg);
+                       continue;
+               }
                rctx->t_src[i].addr = sg_dma_address(sg);
                todo = min(len, sg_dma_len(sg));
                rctx->t_src[i].len = todo / 4;
                len -= todo;
                rctx->t_dst[i].addr = addr_res;
                rctx->t_dst[i].len = digestsize / 4;
+               sg = sg_next(sg);
+               i++;
        }
        if (len > 0) {
                dev_err(ss->dev, "remaining len %d\n", len);