Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Apr 2017 21:43:01 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r317272 - head/sys/fs/nfsclient
Message-ID:  <201704212143.v3LLh1bd016663@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Fri Apr 21 21:43:00 2017
New Revision: 317272
URL: https://svnweb.freebsd.org/changeset/base/317272

Log:
  Add checks for failed operations to the NFSv4 client function nfscl_mtofh().
  
  The nfscl_mtofh() function didn't check for failed operations and, as such,
  would have returned EBADRPC for these cases, due to parsing failure.
  This patch adds checks, so that it returns with ND_NOMOREDATA set.
  This is needed for future use in the pNFS server and acts as a safety
  belt in the meantime.
  
  MFC after:	2 weeks

Modified:
  head/sys/fs/nfsclient/nfs_clcomsubs.c

Modified: head/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clcomsubs.c	Fri Apr 21 21:06:11 2017	(r317271)
+++ head/sys/fs/nfsclient/nfs_clcomsubs.c	Fri Apr 21 21:43:00 2017	(r317272)
@@ -471,6 +471,11 @@ nfscl_mtofh(struct nfsrv_descript *nd, s
 		flag = fxdr_unsigned(int, *tl);
 	} else if (nd->nd_flag & ND_NFSV4) {
 		NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+		/* If the GetFH failed, clear flag. */
+		if (*++tl != 0) {
+			nd->nd_flag |= ND_NOMOREDATA;
+			flag = 0;
+		}
 	}
 	if (flag) {
 		error = nfsm_getfh(nd, nfhpp);
@@ -481,8 +486,12 @@ nfscl_mtofh(struct nfsrv_descript *nd, s
 	/*
 	 * Now, get the attributes.
 	 */
-	if (nd->nd_flag & ND_NFSV4) {
+	if (flag != 0 && (nd->nd_flag & ND_NFSV4) != 0) {
 		NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+		if (*++tl != 0) {
+			nd->nd_flag |= ND_NOMOREDATA;
+			flag = 0;
+		}
 	} else if (nd->nd_flag & ND_NFSV3) {
 		NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
 		if (flag) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704212143.v3LLh1bd016663>