git: 7d9dc91a9901 - main - nfscl: Fix the NFSv4.0 mount so that it does not crash

From: Rick Macklem <rmacklem_at_FreeBSD.org>
Date: Sat, 15 Oct 2022 15:39:58 UTC
The branch main has been updated by rmacklem:

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

commit 7d9dc91a9901689bbf263935ef1b04617a70efb0
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2022-10-15 15:38:07 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2022-10-15 15:38:07 +0000

    nfscl: Fix the NFSv4.0 mount so that it does not crash
    
    Commit efe58855f3ea modifies IN_LOOPBACK() so that it uses a VNET
    variable. Without this patch, nfscl_getmyip() uses IN_LOOPBACK()
    when the VNET is not set and crashes the system.
    nfscl_getmyip() is only called when a NFSv4.0 (not NFSv4.1/4.2)
    mount is done.
    
    This patch re-organizes nfscl_getmyip() so that IN_LOOPBACK()
    is before the CURVENT_RESTORE() macro, to avoid the crashes.
    
    Reviewed by:    karels, zlei.huang_gmail.com
    Differential Revision:  https://reviews.freebsd.org/D37008
---
 sys/fs/nfsclient/nfs_clport.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c
index e77aaccbc720..f5d7c3caea0f 100644
--- a/sys/fs/nfsclient/nfs_clport.c
+++ b/sys/fs/nfsclient/nfs_clport.c
@@ -1014,18 +1014,18 @@ nfscl_getmyip(struct nfsmount *nmp, struct in6_addr *paddr, int *isinet6p)
 		NET_EPOCH_ENTER(et);
 		CURVNET_SET(CRED_TO_VNET(nmp->nm_sockreq.nr_cred));
 		nh = fib4_lookup(fibnum, sin->sin_addr, 0, NHR_NONE, 0);
-		CURVNET_RESTORE();
-		if (nh != NULL)
+		if (nh != NULL) {
 			addr = IA_SIN(ifatoia(nh->nh_ifa))->sin_addr;
+			if (IN_LOOPBACK(ntohl(addr.s_addr))) {
+				/* Ignore loopback addresses */
+				nh = NULL;
+			}
+		}
+		CURVNET_RESTORE();
 		NET_EPOCH_EXIT(et);
-		if (nh == NULL)
-			return (NULL);
 
-		if (IN_LOOPBACK(ntohl(addr.s_addr))) {
-			/* Ignore loopback addresses */
+		if (nh == NULL)
 			return (NULL);
-		}
-
 		*isinet6p = 0;
 		*((struct in_addr *)paddr) = addr;