summaryrefslogtreecommitdiffstats
path: root/support/nfs
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2009-07-14 16:24:11 -0400
committerSteve Dickson <steved@redhat.com>2009-07-14 16:24:11 -0400
commitc7fa61e76f072d97a9bdb4a551aa2ba28e5818cc (patch)
treec6e4dbd2357cbbe5c71646be87b5929ad3f24aab /support/nfs
parente188c214f487c9783ab3ae3e987d9a98b9298dfb (diff)
downloadnfs-utils-c7fa61e76f072d97a9bdb4a551aa2ba28e5818cc.tar.gz
nfs-utils-c7fa61e76f072d97a9bdb4a551aa2ba28e5818cc.tar.xz
nfs-utils-c7fa61e76f072d97a9bdb4a551aa2ba28e5818cc.zip
getport: Clear shared error fields before trying rpcbind queries
Some RPC errors set fields in rpc_createerr.cf_error in addition to cf_stat. Be sure to clear _all_ error fields in rpc_createerr each time through the rpcbind API. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'support/nfs')
-rw-r--r--support/nfs/getport.c18
-rw-r--r--support/nfs/rpc_socket.c4
2 files changed, 22 insertions, 0 deletions
diff --git a/support/nfs/getport.c b/support/nfs/getport.c
index 71f02f3..aa9c154 100644
--- a/support/nfs/getport.c
+++ b/support/nfs/getport.c
@@ -627,6 +627,8 @@ int nfs_rpc_ping(const struct sockaddr *sap, const socklen_t salen,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &tout);
@@ -690,6 +692,8 @@ unsigned short nfs_getport(const struct sockaddr *sap,
unsigned short port = 0;
CLIENT *client;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, protocol,
default_rpcb_version, &timeout);
@@ -729,6 +733,8 @@ int nfs_getport_ping(struct sockaddr *sap, const socklen_t salen,
CLIENT *client;
int result = 0;
+ nfs_clear_rpc_createerr();
+
client = nfs_gp_get_rpcbclient(sap, salen, protocol,
default_rpcb_version, &timeout);
if (client != NULL) {
@@ -745,6 +751,8 @@ int nfs_getport_ping(struct sockaddr *sap, const socklen_t salen,
memcpy(saddr, sap, (size_t)salen);
nfs_gp_set_port(saddr, htons(port));
+ nfs_clear_rpc_createerr();
+
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &timeout);
if (client != NULL) {
@@ -803,6 +811,8 @@ unsigned short nfs_getlocalport(const rpcprot_t program,
CLIENT *client;
struct timeval timeout = { -1, 0 };
+ nfs_clear_rpc_createerr();
+
client = nfs_gp_get_rpcbclient(sap, salen, 0, RPCBVERS_4, &timeout);
if (client != NULL) {
struct rpcb parms;
@@ -817,6 +827,8 @@ unsigned short nfs_getlocalport(const rpcprot_t program,
#endif /* NFS_GP_LOCAL */
if (port == 0) {
+ nfs_clear_rpc_createerr();
+
if (nfs_gp_loopback_address(lb_addr, &lb_len)) {
port = nfs_getport(lb_addr, lb_len,
program, version, protocol);
@@ -878,6 +890,8 @@ unsigned short nfs_rpcb_getaddr(const struct sockaddr *sap,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, transport,
RPCBVERS_4, &tout);
@@ -904,6 +918,8 @@ unsigned short nfs_rpcb_getaddr(__attribute__((unused)) const struct sockaddr *s
__attribute__((unused)) const unsigned short protocol,
__attribute__((unused)) const struct timeval *timeout)
{
+ nfs_clear_rpc_createerr();
+
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
return 0;
}
@@ -959,6 +975,8 @@ unsigned long nfs_pmap_getport(const struct sockaddr_in *sin,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sin, sizeof(address));
client = nfs_gp_get_rpcbclient(saddr, (socklen_t)sizeof(*sin),
transport, PMAPVERS, &tout);
diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c
index ac4e6d8..a080487 100644
--- a/support/nfs/rpc_socket.c
+++ b/support/nfs/rpc_socket.c
@@ -443,6 +443,8 @@ CLIENT *nfs_get_rpcclient(const struct sockaddr *sap,
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ nfs_clear_rpc_createerr();
+
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,
@@ -506,6 +508,8 @@ CLIENT *nfs_get_priv_rpcclient(const struct sockaddr *sap,
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ nfs_clear_rpc_createerr();
+
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,