diff options
Diffstat (limited to 'src/librandom/random_buf_early.c')
-rw-r--r-- | src/librandom/random_buf_early.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/librandom/random_buf_early.c b/src/librandom/random_buf_early.c index a7a244d..ce2733b 100644 --- a/src/librandom/random_buf_early.c +++ b/src/librandom/random_buf_early.c @@ -15,21 +15,31 @@ void random_buf_early (char *s, size_t n) #elif defined(SKALIBS_HASGETRANDOM) && defined(SKALIBS_HASGRNDINSECURE) +#include <errno.h> #include <sys/random.h> #include <skalibs/random.h> void random_buf_early (char *s, size_t n) { + static int broken = 0 ; + if (broken) goto bleh ; while (n) { ssize_t r = getrandom(s, n, GRND_INSECURE) ; - if (r >= 0) + if (r == -1) { - s += r ; - n -= r ; + if (errno != EINTR) goto breakit ; + else continue ; } + s += r ; + n -= r ; } + return ; + breakit: + broken = 1 ; + bleh: + random_devurandom(s, n) ; } #elif defined(SKALIBS_HASDEVURANDOM) |