[PATCH] crypto: scatterwalk_copychunks() fails to advance through scatterlist

Talpey, Thomas Thomas.Talpey at netapp.com
Tue Mar 20 06:28:29 EDT 2007


By the way, Bruce...

GOOD ONE!

Tom.

At 07:55 PM 3/19/2007, J. Bruce Fields wrote:
>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
>5c64097aa0f6dc4f27718ef47ca9a12538d62860, first in 2.6.19-rc1.
>
>Signed-off-by: "J. Bruce Fields" <bfields at citi.umich.edu>
>---
> crypto/scatterwalk.c |    4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
>diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
>index 35172d3..a664231 100644
>--- a/crypto/scatterwalk.c
>+++ b/crypto/scatterwalk.c
>@@ -91,6 +91,8 @@ void scatterwalk_copychunks(void *buf, struct 
>scatter_walk *walk,
> 		memcpy_dir(buf, vaddr, len_this_page, out);
> 		scatterwalk_unmap(vaddr, out);
> 
>+		scatterwalk_advance(walk, nbytes);
>+
> 		if (nbytes == len_this_page)
> 			break;
> 
>@@ -99,7 +101,5 @@ void scatterwalk_copychunks(void *buf, struct 
>scatter_walk *walk,
> 
> 		scatterwalk_pagedone(walk, out, 1);
> 	}
>-
>-	scatterwalk_advance(walk, nbytes);
> }
> EXPORT_SYMBOL_GPL(scatterwalk_copychunks);
>-- 
>1.5.0.3.31.ge47c
>
>_______________________________________________
>NFSv4 mailing list
>NFSv4 at linux-nfs.org
>http://linux-nfs.org/cgi-bin/mailman/listinfo/nfsv4



More information about the NFSv4 mailing list