crypto: omap-sham - fix unaligned sg list handling
authorTero Kristo <t-kristo@ti.com>
Tue, 5 Nov 2019 14:01:07 +0000 (16:01 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 11 Dec 2019 08:37:00 +0000 (16:37 +0800)
Currently the offset for unaligned sg lists is not handled properly
leading into wrong results with certain testmgr self tests. Fix the
handling to account for proper offset within the current sg list.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-sham.c

index 33a58ebf652c8ae449e6e9110e940126574383b7..4f915a4ef5b0a34e566b780024d8ee982e3d6c34 100644 (file)
@@ -673,10 +673,10 @@ static int omap_sham_copy_sg_lists(struct omap_sham_reqctx *ctx,
        while (sg && new_len) {
                int len = sg->length - offset;
 
-               if (offset) {
+               if (len <= 0) {
                        offset -= sg->length;
-                       if (offset < 0)
-                               offset = 0;
+                       sg = sg_next(sg);
+                       continue;
                }
 
                if (new_len < len)
@@ -684,7 +684,9 @@ static int omap_sham_copy_sg_lists(struct omap_sham_reqctx *ctx,
 
                if (len > 0) {
                        new_len -= len;
-                       sg_set_page(tmp, sg_page(sg), len, sg->offset);
+                       sg_set_page(tmp, sg_page(sg), len, sg->offset + offset);
+                       offset = 0;
+                       ctx->offset = 0;
                        ctx->sg_len++;
                        if (new_len <= 0)
                                break;
@@ -834,7 +836,14 @@ static int omap_sham_align_sgs(struct scatterlist *sg,
        rctx->total = new_len;
        rctx->offset += new_len;
        rctx->sg_len = n;
-       rctx->sg = sg;
+       if (rctx->bufcnt) {
+               sg_init_table(rctx->sgl, 2);
+               sg_set_buf(rctx->sgl, rctx->dd->xmit_buf, rctx->bufcnt);
+               sg_chain(rctx->sgl, 2, sg);
+               rctx->sg = rctx->sgl;
+       } else {
+               rctx->sg = sg;
+       }
 
        return 0;
 }