Revert changes to use getrandom for M57. This reverts commit 2d5848200404b2773c35bb1aa00dc3edd7a829d9 and 39ae1447592955adfee26444910b4487fd664dcb. BUG=chromium:673183 Change-Id: I19abdb11fc3872d2499072de8269d0744ae2f90a Reviewed-on: https://boringssl-review.googlesource.com/13235 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/rand/urandom.c b/crypto/rand/urandom.c index 3ccd940..5e62538 100644 --- a/crypto/rand/urandom.c +++ b/crypto/rand/urandom.c
@@ -22,7 +22,6 @@ #include <assert.h> #include <errno.h> #include <fcntl.h> -#include <stdio.h> #include <string.h> #include <unistd.h> @@ -89,16 +88,12 @@ /* requested_lock is used to protect the |*_requested| variables. */ static struct CRYPTO_STATIC_MUTEX requested_lock = CRYPTO_STATIC_MUTEX_INIT; -/* The following constants are magic values of |urandom_fd|. */ -static const int kUnset = -2; -static const int kHaveGetrandom = -3; - -/* urandom_fd_requested is set by |RAND_set_urandom_fd|. It's protected by +/* urandom_fd_requested is set by |RAND_set_urandom_fd|. It's protected by * |requested_lock|. */ -static int urandom_fd_requested = -2 /* kUnset */; +static int urandom_fd_requested = -2; /* urandom_fd is a file descriptor to /dev/urandom. It's protected by |once|. */ -static int urandom_fd = -2 /* kUnset */; +static int urandom_fd = -2; /* urandom_buffering_requested is set by |RAND_enable_fork_unsafe_buffering|. * It's protected by |requested_lock|. */ @@ -121,31 +116,12 @@ CRYPTO_STATIC_MUTEX_unlock_read(&requested_lock); #if defined(USE_SYS_getrandom) + /* Initial test of getrandom to find any unexpected behavior. */ uint8_t dummy; - long getrandom_ret = - syscall(SYS_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK); + syscall(SYS_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK); +#endif - if (getrandom_ret == 1) { - urandom_fd = kHaveGetrandom; - return; - } else if (getrandom_ret == -1 && errno == EAGAIN) { - fprintf(stderr, - "getrandom indicates that the entropy pool has not been " - "initialized. Rather than continue with poor entropy, this process " - "will block until entropy is available.\n"); - do { - getrandom_ret = - syscall(SYS_getrandom, &dummy, sizeof(dummy), 0 /* no flags */); - } while (getrandom_ret == -1 && errno == EINTR); - - if (getrandom_ret == 1) { - urandom_fd = kHaveGetrandom; - return; - } - } -#endif /* USE_SYS_getrandom */ - - if (fd == kUnset) { + if (fd == -2) { do { fd = open("/dev/urandom", O_RDONLY); } while (fd == -1 && errno == EINTR); @@ -181,9 +157,7 @@ CRYPTO_STATIC_MUTEX_unlock_write(&requested_lock); CRYPTO_once(&once, init_once); - if (urandom_fd == kHaveGetrandom) { - close(fd); - } else if (urandom_fd != fd) { + if (urandom_fd != fd) { abort(); // Already initialized. } } @@ -195,7 +169,7 @@ abort(); } } else { - fd = kUnset; + fd = -2; } CRYPTO_STATIC_MUTEX_lock_write(&requested_lock); @@ -204,16 +178,8 @@ CRYPTO_STATIC_MUTEX_unlock_write(&requested_lock); CRYPTO_once(&once, init_once); - if (urandom_buffering != 1) { - abort(); // Already initialized - } - - if (fd >= 0) { - if (urandom_fd == kHaveGetrandom) { - close(fd); - } else if (urandom_fd != fd) { - abort(); // Already initialized. - } + if (urandom_buffering != 1 || (fd >= 0 && urandom_fd != fd)) { + abort(); // Already initialized. } } @@ -238,42 +204,15 @@ return buf; } -#if defined(USE_SYS_getrandom) && defined(__has_feature) -#if __has_feature(memory_sanitizer) -void __msan_unpoison(void *, size_t); -#endif -#endif - /* fill_with_entropy writes |len| bytes of entropy into |out|. It returns one * on success and zero on error. */ static char fill_with_entropy(uint8_t *out, size_t len) { + ssize_t r; + while (len > 0) { - ssize_t r; - - if (urandom_fd == kHaveGetrandom) { -#if defined(USE_SYS_getrandom) - do { - r = syscall(SYS_getrandom, out, len, 0 /* no flags */); - } while (r == -1 && errno == EINTR); - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) - if (r > 0) { - /* MSAN doesn't recognise |syscall| and thus doesn't notice that we - * have initialised the output buffer. */ - __msan_unpoison(out, r); - } -#endif /* memory_sanitizer */ -#endif /*__has_feature */ - -#else /* USE_SYS_getrandom */ - abort(); -#endif - } else { - do { - r = read(urandom_fd, out, len); - } while (r == -1 && errno == EINTR); - } + do { + r = read(urandom_fd, out, len); + } while (r == -1 && errno == EINTR); if (r <= 0) { return 0;