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>
#define NSMPROG ((rpcprog_t)100024)
#endif
#define NSMPROG ((rpcprog_t)100024)
#endif
+/**
+ * nfs_clear_rpc_createerr - zap all error reporting fields
+ *
+ */
+static inline void nfs_clear_rpc_createerr(void)
+{
+ memset(&rpc_createerr, 0, sizeof(rpc_createerr));
+}
+
/*
* Look up an RPC program name in /etc/rpc
*/
/*
* Look up an RPC program name in /etc/rpc
*/
if (timeout != NULL)
tout = *timeout;
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);
memcpy(saddr, sap, (size_t)salen);
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &tout);
unsigned short port = 0;
CLIENT *client;
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);
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, protocol,
default_rpcb_version, &timeout);
CLIENT *client;
int result = 0;
CLIENT *client;
int result = 0;
+ nfs_clear_rpc_createerr();
+
client = nfs_gp_get_rpcbclient(sap, salen, protocol,
default_rpcb_version, &timeout);
if (client != NULL) {
client = nfs_gp_get_rpcbclient(sap, salen, protocol,
default_rpcb_version, &timeout);
if (client != NULL) {
memcpy(saddr, sap, (size_t)salen);
nfs_gp_set_port(saddr, htons(port));
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) {
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &timeout);
if (client != NULL) {
CLIENT *client;
struct timeval timeout = { -1, 0 };
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;
client = nfs_gp_get_rpcbclient(sap, salen, 0, RPCBVERS_4, &timeout);
if (client != NULL) {
struct rpcb parms;
#endif /* NFS_GP_LOCAL */
if (port == 0) {
#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);
if (nfs_gp_loopback_address(lb_addr, &lb_len)) {
port = nfs_getport(lb_addr, lb_len,
program, version, protocol);
if (timeout != NULL)
tout = *timeout;
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);
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, transport,
RPCBVERS_4, &tout);
__attribute__((unused)) const unsigned short protocol,
__attribute__((unused)) const struct timeval *timeout)
{
__attribute__((unused)) const unsigned short protocol,
__attribute__((unused)) const struct timeval *timeout)
{
+ nfs_clear_rpc_createerr();
+
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
return 0;
}
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
return 0;
}
if (timeout != NULL)
tout = *timeout;
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);
memcpy(saddr, sin, sizeof(address));
client = nfs_gp_get_rpcbclient(saddr, (socklen_t)sizeof(*sin),
transport, PMAPVERS, &tout);
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)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,
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)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,
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,
memcpy(saddr, sap, salen);
p_prot = prot ? &prot : protos;
p_vers = vers ? &vers : versions;
memcpy(saddr, sap, salen);
p_prot = prot ? &prot : protos;
p_vers = vers ? &vers : versions;
- rpc_createerr.cf_stat = 0;
for (;;) {
p_port = nfs_getport(saddr, salen, prog, *p_vers, *p_prot);
for (;;) {
p_port = nfs_getport(saddr, salen, prog, *p_vers, *p_prot);
pmap->pm_prot = *p_prot;
if (!port)
pmap->pm_port = p_port;
pmap->pm_prot = *p_prot;
if (!port)
pmap->pm_port = p_port;
- rpc_createerr.cf_stat = 0;
+ nfs_clear_rpc_createerr();