From: Matt Mackall - Re-init all three pools in ioctls - Clear entropy count in init_std_data under a lock - Add kerneldoc comment Signed-off-by: Matt Mackall Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/random.c | 22 +++++++++++++--------- 1 files changed, 13 insertions(+), 9 deletions(-) diff -puN drivers/char/random.c~random-pt2-re-init-all-pools-on-zero drivers/char/random.c --- 25/drivers/char/random.c~random-pt2-re-init-all-pools-on-zero 2005-01-16 00:53:29.744487040 -0800 +++ 25-akpm/drivers/char/random.c 2005-01-16 00:53:29.751485976 -0800 @@ -1473,16 +1473,14 @@ void get_random_bytes(void *buf, int nby EXPORT_SYMBOL(get_random_bytes); -/********************************************************************* - * - * Functions to interface with Linux - * - *********************************************************************/ - /* - * Initialize the random pool with standard stuff. + * init_std_data - initialize pool with system data * - * NOTE: This is an OS-dependent function. + * @r: pool to initialize + * + * This function clears the pool's entropy count and mixes some system + * data into the pool to prepare it for use. The pool is not cleared + * as that can only decrease the entropy in the pool. */ static void init_std_data(struct entropy_store *r) { @@ -1490,6 +1488,11 @@ static void init_std_data(struct entropy __u32 words[2]; char *p; int i; + unsigned long flags; + + spin_lock_irqsave(&r->lock, flags); + r->entropy_count = 0; + spin_unlock_irqrestore(&r->lock, flags); do_gettimeofday(&tv); words[0] = tv.tv_sec; @@ -1753,8 +1756,9 @@ random_ioctl(struct inode * inode, struc /* Clear the entropy pool counters. */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - random_state->entropy_count = 0; init_std_data(random_state); + init_std_data(sec_random_state); + init_std_data(urandom_state); return 0; default: return -EINVAL; _