X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5d17ccfcfb6aaa0fe7b3fb1d90ffde20a1013cc1..feae2dfc998c2e9433cb88da64cab0fdc7e5896c:/sshrand.c diff --git a/sshrand.c b/sshrand.c index 43b81234..4c33f4a0 100644 --- a/sshrand.c +++ b/sshrand.c @@ -4,6 +4,7 @@ #include "putty.h" #include "ssh.h" +#include /* Collect environmental noise every 5 minutes */ #define NOISE_REGULAR_INTERVAL (5*60*TICKSPERSEC) @@ -40,6 +41,8 @@ struct RandPool { unsigned char incomingb[HASHINPUT]; int incomingpos; + + int stir_pending; }; static struct RandPool pool; @@ -52,6 +55,14 @@ static void random_stir(void) word32 digest[HASHSIZE / sizeof(word32)]; int i, j, k; + /* + * noise_get_light will call random_add_noise, which may call + * back to here. Prevent recursive stirs. + */ + if (pool.stir_pending) + return; + pool.stir_pending = TRUE; + noise_get_light(random_add_noise); SHATransform((word32 *) pool.incoming, (word32 *) pool.incomingb); @@ -115,6 +126,8 @@ static void random_stir(void) memcpy(pool.incoming, digest, sizeof(digest)); pool.poolpos = sizeof(pool.incoming); + + pool.stir_pending = FALSE; } void random_add_noise(void *noise, int length) @@ -186,9 +199,9 @@ static void random_add_heavynoise_bitbybit(void *noise, int length) pool.poolpos = i; } -static void random_timer(void *ctx, long now) +static void random_timer(void *ctx, unsigned long now) { - if (random_active > 0 && now - next_noise_collection >= 0) { + if (random_active > 0 && now == next_noise_collection) { noise_regular(); next_noise_collection = schedule_timer(NOISE_REGULAR_INTERVAL, random_timer, &pool); @@ -213,6 +226,10 @@ void random_ref(void) void random_unref(void) { random_active--; + assert(random_active >= 0); + if (random_active) return; + + expire_timer_context(&pool); } int random_byte(void)