summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2011-01-09 22:40:52 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2011-01-09 22:40:52 +0000
commit7488d26d129e5ac43fe1a3ce02d93d215ad7f5a9 (patch)
treefb57fe4dde56ca678cac5e24525934954ae52a3f
parent708ec2150adf0efac1219292de76eae6a43a3fba (diff)
be more careful with nanotime() calls in early entropy storage, since
at least sparc may not have the clock mapped (found by miod). while here, protect some more timeout_*() calls with timeout_initialized()
-rw-r--r--sys/dev/rnd.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/dev/rnd.c b/sys/dev/rnd.c
index 65d884dfdf5..5be1ca00d1d 100644
--- a/sys/dev/rnd.c
+++ b/sys/dev/rnd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rnd.c,v 1.131 2011/01/08 19:45:07 deraadt Exp $ */
+/* $OpenBSD: rnd.c,v 1.132 2011/01/09 22:40:51 deraadt Exp $ */
/*
* Copyright (c) 2011 Theo de Raadt.
@@ -290,7 +290,8 @@ enqueue_randomness(int state, int val)
return;
#endif
- nanotime(&ts);
+ if (timeout_initialized(&rnd_timeout))
+ nanotime(&ts);
p = &rnd_states[state];
val += state << 13;
@@ -447,7 +448,8 @@ dequeue_randomness(void *v)
mtx_enter(&entropylock);
- timeout_del(&rnd_timeout);
+ if (timeout_initialized(&rnd_timeout))
+ timeout_del(&rnd_timeout);
rndstats.rnd_deqs++;
while ((rep = rnd_get())) {
@@ -653,7 +655,8 @@ arc4_init(void *v, void *w)
* clock information which is better than nothing.
*/
extract_entropy((u_int8_t *)buf, sizeof buf);
- nanotime(&ts);
+ if (timeout_initialized(&rnd_timeout))
+ nanotime(&ts);
for (p = (u_int8_t *)&ts, i = 0; i < sizeof(ts); i++)
buf[i] ^= p[i];
@@ -703,12 +706,11 @@ random_start(void)
add_entropy_words((u_int32_t *)msgbufp->msg_bufc,
msgbufp->msg_bufs / sizeof(u_int32_t));
- timeout_set(&rnd_timeout, dequeue_randomness, NULL);
dequeue_randomness(NULL);
-
- timeout_set(&arc4_timeout, arc4_reinit, NULL);
arc4_init(NULL, NULL);
+ timeout_set(&arc4_timeout, arc4_reinit, NULL);
arc4_reinit(NULL);
+ timeout_set(&rnd_timeout, dequeue_randomness, NULL);
}
int