Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Feb 2003 17:16:05 +0300
From:      "Andrey A. Chernov" <ache@nagual.pp.ru>
To:        Tim Robbins <tjr@FreeBSD.ORG>
Cc:        Kris Kennaway <kris@obsecurity.org>, current@FreeBSD.ORG
Subject:   Re: rand() is broken
Message-ID:  <20030202141605.GA64157@nagual.pp.ru>
In-Reply-To: <20030202140223.GA63836@nagual.pp.ru>
References:  <20030202070644.GA9987@rot13.obsecurity.org> <20030202090422.GA59750@nagual.pp.ru> <20030202091106.GA72723@rot13.obsecurity.org> <20030202102621.GA60900@nagual.pp.ru> <20030202123035.GB62977@nagual.pp.ru> <20030203001735.A30440@dilbert.robbins.dropbear.id.au> <20030202134225.GA63673@nagual.pp.ru> <20030202140223.GA63836@nagual.pp.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 02, 2003 at 17:02:23 +0300, Andrey A. Chernov wrote:
> 
> I'll produce and send it a bit later.

Here it is.

--- stdlib/rand.c.old	Sat Jan  4 20:39:19 2003
+++ stdlib/rand.c	Sun Feb  2 17:06:08 2003
@@ -72,10 +72,13 @@
  */
 	long hi, lo, x;
 
+	/* Can't be initialized with 0, so use another value. */
+	if (*ctx == 0)
+		*ctx = 123459876;
 	hi = *ctx / 127773;
 	lo = *ctx % 127773;
 	x = 16807 * lo - 2836 * hi;
-	if (x <= 0)
+	if (x < 0)
 		x += 0x7fffffff;
 	return ((*ctx = x) % ((u_long)RAND_MAX + 1));
 #endif  /* !USE_WEAK_SEEDING */
@@ -86,8 +89,10 @@
 rand_r(unsigned int *ctx)
 {
 	u_long val = (u_long) *ctx;
-	*ctx = do_rand(&val);
-	return (int) *ctx;
+	int r = do_rand(&val);
+
+	*ctx = (unsigned int) val;
+	return (r);
 }
 
 
--- stdlib/random.c.old	Sun Mar 24 23:42:48 2002
+++ stdlib/random.c	Sun Feb  2 17:09:19 2003
@@ -236,10 +236,13 @@
  */
 	long hi, lo;
 
+	/* Can't be initialized with 0, so use another value. */
+	if (x == 0)
+		x = 123459876;
 	hi = x / 127773;
 	lo = x % 127773;
 	x = 16807 * lo - 2836 * hi;
-	if (x <= 0)
+	if (x < 0)
 		x += 0x7fffffff;
 	return (x);
 #endif  /* !USE_WEAK_SEEDING */

-- 
Andrey A. Chernov
http://ache.pp.ru/

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030202141605.GA64157>