* clnt_udp.c (clntudp_call): Do not assume that select will not
authorEzra Peisach <epeisach@mit.edu>
Fri, 10 Aug 2001 15:20:16 +0000 (15:20 +0000)
committerEzra Peisach <epeisach@mit.edu>
Fri, 10 Aug 2001 15:20:16 +0000 (15:20 +0000)
change the timeout struct timeval. Under Linux, this reflects the
time left available - which might result in 0 in the case of a
timeout. When attempting to resend a request, this may results in
a timeout of zero - flooding the server with replay requests.

* clnt_tcp.c (readtcp): Same.
* pmap_rmt.c (clnt_broadcast): Same
* svc_tcp.c (readtcp): Same

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13679 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/rpc/ChangeLog
src/lib/rpc/clnt_tcp.c
src/lib/rpc/clnt_udp.c
src/lib/rpc/pmap_rmt.c
src/lib/rpc/svc_tcp.c

index b17eeff870ff6646a3a43f4e807ee2b06172e99f..d48cc888bfb315004f71a9163ca4639f94716eb9 100644 (file)
@@ -1,3 +1,15 @@
+2001-08-10    <epeisach@mit.edu>
+
+       * clnt_udp.c (clntudp_call): Do not assume that select will not
+       change the timeout struct timeval. Under Linux, this reflects the
+       time left available - which might result in 0 in the case of a
+       timeout. When attempting to resend a request, this may results in
+       a timeout of zero - flooding the server with replay requests.
+       
+       * clnt_tcp.c (readtcp): Same.
+       * pmap_rmt.c (clnt_broadcast): Same
+       * svc_tcp.c (readtcp): Same
+
 2001-07-26  Ezra Peisach  <epeisach@home>
 
        * xdr_reference.c (xdr_reference): Remove cast in argument to memset.
index 00e4e51c964390e6631e654b9ade413962b11068..b43775e2bb2412517881a2ac65d251d855d346d0 100644 (file)
@@ -422,6 +422,7 @@ readtcp(ctptr, buf, len)
        register int len;
 {
   register struct ct_data *ct = (struct ct_data *)(void *)ctptr;
+  struct timeval tout;
 #ifdef FD_SETSIZE
        fd_set mask;
        fd_set readfds;
@@ -440,8 +441,9 @@ readtcp(ctptr, buf, len)
 #endif /* def FD_SETSIZE */
        while (TRUE) {
                readfds = mask;
+               tout = ct->ct_wait;
                switch (select(_gssrpc_rpc_dtablesize(), &readfds, (fd_set*)NULL, (fd_set*)NULL,
-                              &(ct->ct_wait))) {
+                              &tout)) {
                case 0:
                        ct->ct_error.re_status = RPC_TIMEDOUT;
                        return (-1);
index 12a3aca0cfe8c016258fb7ce7aa8c25958ceb178..798622e2542a52114da6a8f1ffc581888b227cf7 100644 (file)
@@ -242,7 +242,7 @@ clntudp_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout)
        struct sockaddr_in from;
        struct rpc_msg reply_msg;
        XDR reply_xdrs;
-       struct timeval time_waited;
+       struct timeval time_waited, seltimeout;
        bool_t ok;
        int nrefreshes = 2;     /* number of times to refresh cred */
        struct timeval timeout;
@@ -298,8 +298,9 @@ send_again:
 #endif /* def FD_SETSIZE */
        for (;;) {
                readfds = mask;
+               seltimeout = cu->cu_wait;
                switch (select(_gssrpc_rpc_dtablesize(), &readfds, (fd_set *)NULL, 
-                              (fd_set *)NULL, &(cu->cu_wait))) {
+                              (fd_set *)NULL, &seltimeout)) {
 
                case 0:
                        time_waited.tv_sec += cu->cu_wait.tv_sec;
index 9d03356daf9028d92e3cfc043ba1b7da25595e3b..1d090f732ed1ec3e1072dca9f107ec35dca16d0c 100644 (file)
@@ -257,7 +257,7 @@ clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
        struct rmtcallargs a;
        struct rmtcallres r;
        struct rpc_msg msg;
-       struct timeval t; 
+       struct timeval t, t2
        char outbuf[MAX_BROADCAST_SIZE];
 #ifndef MAX
 #define MAX(A,B) ((A)<(B)?(B):(A))
@@ -342,8 +342,9 @@ clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
                msg.acpted_rply.ar_results.where = (caddr_t)&r;
                 msg.acpted_rply.ar_results.proc = xdr_rmtcallres;
                readfds = mask;
+               t2 = t;
                switch (select(_gssrpc_rpc_dtablesize(), &readfds, (fd_set *)NULL, 
-                              (fd_set *)NULL, &t)) {
+                              (fd_set *)NULL, &t2)) {
 
                case 0:  /* timed out */
                        stat = RPC_TIMEDOUT;
index 771827b22946a87993b6b69e73e7513b65348153..5c7b0e9e59a7de03dcce9d4061fa7f2d5c745b03 100644 (file)
@@ -315,6 +315,7 @@ readtcp(xprtptr, buf, len)
 {
        register SVCXPRT *xprt = (SVCXPRT *)(void *)xprtptr;
        register int sock = xprt->xp_sock;
+       struct timeval tout;
 #ifdef FD_SETSIZE
        fd_set mask;
        fd_set readfds;
@@ -327,8 +328,9 @@ readtcp(xprtptr, buf, len)
 #endif /* def FD_SETSIZE */
        do {
                readfds = mask;
+               tout = wait_per_try;
                if (select(_gssrpc_rpc_dtablesize(), &readfds, (fd_set*)NULL,
-                          (fd_set*)NULL, &wait_per_try) <= 0) {
+                          (fd_set*)NULL, &tout) <= 0) {
                        if (errno == EINTR) {
                                continue;
                        }