forked from Minki/linux
nfsd: Fix handling of negative lengths in read_buf()
The length "nbytes" passed into read_buf should never be negative, but we check only for too-large values of "nbytes", not for too-small values. Make nbytes unsigned, so it's clear that the former tests are sufficient. (Despite this read_buf() currently correctly returns an xdr error in the case of a negative length, thanks to an unsigned comparison with size_of() and bounds-checking in kmalloc(). This seems very fragile, though.) Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
a490c681cb
commit
ca2a05aa7c
@ -148,12 +148,12 @@ xdr_error: \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static __be32 *read_buf(struct nfsd4_compoundargs *argp, int nbytes)
|
||||
static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes)
|
||||
{
|
||||
/* We want more bytes than seem to be available.
|
||||
* Maybe we need a new page, maybe we have just run out
|
||||
*/
|
||||
int avail = (char*)argp->end - (char*)argp->p;
|
||||
unsigned int avail = (char *)argp->end - (char *)argp->p;
|
||||
__be32 *p;
|
||||
if (avail + argp->pagelen < nbytes)
|
||||
return NULL;
|
||||
@ -169,6 +169,11 @@ static __be32 *read_buf(struct nfsd4_compoundargs *argp, int nbytes)
|
||||
return NULL;
|
||||
|
||||
}
|
||||
/*
|
||||
* The following memcpy is safe because read_buf is always
|
||||
* called with nbytes > avail, and the two cases above both
|
||||
* guarantee p points to at least nbytes bytes.
|
||||
*/
|
||||
memcpy(p, argp->p, avail);
|
||||
/* step to next page */
|
||||
argp->p = page_address(argp->pagelist[0]);
|
||||
|
Loading…
Reference in New Issue
Block a user