File 0001-rpcb_clnt.c-config-to-try-protocolversion-2-first.patch of Package libtirpc.22954
From b5ce9e8bf0b9561e1be44b33155f29422ba9277d Mon Sep 17 00:00:00 2001
From: Thomas Blume <Thomas.Blume@suse.com>
Date: Mon, 20 Dec 2021 16:17:29 +0100
Subject: [PATCH] rpcb_clnt.c config to try protocolversion 2 first
In some setups, it is necessary to try rpc protocol version 2 first.
Creating the file /etc/netconfig-try-2-first will enforce this.
Signed-off-by: Thomas Blume <Thomas.Blume@suse.com>
---
man/Makefile.am | 1 +
man/netconfig-try-2-first.7 | 18 ++++++++++++++++++
man/netconfig.5 | 1 +
src/rpcb_clnt.c | 29 ++++++++++++++++++++++++++---
4 files changed, 46 insertions(+), 3 deletions(-)
create mode 100644 man/netconfig-try-2-first.7
diff --git a/man/Makefile.am b/man/Makefile.am
index fa43bb4..38907d4 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -16,6 +16,7 @@ RPCSEC_MANS = rpcsec_gss.3t rpc_gss_get_error.3t \
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) \
diff --git a/man/netconfig-try-2-first.7 b/man/netconfig-try-2-first.7
new file mode 100644
index 0000000..475c483
--- /dev/null
+++ b/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
diff --git a/man/netconfig.5 b/man/netconfig.5
index e8dcbb2..beaf27a 100644
--- a/man/netconfig.5
+++ b/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
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
index 0c34cb7..d0336b9 100644
--- a/src/rpcb_clnt.c
+++ b/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>
@@ -838,6 +839,9 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
{
#ifdef NOTUSED
static bool_t check_rpcbind = TRUE;
+#endif
+#ifdef PORTMAP
+ bool_t portmap_first = FALSE;
#endif
CLIENT *client = NULL;
RPCB parms;
@@ -884,6 +888,17 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
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) {
+ portmap_first = TRUE;
+ goto portmap;
+ }
+#endif
+
+rpcbind:
if (client == NULL) {
client = getclnthandle(host, nconf, &parms.r_addr);
if (client == NULL) {
@@ -943,17 +958,25 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
}
}
+ 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;
+ clnt_geterr(client, &rpc_createerr.cf_error);
}
error:
--
2.34.1