X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxnoise.c;h=c42466f658e3a2e4b6d2c10333331ac40be3d80b;hb=3e22c99c9a3c28e042f2dc3a50fadf95e7c277e7;hp=b563f7cbe4a2475ee9e195691b7702af129161c9;hpb=a1125a8052e442f5a5a6090449b03f851547d590;p=PuTTY.git 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();