File 0001-rpcb_clnt.c-config-to-try-protocolversion-2-first.patch of Package libtirpc.25872

Index: libtirpc-1.2.6/man/Makefile.am
===================================================================
--- libtirpc-1.2.6.orig/man/Makefile.am
+++ libtirpc-1.2.6/man/Makefile.am
@@ -16,6 +16,7 @@ RPCSEC_MANS		= rpcsec_gss.3t rpc_gss_get
 			  rpc_gss_get_principal_name.3t rpc_gss_set_callback.3t \
 			  rpc_gss_set_svc_name.3t rpc_gss_svc_max_data_length.3t
 
+dist_man7_MANS		= netconfig-try-2-first.7
 dist_man5_MANS		= netconfig.5
 dist_man3_MANS		= $(LOOKUP_MANS) $(NETCONFIG_MANS) \
 			  $(BIND_MANS) $(GENERIC_MANS) $(COMPAT_MANS) \
Index: libtirpc-1.2.6/man/netconfig-try-2-first.7
===================================================================
--- /dev/null
+++ libtirpc-1.2.6/man/netconfig-try-2-first.7
@@ -0,0 +1,18 @@
+.Dd January 16, 2019
+.Dt NETCONFIG-TRY-2-FIRST 7
+.Os
+.Sh NAME
+.Nm netconfig-try-2-first
+.Nd indicator to enfore tcp protocol version 2
+.Sh SYNOPSIS
+.Pa /etc/netconfig-try-2-first
+.Sh DESCRIPTION
+libtirpc tries per default for transport UDP and TCP the rpc protocol versions
+in the sequence 4, 3, 2.
+In some setups, it is necessary to try rpc protocol version 2 first.
+Creating the file
+.Nm
+will enforce this.
+.Ed
+.Sh FILES
+/etc/netconfig-try-2-first
Index: libtirpc-1.2.6/man/netconfig.5
===================================================================
--- libtirpc-1.2.6.orig/man/netconfig.5
+++ libtirpc-1.2.6/man/netconfig.5
@@ -119,5 +119,6 @@ struct netconfig {
 .It Pa /etc/netconfig
 .El
 .Sh SEE ALSO
+.Xr netconfig-try-2-first 7 ,
 .Xr getnetconfig 3 ,
 .Xr getnetpath 3
Index: libtirpc-1.2.6/src/rpcb_clnt.c
===================================================================
--- libtirpc-1.2.6.orig/src/rpcb_clnt.c
+++ libtirpc-1.2.6/src/rpcb_clnt.c
@@ -32,6 +32,7 @@
  */
 #include <pthread.h>
 #include <reentrant.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -839,6 +840,9 @@ __rpcb_findaddr_timed(program, version,
 #ifdef NOTUSED
 	static bool_t check_rpcbind = TRUE;
 #endif
+#ifdef PORTMAP
+	bool_t portmap_first = FALSE;
+#endif
 	CLIENT *client = NULL;
 	RPCB parms;
 	enum clnt_stat clnt_st;
@@ -884,6 +888,18 @@ __rpcb_findaddr_timed(program, version,
 		parms.r_addr = NULL;
 	}
 
+#ifdef PORTMAP
+	 /*enforce protocol version 2 if file exists */
+	 struct stat fileStat;
+
+	 if (stat("/etc/netconfig-try-2-first" ,&fileStat) == 0 &&
+	 strcmp(nconf->nc_protofmly, NC_INET) == 0) {
+		 portmap_first = TRUE;
+		 goto portmap;
+	 }
+#endif
+
+rpcbind:
 	if (client == NULL) {
 		client = getclnthandle(host, nconf, &parms.r_addr);
 		if (client == NULL) {
@@ -943,17 +959,26 @@ __rpcb_findaddr_timed(program, version,
 		}
 	}
 
+	if (portmap_first) {
+		goto check_address;
+	}
+
+portmap:
 #ifdef PORTMAP 	/* Try version 2 for TCP or UDP */
 	if (strcmp(nconf->nc_protofmly, NC_INET) == 0) {
 		address = __try_protocol_version_2(program, version, nconf, host, tp);
-		if (address == NULL)
+		if (address == NULL && portmap_first)
+			goto rpcbind;
+		else
 			goto error;
 	}
 #endif		/* PORTMAP */
 
+check_address:
 	if ((address == NULL) || (address->len == 0)) {
-	  rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
-	  clnt_geterr(client, &rpc_createerr.cf_error);
+		rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
+		if (client)
+			clnt_geterr(client, &rpc_createerr.cf_error);
 	}
 
 error:
openSUSE Build Service is sponsored by