f70ee5ec8f
In the loop in scatterwalk_copychunks(), if walk->offset is zero,
then scatterwalk_pagedone rounds that up to the nearest page boundary:
walk->offset += PAGE_SIZE - 1;
walk->offset &= PAGE_MASK;
which is a no-op in this case, so we don't advance to the next element
of the scatterlist array:
if (walk->offset >= walk->sg->offset + walk->sg->length)
scatterwalk_start(walk, sg_next(walk->sg));
and we end up copying the same data twice.
It appears that other callers of scatterwalk_{page}done first advance
walk->offset, so I believe that's the correct thing to do here.
This caused a bug in NFS when run with krb5p security, which would
cause some writes to fail with permissions errors--for example, writes
of less than 8 bytes (the des blocksize) at the start of a file.
A git-bisect shows the bug was originally introduced by
|
||
---|---|---|
.. | ||
aes.c | ||
algapi.c | ||
anubis.c | ||
api.c | ||
arc4.c | ||
blkcipher.c | ||
blowfish.c | ||
camellia.c | ||
cast5.c | ||
cast6.c | ||
cbc.c | ||
cipher.c | ||
compress.c | ||
crc32c.c | ||
crypto_null.c | ||
cryptomgr.c | ||
deflate.c | ||
des.c | ||
digest.c | ||
ecb.c | ||
fcrypt.c | ||
gf128mul.c | ||
hash.c | ||
hmac.c | ||
internal.h | ||
Kconfig | ||
khazad.c | ||
lrw.c | ||
Makefile | ||
md4.c | ||
md5.c | ||
michael_mic.c | ||
pcbc.c | ||
proc.c | ||
scatterwalk.c | ||
scatterwalk.h | ||
serpent.c | ||
sha1.c | ||
sha256.c | ||
sha512.c | ||
tcrypt.c | ||
tcrypt.h | ||
tea.c | ||
tgr192.c | ||
twofish_common.c | ||
twofish.c | ||
wp512.c | ||
xcbc.c |