crypto: sun8i-ss - do not fallback if cryptlen is less than sg length
authorCorentin Labbe <clabbe@baylibre.com>
Mon, 2 May 2022 20:19:25 +0000 (20:19 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 13 May 2022 09:24:20 +0000 (17:24 +0800)
The sg length could be more than remaining data on it.
So check the length requirement against the minimum between those two
values.

Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c

index 7f1940c6cc41fc6d4115a6a3e060c6f55f4344b6..5bb950182026f03deb572ab8eda48dd025f5d1cb 100644 (file)
@@ -28,6 +28,7 @@ static bool sun8i_ss_need_fallback(struct skcipher_request *areq)
        struct scatterlist *in_sg = areq->src;
        struct scatterlist *out_sg = areq->dst;
        struct scatterlist *sg;
+       unsigned int todo, len;
 
        if (areq->cryptlen == 0 || areq->cryptlen % 16) {
                algt->stat_fb_len++;
@@ -40,13 +41,11 @@ static bool sun8i_ss_need_fallback(struct skcipher_request *areq)
                return true;
        }
 
+       len = areq->cryptlen;
        sg = areq->src;
        while (sg) {
-               if ((sg->length % 16) != 0) {
-                       algt->stat_fb_sglen++;
-                       return true;
-               }
-               if ((sg_dma_len(sg) % 16) != 0) {
+               todo = min(len, sg->length);
+               if ((todo % 16) != 0) {
                        algt->stat_fb_sglen++;
                        return true;
                }
@@ -54,15 +53,14 @@ static bool sun8i_ss_need_fallback(struct skcipher_request *areq)
                        algt->stat_fb_align++;
                        return true;
                }
+               len -= todo;
                sg = sg_next(sg);
        }
+       len = areq->cryptlen;
        sg = areq->dst;
        while (sg) {
-               if ((sg->length % 16) != 0) {
-                       algt->stat_fb_sglen++;
-                       return true;
-               }
-               if ((sg_dma_len(sg) % 16) != 0) {
+               todo = min(len, sg->length);
+               if ((todo % 16) != 0) {
                        algt->stat_fb_sglen++;
                        return true;
                }
@@ -70,6 +68,7 @@ static bool sun8i_ss_need_fallback(struct skcipher_request *areq)
                        algt->stat_fb_align++;
                        return true;
                }
+               len -= todo;
                sg = sg_next(sg);
        }