NFSD: Use xdr_inline_decode() to decode NFSv3 symlinks
[ Upstream commit c3d2a04f05c590303c125a176e6e43df4a436fdb ] Replace the check for buffer over/underflow with a helper that is commonly used for this purpose. The helper also sets xdr->nwords correctly after successfully linearizing the symlink argument into the stream's scratch buffer. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
d08acee648
commit
c92e8b295a
@@ -616,8 +616,6 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
|
|||||||
{
|
{
|
||||||
struct nfsd3_symlinkargs *args = rqstp->rq_argp;
|
struct nfsd3_symlinkargs *args = rqstp->rq_argp;
|
||||||
struct kvec *head = rqstp->rq_arg.head;
|
struct kvec *head = rqstp->rq_arg.head;
|
||||||
struct kvec *tail = rqstp->rq_arg.tail;
|
|
||||||
size_t remaining;
|
|
||||||
|
|
||||||
if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen))
|
if (!svcxdr_decode_diropargs3(xdr, &args->ffh, &args->fname, &args->flen))
|
||||||
return false;
|
return false;
|
||||||
@@ -626,16 +624,10 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
|
|||||||
if (xdr_stream_decode_u32(xdr, &args->tlen) < 0)
|
if (xdr_stream_decode_u32(xdr, &args->tlen) < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* request sanity */
|
/* symlink_data */
|
||||||
remaining = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len;
|
|
||||||
remaining -= xdr_stream_pos(xdr);
|
|
||||||
if (remaining < xdr_align_size(args->tlen))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
args->first.iov_base = xdr->p;
|
|
||||||
args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);
|
args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);
|
||||||
|
args->first.iov_base = xdr_inline_decode(xdr, args->tlen);
|
||||||
return true;
|
return args->first.iov_base != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
Reference in New Issue
Block a user