re-randomize xid on reuse of a CLIENT *; pointed out by adam@math.tau.ac.il
authorderaadt <deraadt@openbsd.org>
Sun, 27 Apr 1997 22:23:31 +0000 (22:23 +0000)
committerderaadt <deraadt@openbsd.org>
Sun, 27 Apr 1997 22:23:31 +0000 (22:23 +0000)
lib/libc/rpc/clnt_tcp.c
lib/libc/rpc/clnt_udp.c

index f23e97a..387521d 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: clnt_tcp.c,v 1.12 1997/01/02 09:21:01 deraadt Exp $";
+static char *rcsid = "$OpenBSD: clnt_tcp.c,v 1.13 1997/04/27 22:23:31 deraadt Exp $";
 #endif /* LIBC_SCCS and not lint */
  
 /*
@@ -251,7 +251,7 @@ clnttcp_call(h, proc, xdr_args, args_ptr, xdr_results, results_ptr, timeout)
 call_again:
        xdrs->x_op = XDR_ENCODE;
        ct->ct_error.re_status = RPC_SUCCESS;
-       x_id = ntohl(--(*msg_x_id));
+       x_id = *msg_x_id = arc4random();
        if ((! XDR_PUTBYTES(xdrs, ct->ct_mcall, ct->ct_mpos)) ||
            (! XDR_PUTLONG(xdrs, (long *)&proc)) ||
            (! AUTH_MARSHALL(h->cl_auth, xdrs)) ||
index 5fbd082..2cce6a7 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: clnt_udp.c,v 1.10 1997/01/02 09:21:05 deraadt Exp $";
+static char *rcsid = "$OpenBSD: clnt_udp.c,v 1.11 1997/04/27 22:23:33 deraadt Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 /*
@@ -224,6 +224,7 @@ clntudp_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout)
        struct rpc_msg reply_msg;
        XDR reply_xdrs;
        struct timeval time_waited, start, after, tmp1, tmp2;
+       u_int32_t *msg_x_id = (u_int32_t *)(cu->cu_outbuf);     /* yuk */
        bool_t ok;
        int nrefreshes = 2;     /* number of times to refresh cred */
        struct timeval timeout;
@@ -249,10 +250,7 @@ call_again:
        xdrs = &(cu->cu_outxdrs);
        xdrs->x_op = XDR_ENCODE;
        XDR_SETPOS(xdrs, cu->cu_xdrpos);
-       /*
-        * the transaction is the first thing in the out buffer
-        */
-       (*(u_short *)(cu->cu_outbuf))++;
+       *msg_x_id = arc4random();
        if (!XDR_PUTLONG(xdrs, (long *)&proc) ||
            !AUTH_MARSHALL(cl->cl_auth, xdrs) ||
            !(*xargs)(xdrs, argsp)) {
@@ -337,7 +335,7 @@ send_again:
                if (inlen < sizeof(u_int32_t))
                        continue;       
                /* see if reply transaction id matches sent id */
-               if (*((u_int32_t *)(cu->cu_inbuf)) != *((u_int32_t *)(cu->cu_outbuf)))
+               if (*((u_int32_t *)(cu->cu_inbuf)) != *msg_x_id)
                        continue;       
                /* we now assume we have the proper reply */
                break;