]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
crypto: scatterwalk - Check for same address in map_and_copy
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 21 May 2015 07:11:12 +0000 (15:11 +0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Sun, 26 Feb 2017 05:34:33 +0000 (21:34 -0800)
Orabug: 25243093

This patch adds a check for in scatterwalk_map_and_copy to avoid
copying from the same address to the same address.  This is going
to be used for IV copying in AEAD IV generators.

There is no provision for partial overlaps.

This patch also uses the new scatterwalk_ffwd instead of doing
it by hand in scatterwalk_map_and_copy.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
(cherry picked from commit 74412fd5d71b6eda0beb302aa467da000f0d530c)
Signed-off-by: Ethan Zhao <ethan.zhao@oracle.com>
crypto/scatterwalk.c

index bd0c8c065b85dd46e7d52dd31fd4d731946f1732..9c5de17d64275e9c09ed68f349db48f857f464c6 100644 (file)
@@ -97,22 +97,18 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
                              unsigned int start, unsigned int nbytes, int out)
 {
        struct scatter_walk walk;
-       unsigned int offset = 0;
+       struct scatterlist tmp[2];
 
        if (!nbytes)
                return;
 
-       for (;;) {
-               scatterwalk_start(&walk, sg);
-
-               if (start < offset + sg->length)
-                       break;
+       sg = scatterwalk_ffwd(tmp, sg, start);
 
-               offset += sg->length;
-               sg = sg_next(sg);
-       }
+       if (sg_page(sg) == virt_to_page(buf) &&
+           sg->offset == offset_in_page(buf))
+               return;
 
-       scatterwalk_advance(&walk, start - offset);
+       scatterwalk_start(&walk, sg);
        scatterwalk_copychunks(buf, &walk, nbytes, out);
        scatterwalk_done(&walk, out, 0);
 }