forked from pool/openssl-1_1
50 lines
1.4 KiB
Diff
50 lines
1.4 KiB
Diff
|
From c5ac41de1511f898301c298b2b28d05372cba817 Mon Sep 17 00:00:00 2001
|
||
|
From: Vitezslav Cizek <vcizek@suse.com>
|
||
|
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
|
||
|
|