summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2009-06-29 12:43:26 -0400
committerSteve Dickson <steved@redhat.com>2009-06-29 12:43:26 -0400
commitf5b14fb4f37220a31a8d483cb507ac6e7d89d84d (patch)
treec90fad81acb18fcf4db517ca54cab0959cb77524
parent777fe08901fe1801f57e3758bb095cf381d0a179 (diff)
downloadti-rpc-f5b14fb4f37220a31a8d483cb507ac6e7d89d84d.tar.gz
clnt_dg: Fix infinite loop when datagram call times out
After an RPC over datagram call times out, clnt_dg_call() goes into a loop, spamming the server with endless retransmits. Since signals are masked, a ^C doesn't break the loop -- the process must be KILLed. Add missing logic to exit appropriately after the call's total time has expired. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--src/clnt_dg.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/clnt_dg.c b/src/clnt_dg.c
index 2eeaada..2f870b1 100644
--- a/src/clnt_dg.c
+++ b/src/clnt_dg.c
@@ -381,6 +381,10 @@ call_again:
}
send_again:
+ if (total_time <= 0) {
+ cu->cu_error.re_status = RPC_TIMEDOUT;
+ goto out;
+ }
nextsend_time = cu->cu_wait.tv_sec * 1000 + cu->cu_wait.tv_usec / 1000;
if (sendto(cu->cu_fd, cu->cu_outbuf, outlen, 0, sa, salen) != outlen) {
cu->cu_error.re_errno = errno;