summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2020-05-27 15:24:25 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2020-06-04 22:03:40 +1000
commit7e34e0bbc6449458a8de675814ffa22dec003698 (patch)
treef2bd36258761a2e231f1e1c3a980e2faf8fd205c
parent8dc43636e39a89ec51188b012a789625fa83bbe0 (diff)
downloadlinux-7e34e0bbc6449458a8de675814ffa22dec003698.tar.gz
linux-7e34e0bbc6449458a8de675814ffa22dec003698.tar.bz2
linux-7e34e0bbc6449458a8de675814ffa22dec003698.zip
crypto: omap-crypto - fix userspace copied buffer access
In case buffers are copied from userspace, directly accessing the page will most likely fail because it hasn't been mapped into the kernel memory space. Fix the issue by forcing a kmap / kunmap within the cleanup functionality. Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/omap-crypto.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/crypto/omap-crypto.c b/drivers/crypto/omap-crypto.c
index cc88b7362bc2..94b2dba90f0d 100644
--- a/drivers/crypto/omap-crypto.c
+++ b/drivers/crypto/omap-crypto.c
@@ -178,11 +178,17 @@ static void omap_crypto_copy_data(struct scatterlist *src,
amt = min(src->length - srco, dst->length - dsto);
amt = min(len, amt);
- srcb = sg_virt(src) + srco;
- dstb = sg_virt(dst) + dsto;
+ srcb = kmap_atomic(sg_page(src)) + srco + src->offset;
+ dstb = kmap_atomic(sg_page(dst)) + dsto + dst->offset;
memcpy(dstb, srcb, amt);
+ if (!PageSlab(sg_page(dst)))
+ flush_kernel_dcache_page(sg_page(dst));
+
+ kunmap_atomic(srcb);
+ kunmap_atomic(dstb);
+
srco += amt;
dsto += amt;
len -= amt;