git: b484bcd504a2 - main - nfscl: Fix handling of a copyout() error reply

From: Rick Macklem <rmacklem_at_FreeBSD.org>
Date: Fri, 22 Dec 2023 20:12:41 UTC
The branch main has been updated by rmacklem:

URL: https://cgit.FreeBSD.org/src/commit/?id=b484bcd504a29037752d5214a418412724761d88

commit b484bcd504a29037752d5214a418412724761d88
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2023-12-22 20:11:22 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2023-12-22 20:11:22 +0000

    nfscl: Fix handling of a copyout() error reply
    
    If vfs.nfs.nfs_directio_enable is set non-zero (the default is
    zero) and a file on an NFS mount is read after being opened
    with O_DIRECT | O_ RDONLY, a call to nfsm_mbufuio() calls
    copyout() without checking for an error return.
    If copyout() returns EFAULT, this would not work correctly.
    
    Only the call path
     VOP_READ()->ncl_readrpc()->nfsrpc_read()->nfsrpc_readrpc()
    will do this and the error return for EFAULT will
    be returned back to VOP_READ().
    
    This patch adds the error check to nfsm_mbufuio().
    
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D43160
---
 sys/fs/nfs/nfs_commonsubs.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c
index 832713e6c1de..e79f73739487 100644
--- a/sys/fs/nfs/nfs_commonsubs.c
+++ b/sys/fs/nfs/nfs_commonsubs.c
@@ -679,17 +679,13 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
 				    ("len %d, corrupted mbuf?", len));
 			}
 			xfer = (left > len) ? len : left;
-#ifdef notdef
-			/* Not Yet.. */
-			if (uiop->uio_iov->iov_op != NULL)
-				(*(uiop->uio_iov->iov_op))
-				(mbufcp, uiocp, xfer);
-			else
-#endif
 			if (uiop->uio_segflg == UIO_SYSSPACE)
 				NFSBCOPY(mbufcp, uiocp, xfer);
-			else
-				copyout(mbufcp, uiocp, xfer);
+			else {
+				error = copyout(mbufcp, uiocp, xfer);
+				if (error != 0)
+					goto out;
+			}
 			left -= xfer;
 			len -= xfer;
 			mbufcp += xfer;