Module Name: src
Committed By: tls
Date: Thu Aug 29 01:04:49 UTC 2013
Modified Files:
src/sys/kern: kern_rndpool.c kern_rndq.c
src/sys/sys: rnd.h
Log Message:
Fix rnd_add_* to conform to manual page: allow addition of entropy
with NULL source.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/kern/kern_rndpool.c
cvs rdiff -u -r1.20 -r1.21 src/sys/kern/kern_rndq.c
cvs rdiff -u -r1.39 -r1.40 src/sys/sys/rnd.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_rndpool.c
diff -u src/sys/kern/kern_rndpool.c:1.4 src/sys/kern/kern_rndpool.c:1.5
--- src/sys/kern/kern_rndpool.c:1.4 Thu Jun 13 19:18:00 2013
+++ src/sys/kern/kern_rndpool.c Thu Aug 29 01:04:49 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_rndpool.c,v 1.4 2013/06/13 19:18:00 tls Exp $ */
+/* $NetBSD: kern_rndpool.c,v 1.5 2013/08/29 01:04:49 tls Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rndpool.c,v 1.4 2013/06/13 19:18:00 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rndpool.c,v 1.5 2013/08/29 01:04:49 tls Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -187,15 +187,16 @@ rndpool_add_one_word(rndpool_t *rp, u_in
* Add a buffer's worth of data to the pool.
*/
void
-rndpool_add_data(rndpool_t *rp, void *p, u_int32_t len, u_int32_t entropy)
+rndpool_add_data(rndpool_t *rp,
+ const void * const p, u_int32_t len, u_int32_t entropy)
{
u_int32_t val;
- u_int8_t *buf;
+ const u_int8_t * buf;
buf = p;
for (; len > 3; len -= 4) {
- val = *((u_int32_t *)buf);
+ val = *((const u_int32_t *)buf);
rndpool_add_one_word(rp, val);
buf += 4;
Index: src/sys/kern/kern_rndq.c
diff -u src/sys/kern/kern_rndq.c:1.20 src/sys/kern/kern_rndq.c:1.21
--- src/sys/kern/kern_rndq.c:1.20 Wed Aug 28 23:40:43 2013
+++ src/sys/kern/kern_rndq.c Thu Aug 29 01:04:49 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_rndq.c,v 1.20 2013/08/28 23:40:43 tls Exp $ */
+/* $NetBSD: kern_rndq.c,v 1.21 2013/08/29 01:04:49 tls Exp $ */
/*-
* Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.20 2013/08/28 23:40:43 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.21 2013/08/29 01:04:49 tls Exp $");
#include <sys/param.h>
#include <sys/ioctl.h>
@@ -651,7 +651,13 @@ rnd_add_data(krndsource_t *rs, const voi
* itself, random. Don't estimate entropy based on
* timestamp, just directly add the data.
*/
- rnd_add_data_ts(rs, data, len, entropy, rnd_counter());
+ if (__predict_false(rs == NULL)) {
+ mutex_spin_enter(&rndpool_mtx);
+ rndpool_add_data(&rnd_pool, data, len, entropy);
+ mutex_spin_exit(&rndpool_mtx);
+ } else {
+ rnd_add_data_ts(rs, data, len, entropy, rnd_counter());
+ }
}
static void
Index: src/sys/sys/rnd.h
diff -u src/sys/sys/rnd.h:1.39 src/sys/sys/rnd.h:1.40
--- src/sys/sys/rnd.h:1.39 Mon Jul 1 15:22:00 2013
+++ src/sys/sys/rnd.h Thu Aug 29 01:04:49 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: rnd.h,v 1.39 2013/07/01 15:22:00 riastradh Exp $ */
+/* $NetBSD: rnd.h,v 1.40 2013/08/29 01:04:49 tls Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -155,7 +155,8 @@ void rndpool_get_stats(rndpool_t *, voi
void rndpool_increment_entropy_count(rndpool_t *, uint32_t);
uint32_t *rndpool_get_pool(rndpool_t *);
uint32_t rndpool_get_poolsize(void);
-void rndpool_add_data(rndpool_t *, void *, uint32_t, uint32_t);
+void rndpool_add_data(rndpool_t *,
+ const void *const , uint32_t, uint32_t);
uint32_t rndpool_extract_data(rndpool_t *, void *, uint32_t, uint32_t);
void rnd_init(void);
void rnd_init_softint(void);
@@ -173,8 +174,10 @@ void rnd_seed(void *, size_t);
static inline void
rnd_add_uint32(krndsource_t *kr, uint32_t val)
{
- if (RND_ENABLED(kr)) {
+ if (__predict_true(kr) && RND_ENABLED(kr)) {
_rnd_add_uint32(kr, val);
+ } else {
+ rnd_add_data(NULL, &val, sizeof(val), 0);
}
}