|
@@ -334,8 +334,11 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
|
if (!p)
|
|
if (!p)
|
|
return 0;
|
|
return 0;
|
|
p = xdr_decode_hyper(p, &args->offset);
|
|
p = xdr_decode_hyper(p, &args->offset);
|
|
-
|
|
|
|
args->count = ntohl(*p++);
|
|
args->count = ntohl(*p++);
|
|
|
|
+
|
|
|
|
+ if (!xdr_argsize_check(rqstp, p))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
len = min(args->count, max_blocksize);
|
|
len = min(args->count, max_blocksize);
|
|
|
|
|
|
/* set up the kvec */
|
|
/* set up the kvec */
|
|
@@ -349,7 +352,7 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
|
v++;
|
|
v++;
|
|
}
|
|
}
|
|
args->vlen = v;
|
|
args->vlen = v;
|
|
- return xdr_argsize_check(rqstp, p);
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
int
|
|
@@ -541,9 +544,11 @@ nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
|
p = decode_fh(p, &args->fh);
|
|
p = decode_fh(p, &args->fh);
|
|
if (!p)
|
|
if (!p)
|
|
return 0;
|
|
return 0;
|
|
|
|
+ if (!xdr_argsize_check(rqstp, p))
|
|
|
|
+ return 0;
|
|
args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
|
|
|
|
- return xdr_argsize_check(rqstp, p);
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
int
|
|
@@ -569,10 +574,14 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
|
|
args->verf = p; p += 2;
|
|
args->verf = p; p += 2;
|
|
args->dircount = ~0;
|
|
args->dircount = ~0;
|
|
args->count = ntohl(*p++);
|
|
args->count = ntohl(*p++);
|
|
|
|
+
|
|
|
|
+ if (!xdr_argsize_check(rqstp, p))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
args->count = min_t(u32, args->count, PAGE_SIZE);
|
|
args->count = min_t(u32, args->count, PAGE_SIZE);
|
|
args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
|
|
|
|
- return xdr_argsize_check(rqstp, p);
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
int
|
|
@@ -590,6 +599,9 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
|
args->dircount = ntohl(*p++);
|
|
args->dircount = ntohl(*p++);
|
|
args->count = ntohl(*p++);
|
|
args->count = ntohl(*p++);
|
|
|
|
|
|
|
|
+ if (!xdr_argsize_check(rqstp, p))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
len = args->count = min(args->count, max_blocksize);
|
|
len = args->count = min(args->count, max_blocksize);
|
|
while (len > 0) {
|
|
while (len > 0) {
|
|
struct page *p = *(rqstp->rq_next_page++);
|
|
struct page *p = *(rqstp->rq_next_page++);
|
|
@@ -597,8 +609,7 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
|
args->buffer = page_address(p);
|
|
args->buffer = page_address(p);
|
|
len -= PAGE_SIZE;
|
|
len -= PAGE_SIZE;
|
|
}
|
|
}
|
|
-
|
|
|
|
- return xdr_argsize_check(rqstp, p);
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
int
|