]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
NFSD: Use xdr_inline_decode() to decode NFSv3 symlinks
authorChuck Lever <chuck.lever@oracle.com>
Mon, 12 Sep 2022 21:23:02 +0000 (17:23 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 26 Sep 2022 18:02:47 +0000 (14:02 -0400)
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>
fs/nfsd/nfs3xdr.c

index 0293b8d65f10fc948c212f653dd9f3e4121a3b48..71e32cf28885485be5c852f55d72eb68e17b69ce 100644 (file)
@@ -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