|
@@ -358,6 +358,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
{
|
|
|
unsigned int len, v, hdr, dlen;
|
|
|
u32 max_blocksize = svc_max_payload(rqstp);
|
|
|
+ struct kvec *head = rqstp->rq_arg.head;
|
|
|
+ struct kvec *tail = rqstp->rq_arg.tail;
|
|
|
|
|
|
p = decode_fh(p, &args->fh);
|
|
|
if (!p)
|
|
@@ -367,6 +369,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
args->count = ntohl(*p++);
|
|
|
args->stable = ntohl(*p++);
|
|
|
len = args->len = ntohl(*p++);
|
|
|
+ if ((void *)p > head->iov_base + head->iov_len)
|
|
|
+ return 0;
|
|
|
/*
|
|
|
* The count must equal the amount of data passed.
|
|
|
*/
|
|
@@ -377,9 +381,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
* Check to make sure that we got the right number of
|
|
|
* bytes.
|
|
|
*/
|
|
|
- hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
|
|
|
- dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
|
|
|
- + rqstp->rq_arg.tail[0].iov_len - hdr;
|
|
|
+ hdr = (void*)p - head->iov_base;
|
|
|
+ dlen = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len - hdr;
|
|
|
/*
|
|
|
* Round the length of the data which was specified up to
|
|
|
* the next multiple of XDR units and then compare that
|
|
@@ -396,7 +399,7 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
len = args->len = max_blocksize;
|
|
|
}
|
|
|
rqstp->rq_vec[0].iov_base = (void*)p;
|
|
|
- rqstp->rq_vec[0].iov_len = rqstp->rq_arg.head[0].iov_len - hdr;
|
|
|
+ rqstp->rq_vec[0].iov_len = head->iov_len - hdr;
|
|
|
v = 0;
|
|
|
while (len > rqstp->rq_vec[v].iov_len) {
|
|
|
len -= rqstp->rq_vec[v].iov_len;
|
|
@@ -471,6 +474,8 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
/* first copy and check from the first page */
|
|
|
old = (char*)p;
|
|
|
vec = &rqstp->rq_arg.head[0];
|
|
|
+ if ((void *)old > vec->iov_base + vec->iov_len)
|
|
|
+ return 0;
|
|
|
avail = vec->iov_len - (old - (char*)vec->iov_base);
|
|
|
while (len && avail && *old) {
|
|
|
*new++ = *old++;
|