diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2014-07-13 14:21:15 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2014-07-13 14:21:15 +0000 |
commit | 72259ba42b7ac1af0b76b194e28fded81122ce63 (patch) | |
tree | 8f9f08fafe70d5997972c30b42630ed927a0c1e7 | |
parent | 367bfebe7a160ea9f180f07cc96fd5d15c4cee1b (diff) |
once srandomdev() is called, switch to using arc4random() but mask off the
high bit as required by posix. wouldn't want to break any standards.
idea and ok deraadt
-rw-r--r-- | lib/libc/stdlib/random.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/lib/libc/stdlib/random.c b/lib/libc/stdlib/random.c index 737d4d27b60..a71402ace56 100644 --- a/lib/libc/stdlib/random.c +++ b/lib/libc/stdlib/random.c @@ -1,4 +1,4 @@ -/* $OpenBSD: random.c,v 1.22 2014/06/15 05:10:58 deraadt Exp $ */ +/* $OpenBSD: random.c,v 1.23 2014/07/13 14:21:14 tedu Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. @@ -176,6 +176,8 @@ static int rand_type = TYPE_3; static int rand_deg = DEG_3; static int rand_sep = SEP_3; +static int use_arc4random; + _THREAD_PRIVATE_MUTEX(random); static long random_l(void); @@ -201,6 +203,7 @@ srandom_l(unsigned int x) int32_t test; div_t val; + use_arc4random = 0; if (rand_type == TYPE_0) state[0] = x; else { @@ -254,17 +257,7 @@ srandomdev(void) size_t len; LOCK(); - if (rand_type == TYPE_0) - len = sizeof(state[0]); - else - len = rand_deg * sizeof(state[0]); - - arc4random_buf(state, len); - - if (rand_type != TYPE_0) { - fptr = &state[rand_sep]; - rptr = &state[0]; - } + use_arc4random = 1; UNLOCK(); } @@ -298,6 +291,7 @@ initstate(u_int seed, char *arg_state, size_t n) char *ostate = (char *)(&state[-1]); LOCK(); + use_arc4random = 0; if (rand_type == TYPE_0) state[-1] = rand_type; else @@ -362,6 +356,7 @@ setstate(char *arg_state) char *ostate = (char *)(&state[-1]); LOCK(); + use_arc4random = 0; if (rand_type == TYPE_0) state[-1] = rand_type; else @@ -412,6 +407,9 @@ random_l(void) { int32_t i; + if (use_arc4random) + return arc4random() & 0x7fffffff; + if (rand_type == TYPE_0) i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff; else { |