From c5ac41de1511f898301c298b2b28d05372cba817 Mon Sep 17 00:00:00 2001 From: Vitezslav Cizek Date: Thu, 8 Dec 2016 13:10:33 +0100 Subject: [PATCH] Resume reading from randfile when interrupted by a signal. It was regularly observed with openssh: sshd: fatal: cannot read from /dev/urandom, Interrupted system call --- crypto/rand/randfile.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index c96383a..6e39e86 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -104,6 +104,12 @@ static __FILE_ptr32 (*const vms_fopen)(const char *, const char *, ...) = #define RFILE ".rnd" +#ifdef EINTR +# define INTERRUPTED(in) (ferror(in) && errno == EINTR) +#else +# define INTERRUPTED (0) +#endif + /* * Note that these functions are intended for seed files only. Entropy * devices and EGD sockets are handled in rand_unix.c @@ -162,9 +168,16 @@ int RAND_load_file(const char *file, long bytes) n = (bytes < BUFSIZE) ? (int)bytes : BUFSIZE; else n = BUFSIZE; + i = fread(buf, 1, n, in); - if (i <= 0) + if (i <= 0) { + if (INTERRUPTED(in)) { + /* Interrupted by a signal, resume reading */ + clearerr(in); + continue; + } break; + } RAND_add(buf, i, (double)i); ret += i; -- 2.10.2