Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: omap-sham - fix unaligned sg list handling

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>

authored by

Tero Kristo and committed by
Herbert Xu
1cfd9f3f 5d5f3eed

+14 -5
+14 -5
drivers/crypto/omap-sham.c
··· 673 673 while (sg && new_len) { 674 674 int len = sg->length - offset; 675 675 676 - if (offset) { 676 + if (len <= 0) { 677 677 offset -= sg->length; 678 - if (offset < 0) 679 - offset = 0; 678 + sg = sg_next(sg); 679 + continue; 680 680 } 681 681 682 682 if (new_len < len) ··· 684 684 685 685 if (len > 0) { 686 686 new_len -= len; 687 - sg_set_page(tmp, sg_page(sg), len, sg->offset); 687 + sg_set_page(tmp, sg_page(sg), len, sg->offset + offset); 688 + offset = 0; 689 + ctx->offset = 0; 688 690 ctx->sg_len++; 689 691 if (new_len <= 0) 690 692 break; ··· 836 834 rctx->total = new_len; 837 835 rctx->offset += new_len; 838 836 rctx->sg_len = n; 839 - rctx->sg = sg; 837 + if (rctx->bufcnt) { 838 + sg_init_table(rctx->sgl, 2); 839 + sg_set_buf(rctx->sgl, rctx->dd->xmit_buf, rctx->bufcnt); 840 + sg_chain(rctx->sgl, 2, sg); 841 + rctx->sg = rctx->sgl; 842 + } else { 843 + rctx->sg = sg; 844 + } 840 845 841 846 return 0; 842 847 }