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); } }