diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2007-08-03 13:24:00 -0400 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-08-04 08:27:40 +1000 |
commit | 7f8fae8cd60025f7fa1b446da363dcc2e1fb5b6a (patch) | |
tree | 076efb9ae9849daf4b28ce24df9d05aad67c8bb2 | |
parent | ac3611f10500d2942d0295c65b3d7b47621609d4 (diff) | |
download | nfs-utils-7f8fae8cd60025f7fa1b446da363dcc2e1fb5b6a.tar.gz nfs-utils-7f8fae8cd60025f7fa1b446da363dcc2e1fb5b6a.tar.xz nfs-utils-7f8fae8cd60025f7fa1b446da363dcc2e1fb5b6a.zip |
mount.nfs: get_socket() may clobber errno, but preserves .re_errno
get_socket() guarantees that rpc_createerr.cf_error.re_errno is set
correctly after an error, but it can wipe errno if it has to print an error
message. Make sure that clnt_ping() checks the correct error code when
get_socket() returns.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r-- | utils/mount/network.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index 132ff1e..5a56c23 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -310,19 +310,11 @@ static unsigned short getport(struct sockaddr_in *saddr, saddr->sin_port = htons(PMAPPORT); - /* - * Try to get a socket with a non-privileged port. - * clnt*create() will create one anyway if this - * fails. - */ socket = get_socket(saddr, proto, PMAP_TIMEOUT, FALSE, FALSE); if (socket == RPC_ANYSOCK) { - if (proto == IPPROTO_TCP && errno == ETIMEDOUT) { - /* - * TCP SYN timed out, so exit now. - */ + if (proto == IPPROTO_TCP && + rpc_createerr.cf_error.re_errno == ETIMEDOUT) rpc_createerr.cf_stat = RPC_TIMEDOUT; - } return 0; } @@ -660,10 +652,10 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog, static char clnt_res; struct sockaddr dissolve; - rpc_createerr.cf_stat = stat = errno = 0; + rpc_createerr.cf_stat = stat = 0; sock = get_socket(saddr, prot, CONNECT_TIMEOUT, FALSE, TRUE); if (sock == RPC_ANYSOCK) { - if (errno == ETIMEDOUT) { + if (rpc_createerr.cf_error.re_errno == ETIMEDOUT) { /* * TCP timeout. Bubble up the error to see * how it should be handled. |