X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/e3ac3c05a5af7f36eb895f457e3a627d75a1546b..88ea89339783ee587180b645981967f6cb8bcd20:/unix/uxnoise.c diff --git a/unix/uxnoise.c b/unix/uxnoise.c index b563f7cb..c42466f6 100644 --- a/unix/uxnoise.c +++ b/unix/uxnoise.c @@ -4,6 +4,9 @@ */ #include +#include +#include + #include #include #include @@ -32,6 +35,8 @@ static int read_dev_urandom(char *buf, int len) ngot += ret; } + close(fd); + return 1; } @@ -47,19 +52,34 @@ void noise_get_heavy(void (*func) (void *, int)) char buf[512]; FILE *fp; int ret; + int got_dev_urandom = 0; - if (read_dev_urandom(buf, 32)) + if (read_dev_urandom(buf, 32)) { + got_dev_urandom = 1; func(buf, 32); + } fp = popen("ps -axu 2>/dev/null", "r"); - while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) - func(buf, ret); - pclose(fp); + if (fp) { + while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) + func(buf, ret); + pclose(fp); + } else if (!got_dev_urandom) { + fprintf(stderr, "popen: %s\n" + "Unable to access fallback entropy source\n", strerror(errno)); + exit(1); + } fp = popen("ls -al /tmp 2>/dev/null", "r"); - while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) - func(buf, ret); - pclose(fp); + if (fp) { + while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) + func(buf, ret); + pclose(fp); + } else if (!got_dev_urandom) { + fprintf(stderr, "popen: %s\n" + "Unable to access fallback entropy source\n", strerror(errno)); + exit(1); + } read_random_seed(func); random_save_seed();