Revert "crypto/rand: Fix a crash bug in RAND_enable_fork_unsafe_buffering." and "Enable getrandom for entropy gathering."
This reverts commits36ca21415a
and7b668a873e
. We believe that we need to update ASAN to be aware of getrandom before we can use it. Otherwise it believes that the memory with the entropy from this syscall is uninitialised. Change-Id: I1ea1c4d3038b3b2cd080be23d7d8b60fc0c83df2 Reviewed-on: https://boringssl-review.googlesource.com/12901 Reviewed-by: Adam Langley <alangley@gmail.com> Commit-Queue: Adam Langley <alangley@gmail.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
This commit is contained in:
parent
b479c5df34
commit
97db926cf7
@ -21,7 +21,6 @@
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -88,16 +87,12 @@ struct rand_buffer {
|
||||
/* 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|. */
|
||||
@ -120,31 +115,12 @@ static void init_once(void) {
|
||||
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);
|
||||
@ -180,9 +156,7 @@ void RAND_set_urandom_fd(int fd) {
|
||||
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.
|
||||
}
|
||||
}
|
||||
@ -194,7 +168,7 @@ void RAND_enable_fork_unsafe_buffering(int fd) {
|
||||
abort();
|
||||
}
|
||||
} else {
|
||||
fd = kUnset;
|
||||
fd = -2;
|
||||
}
|
||||
|
||||
CRYPTO_STATIC_MUTEX_lock_write(&requested_lock);
|
||||
@ -203,16 +177,8 @@ void RAND_enable_fork_unsafe_buffering(int fd) {
|
||||
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.
|
||||
}
|
||||
}
|
||||
|
||||
@ -243,19 +209,9 @@ static char fill_with_entropy(uint8_t *out, size_t len) {
|
||||
ssize_t r;
|
||||
|
||||
while (len > 0) {
|
||||
if (urandom_fd == kHaveGetrandom) {
|
||||
#if defined(USE_SYS_getrandom)
|
||||
do {
|
||||
r = syscall(SYS_getrandom, out, len, 0 /* no flags */);
|
||||
} while (r == -1 && errno == EINTR);
|
||||
#else
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user