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

crypto: skcipher - fix mismatch between mapping and unmapping order

Local kunmaps have to be unmapped in the opposite order from which they
were mapped. My recent change flipped the unmap order in the
SKCIPHER_WALK_DIFF case. Adjust the mapping side to match.

This fixes a WARN_ON_ONCE that was triggered when running the
crypto-self tests on a 32-bit kernel with
CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP=y.

Fixes: 95dbd711b1d8 ("crypto: skcipher - use the new scatterwalk functions")
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Eric Biggers and committed by
Herbert Xu
eca68284 98330b9a

+3 -3
+3 -3
crypto/skcipher.c
··· 209 209 diff |= (u8 *)(sg_page(walk->in.sg) + (walk->in.offset >> PAGE_SHIFT)) - 210 210 (u8 *)(sg_page(walk->out.sg) + (walk->out.offset >> PAGE_SHIFT)); 211 211 212 - skcipher_map_src(walk); 213 - walk->dst.virt.addr = walk->src.virt.addr; 212 + skcipher_map_dst(walk); 213 + walk->src.virt.addr = walk->dst.virt.addr; 214 214 215 215 if (diff) { 216 216 walk->flags |= SKCIPHER_WALK_DIFF; 217 - skcipher_map_dst(walk); 217 + skcipher_map_src(walk); 218 218 } 219 219 220 220 return 0;