svn commit: r251168 - stable/9/lib/libc/stdlib
Xin LI
delphij at FreeBSD.org
Thu May 30 22:01:08 UTC 2013
Author: delphij
Date: Thu May 30 22:01:06 2013
New Revision: 251168
URL: http://svnweb.freebsd.org/changeset/base/251168
Log:
MFC r249035:
Replace access to /dev/random with the kernel pseudo-random number
source sysctl(KERN_ARND) and remove the fallback code.
Obtained from: OpenBSD
Modified:
stable/9/lib/libc/stdlib/rand.3
stable/9/lib/libc/stdlib/rand.c
stable/9/lib/libc/stdlib/random.3
stable/9/lib/libc/stdlib/random.c
Directory Properties:
stable/9/lib/libc/ (props changed)
Modified: stable/9/lib/libc/stdlib/rand.3
==============================================================================
--- stable/9/lib/libc/stdlib/rand.3 Thu May 30 21:59:29 2013 (r251167)
+++ stable/9/lib/libc/stdlib/rand.3 Thu May 30 22:01:06 2013 (r251168)
@@ -32,7 +32,7 @@
.\" @(#)rand.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd September 4, 2012
+.Dd April 2, 2013
.Dt RAND 3
.Os
.Sh NAME
@@ -91,9 +91,7 @@ seeded with a value of 1.
.Pp
The
.Fn sranddev
-function initializes a seed using the
-.Xr random 4
-random number device which returns good random numbers.
+function initializes a seed using pseudo-random numbers obtained from the kernel.
.Pp
The
.Fn rand_r
Modified: stable/9/lib/libc/stdlib/rand.c
==============================================================================
--- stable/9/lib/libc/stdlib/rand.c Thu May 30 21:59:29 2013 (r251167)
+++ stable/9/lib/libc/stdlib/rand.c Thu May 30 22:01:06 2013 (r251168)
@@ -36,11 +36,10 @@ static char sccsid[] = "@(#)rand.c 8.1 (
__FBSDID("$FreeBSD$");
#include "namespace.h"
-#include <sys/time.h> /* for sranddev() */
+#include <sys/param.h>
+#include <sys/sysctl.h>
#include <sys/types.h>
-#include <fcntl.h> /* for sranddev() */
#include <stdlib.h>
-#include <unistd.h> /* for sranddev() */
#include "un-namespace.h"
#ifdef TEST
@@ -112,28 +111,20 @@ u_int seed;
* sranddev:
*
* Many programs choose the seed value in a totally predictable manner.
- * This often causes problems. We seed the generator using the much more
- * secure random(4) interface.
+ * This often causes problems. We seed the generator using pseudo-random
+ * data from the kernel.
*/
void
sranddev()
{
- int fd, done;
+ int mib[2];
+ size_t len;
- done = 0;
- fd = _open("/dev/random", O_RDONLY, 0);
- if (fd >= 0) {
- if (_read(fd, (void *) &next, sizeof(next)) == sizeof(next))
- done = 1;
- _close(fd);
- }
-
- if (!done) {
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
- srand((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec);
- }
+ len = sizeof(next);
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_ARND;
+ sysctl(mib, 2, (void *)&next, &len, NULL, 0);
}
Modified: stable/9/lib/libc/stdlib/random.3
==============================================================================
--- stable/9/lib/libc/stdlib/random.3 Thu May 30 21:59:29 2013 (r251167)
+++ stable/9/lib/libc/stdlib/random.3 Thu May 30 22:01:06 2013 (r251168)
@@ -28,7 +28,7 @@
.\" @(#)random.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd September 4, 2012
+.Dd April 2, 2013
.Dt RANDOM 3
.Os
.Sh NAME
@@ -106,8 +106,8 @@ as the seed.
.Pp
The
.Fn srandomdev
-routine initializes a state array using data from
-.Xr random 4 .
+routine initializes a state array using
+pseudo-random numbers obtained from the kernel.
Note that this particular seeding
procedure can generate states which are impossible to reproduce by
calling
Modified: stable/9/lib/libc/stdlib/random.c
==============================================================================
--- stable/9/lib/libc/stdlib/random.c Thu May 30 21:59:29 2013 (r251167)
+++ stable/9/lib/libc/stdlib/random.c Thu May 30 22:01:06 2013 (r251168)
@@ -34,12 +34,11 @@ static char sccsid[] = "@(#)random.c 8.2
__FBSDID("$FreeBSD$");
#include "namespace.h"
-#include <sys/time.h> /* for srandomdev() */
-#include <fcntl.h> /* for srandomdev() */
+#include <sys/param.h>
+#include <sys/sysctl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h> /* for srandomdev() */
#include "un-namespace.h"
/*
@@ -284,39 +283,28 @@ srandom(unsigned long x)
* srandomdev:
*
* Many programs choose the seed value in a totally predictable manner.
- * This often causes problems. We seed the generator using the much more
- * secure random(4) interface. Note that this particular seeding
- * procedure can generate states which are impossible to reproduce by
- * calling srandom() with any value, since the succeeding terms in the
- * state buffer are no longer derived from the LC algorithm applied to
- * a fixed seed.
+ * This often causes problems. We seed the generator using pseudo-random
+ * data from the kernel.
+ *
+ * Note that this particular seeding procedure can generate states
+ * which are impossible to reproduce by calling srandom() with any
+ * value, since the succeeding terms in the state buffer are no longer
+ * derived from the LC algorithm applied to a fixed seed.
*/
void
srandomdev(void)
{
- int fd, done;
+ int mib[2];
size_t len;
if (rand_type == TYPE_0)
- len = sizeof state[0];
+ len = sizeof(state[0]);
else
- len = rand_deg * sizeof state[0];
-
- done = 0;
- fd = _open("/dev/random", O_RDONLY, 0);
- if (fd >= 0) {
- if (_read(fd, (void *) state, len) == (ssize_t) len)
- done = 1;
- _close(fd);
- }
+ len = rand_deg * sizeof(state[0]);
- if (!done) {
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
- srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec);
- return;
- }
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_ARND;
+ sysctl(mib, 2, state, &len, NULL, 0);
if (rand_type != TYPE_0) {
fptr = &state[rand_sep];
More information about the svn-src-stable-9
mailing list