Commit c3d2a04f authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Use xdr_inline_decode() to decode NFSv3 symlinks



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: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 98124f5b
Loading
Loading
Loading
Loading
+3 −11
Original line number Diff line number Diff line
@@ -616,8 +616,6 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr)
{
	struct nfsd3_symlinkargs *args = rqstp->rq_argp;
	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))
		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)
		return false;

	/* request sanity */
	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;
	/* symlink_data */
	args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);

	return true;
	args->first.iov_base = xdr_inline_decode(xdr, args->tlen);
	return args->first.iov_base != NULL;
}

bool