something is wrong with this level of randomness; let 2.1 go out with this "problem"
authorderaadt <deraadt@openbsd.org>
Tue, 29 Apr 1997 08:52:31 +0000 (08:52 +0000)
committerderaadt <deraadt@openbsd.org>
Tue, 29 Apr 1997 08:52:31 +0000 (08:52 +0000)
lib/libc/rpc/clnt_tcp.c
lib/libc/rpc/clnt_udp.c

index 387521d..ae13ad0 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: clnt_tcp.c,v 1.13 1997/04/27 22:23:31 deraadt Exp $";
+static char *rcsid = "$OpenBSD: clnt_tcp.c,v 1.14 1997/04/29 08:52: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 = *msg_x_id = arc4random();
+       x_id = ntohl(--(*msg_x_id));
        if ((! XDR_PUTBYTES(xdrs, ct->ct_mcall, ct->ct_mpos)) ||
            (! XDR_PUTLONG(xdrs, (long *)&proc)) ||
            (! AUTH_MARSHALL(h->cl_auth, xdrs)) ||
index 2cce6a7..866315f 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: clnt_udp.c,v 1.11 1997/04/27 22:23:33 deraadt Exp $";
+static char *rcsid = "$OpenBSD: clnt_udp.c,v 1.12 1997/04/29 08:52:33 deraadt Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 /*
@@ -224,7 +224,6 @@ 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;
@@ -250,7 +249,10 @@ call_again:
        xdrs = &(cu->cu_outxdrs);
        xdrs->x_op = XDR_ENCODE;
        XDR_SETPOS(xdrs, cu->cu_xdrpos);
-       *msg_x_id = arc4random();
+       /*
+        * the transaction is the first thing in the out buffer
+        */
+       (*(u_short *)(cu->cu_outbuf))++;
        if (!XDR_PUTLONG(xdrs, (long *)&proc) ||
            !AUTH_MARSHALL(cl->cl_auth, xdrs) ||
            !(*xargs)(xdrs, argsp)) {
@@ -335,7 +337,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)) != *msg_x_id)
+               if (*((u_int32_t *)(cu->cu_inbuf)) != *((u_int32_t *)(cu->cu_outbuf)))
                        continue;       
                /* we now assume we have the proper reply */
                break;