From mblapp@fuchur.lan.attic.ch  Sun Mar 25 04:51:53 2001
Return-Path: <mblapp@fuchur.lan.attic.ch>
Received: from fuchur.lan.attic.ch (fuchur.lan.attic.ch [194.235.47.21])
	by hub.freebsd.org (Postfix) with ESMTP id 4830F37B719
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 25 Mar 2001 04:51:51 -0800 (PST)
	(envelope-from mblapp@fuchur.lan.attic.ch)
Received: (from root@localhost)
	by fuchur.lan.attic.ch (8.11.3/8.11.3) id f2PCqSN39734;
	Sun, 25 Mar 2001 14:52:28 +0200 (CEST)
	(envelope-from mblapp)
Message-Id: <200103251252.f2PCqSN39734@fuchur.lan.attic.ch>
Date: Sun, 25 Mar 2001 14:52:28 +0200 (CEST)
From: mb@imp.ch
Reply-To: mb@imp.ch
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [Fix] nfsd with ipv4 only
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         26069
>Category:       bin
>Synopsis:       [Fix] nfsd with ipv4 only
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    gnats-admin
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 25 05:00:01 PST 2001
>Closed-Date:    Sun Mar 25 07:35:36 PST 2001
>Last-Modified:  Wed Oct 26 06:36:51 GMT 2005
>Originator:     
>Release:        
>Organization:
>Environment:
>Description:

Deal with cases where in /etc/netconfig there are commented out ipv6 entries
or kernels which only provide IPv4 functionality. We should always test both
cases, netconfig and ipv6 support.

>How-To-Repeat:

>Fix:

http://home.teleport.ch/freebsd/nfsd.c.diff

--- sbin/nfsd/nfsd.c	Mon Mar 19 13:50:01 2001
+++ sbin/nfsd/nfsd.c	Sat Mar 24 13:02:11 2001
@@ -256,7 +256,8 @@
 	ip6flag = 1;
 	s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
 	if (s < 0 && (errno == EPROTONOSUPPORT ||
-	   errno == EPFNOSUPPORT || errno == EAFNOSUPPORT))
+	   errno == EPFNOSUPPORT || errno == EAFNOSUPPORT) ||
+	   (getnetconfigent("udp6") == NULL && getnetconfigent("tcp6") == NULL))
 		ip6flag = 0;
 	else
 		close(s);
@@ -548,12 +549,15 @@
 			}
 			nconf_udp = getnetconfigent("udp");
 			if (nconf_udp == NULL)
-				err(1, "getnetconfigent udp failed");
-			nb_udp.buf = ai_udp->ai_addr;
-			nb_udp.len = nb_udp.maxlen = ai_udp->ai_addrlen;
-			if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp, &nb_udp)) ||
-			    (!rpcb_set(RPCPROG_NFS, 3, nconf_udp, &nb_udp)))
-				err(1, "rpcb_set udp failed");
+				syslog(LOG_ERR, "getnetconfigent udp failed");
+			else {
+				nb_udp.buf = ai_udp->ai_addr;
+				nb_udp.len = nb_udp.maxlen = ai_udp->ai_addrlen;
+				if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp,
+				    &nb_udp)) || (!rpcb_set(RPCPROG_NFS, 3,
+				    nconf_udp, &nb_udp)))
+					syslog(LOG_ERR, "rpcb_set udp failed");
+			}
 			freeaddrinfo(ai_udp);
 		}
 	}
@@ -618,12 +622,16 @@
 			}
 			nconf_udp6 = getnetconfigent("udp6");
 			if (nconf_udp6 == NULL)
-				err(1, "getnetconfigent udp6 failed");
-			nb_udp6.buf = ai_udp6->ai_addr;
-			nb_udp6.len = nb_udp6.maxlen = ai_udp6->ai_addrlen;
-			if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp6, &nb_udp6)) ||
-			    (!rpcb_set(RPCPROG_NFS, 3, nconf_udp6, &nb_udp6)))
-				err(1, "rpcb_set udp6 failed");
+				syslog(LOG_ERR, "getnetconfigent udp6 failed");
+			else {
+				nb_udp6.buf = ai_udp6->ai_addr;
+				nb_udp6.len = nb_udp6.maxlen;
+				nb_udp6.len = ai_udp6->ai_addrlen;
+				if ((!rpcb_set(RPCPROG_NFS, 2, nconf_udp6,
+				    &nb_udp6)) || (!rpcb_set(RPCPROG_NFS, 3,
+				    nconf_udp6, &nb_udp6)))
+					syslog(LOG_ERR, "rpcb_set udp6 failed");
+			}
 			freeaddrinfo(ai_udp6);
 		}
 	}
@@ -684,13 +692,15 @@
 			}
 			nconf_tcp = getnetconfigent("tcp");
 			if (nconf_tcp == NULL)
-				err(1, "getnetconfigent tcp failed");
-			nb_tcp.buf = ai_tcp->ai_addr;
-			nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen;
-			if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp,
-			    &nb_tcp)) || (!rpcb_set(RPCPROG_NFS, 3,
-			    nconf_tcp, &nb_tcp)))
-				err(1, "rpcb_set tcp failed");
+				syslog(LOG_ERR, "getnetconfigent tcp failed");
+			else {
+				nb_tcp.buf = ai_tcp->ai_addr;
+				nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen;
+				if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp,
+				    &nb_tcp)) || (!rpcb_set(RPCPROG_NFS, 3,
+				    nconf_tcp, &nb_tcp)))
+					syslog(LOG_ERR, "rpcb_set tcp failed");
+			}
 			freeaddrinfo(ai_tcp);
 		}
 	}
@@ -759,12 +769,16 @@
 			}
 			nconf_tcp6 = getnetconfigent("tcp6");
 			if (nconf_tcp6 == NULL)
-				err(1, "getnetconfigent tcp6 failed");
-			nb_tcp6.buf = ai_tcp6->ai_addr;
-			nb_tcp6.len = nb_tcp6.maxlen = ai_tcp6->ai_addrlen;
-			if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp6, &nb_tcp6)) ||
-			    (!rpcb_set(RPCPROG_NFS, 3, nconf_tcp6, &nb_tcp6)))
-				err(1, "rpcb_set tcp6 failed");
+				syslog(LOG_ERR, "getnetconfigent tcp6 failed");
+			else {
+				nb_tcp6.buf = ai_tcp6->ai_addr;
+				nb_tcp6.len = nb_tcp6.maxlen;
+				nb_tcp6.len = ai_tcp6->ai_addrlen;
+				if ((!rpcb_set(RPCPROG_NFS, 2, nconf_tcp6,
+				    &nb_tcp6)) || (!rpcb_set(RPCPROG_NFS,
+				    3, nconf_tcp6, &nb_tcp6)))
+					syslog(LOG_ERR, "rpcb_set tcp6 failed");
+			}
 			freeaddrinfo(ai_tcp6);
 		}
 	}
>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: roam 
State-Changed-When: Sun Mar 25 07:35:36 PST 2001 
State-Changed-Why:  
Misfiled; originator shall refile. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=26069 
>Unformatted:
 System: FreeBSD fuchur.lan.attic.ch 5.0-CURRENT FreeBSD 5.0-CURRENT #8: Tue Mar 20 14:39:22 CET 2001 root@fuchur.lan.attic.ch:/usr/src/sys/compile/MARTIN i386
 
