summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2018-07-10 13:21:17 -0400
committerSteve Dickson <steved@redhat.com>2018-07-10 13:21:17 -0400
commitc07848a0f9685204e618e9fa858e8fb26169a024 (patch)
tree3b14a88643a52ef1c2bdcb3fd3843a3cc9b315f1 /src
parent25d38d744997d5ff03d8b0f2cdd79c0fb7185cca (diff)
downloadti-rpc-c07848a0f9685204e618e9fa858e8fb26169a024.tar.gz
Handle GARBAGE_ARGS response in rpcbind query
We have a report that some commercial NFS file servers still do not support rpcbind v4 correctly. They return GARBAGE_ARGS instead of PROG_MISMATCH or PROG_UNAVAIL, so our rpcbind client now errors out immediately instead of trying a lower rpcbind version. To address this, convert the "if () else if () else if ()" to a switch statement to make it straightforward to add new status codes to the error processing logic. Then, add a case for RPC_CANTDECODEARGS (the API status code used when the remote responds with GARBAGE_ARGS). Reported-by: Yuan-Yao Sung <yysung@cs.nctu.edu.tw> Fixes: 5e7b57bc20bd ("rpcinfo: change order of version to be ... ") Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Tested-by: Yuan-Yao Sung <yysung@cs.nctu.edu.tw> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/rpcb_clnt.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
index 4b44364..d6fefd0 100644
--- a/src/rpcb_clnt.c
+++ b/src/rpcb_clnt.c
@@ -846,6 +846,7 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
struct netbuf *address = NULL;
rpcvers_t start_vers = RPCBVERS4;
struct netbuf servaddr;
+ struct rpc_err rpcerr;
/* parameter checking */
if (nconf == NULL) {
@@ -902,7 +903,8 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
clnt_st = CLNT_CALL(client, (rpcproc_t)RPCBPROC_GETADDR,
(xdrproc_t) xdr_rpcb, (char *)(void *)&parms,
(xdrproc_t) xdr_wrapstring, (char *)(void *) &ua, *tp);
- if (clnt_st == RPC_SUCCESS) {
+ switch (clnt_st) {
+ case RPC_SUCCESS:
if ((ua == NULL) || (ua[0] == 0)) {
/* address unknown */
rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
@@ -924,12 +926,15 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
(char *)(void *)&servaddr);
__rpc_fixup_addr(address, &servaddr);
goto done;
- } else if (clnt_st == RPC_PROGVERSMISMATCH) {
- struct rpc_err rpcerr;
+ case RPC_PROGVERSMISMATCH:
clnt_geterr(client, &rpcerr);
if (rpcerr.re_vers.low > RPCBVERS4)
goto error; /* a new version, can't handle */
- } else if (clnt_st != RPC_PROGUNAVAIL) {
+ /* Try the next lower version */
+ case RPC_PROGUNAVAIL:
+ case RPC_CANTDECODEARGS:
+ break;
+ default:
/* Cant handle this error */
rpc_createerr.cf_stat = clnt_st;
clnt_geterr(client, &rpc_createerr.cf_error);