Browse Source

Revert "crypto/rand: Fix a crash bug in RAND_enable_fork_unsafe_buffering." and "Enable getrandom for entropy gathering."

This reverts commits 36ca21415a and
7b668a873e. 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>
kris/onging/CECPQ3_patch15
Adam Langley 7 years ago
committed by CQ bot account: commit-bot@chromium.org
parent
commit
97db926cf7
1 changed files with 14 additions and 58 deletions
  1. +14
    -58
      crypto/rand/urandom.c

+ 14
- 58
crypto/rand/urandom.c View File

@@ -21,7 +21,6 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>


@@ -88,16 +87,12 @@ struct rand_buffer {
/* requested_lock is used to protect the |*_requested| variables. */ /* requested_lock is used to protect the |*_requested| variables. */
static struct CRYPTO_STATIC_MUTEX requested_lock = CRYPTO_STATIC_MUTEX_INIT; 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|. */ * |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|. */ /* 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|. /* urandom_buffering_requested is set by |RAND_enable_fork_unsafe_buffering|.
* It's protected by |requested_lock|. */ * It's protected by |requested_lock|. */
@@ -120,31 +115,12 @@ static void init_once(void) {
CRYPTO_STATIC_MUTEX_unlock_read(&requested_lock); CRYPTO_STATIC_MUTEX_unlock_read(&requested_lock);


#if defined(USE_SYS_getrandom) #if defined(USE_SYS_getrandom)
/* Initial test of getrandom to find any unexpected behavior. */
uint8_t dummy; uint8_t dummy;
long getrandom_ret =
syscall(SYS_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK);

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 */
syscall(SYS_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK);
#endif


if (fd == kUnset) {
if (fd == -2) {
do { do {
fd = open("/dev/urandom", O_RDONLY); fd = open("/dev/urandom", O_RDONLY);
} while (fd == -1 && errno == EINTR); } while (fd == -1 && errno == EINTR);
@@ -180,9 +156,7 @@ void RAND_set_urandom_fd(int fd) {
CRYPTO_STATIC_MUTEX_unlock_write(&requested_lock); CRYPTO_STATIC_MUTEX_unlock_write(&requested_lock);


CRYPTO_once(&once, init_once); CRYPTO_once(&once, init_once);
if (urandom_fd == kHaveGetrandom) {
close(fd);
} else if (urandom_fd != fd) {
if (urandom_fd != fd) {
abort(); // Already initialized. abort(); // Already initialized.
} }
} }
@@ -194,7 +168,7 @@ void RAND_enable_fork_unsafe_buffering(int fd) {
abort(); abort();
} }
} else { } else {
fd = kUnset;
fd = -2;
} }


CRYPTO_STATIC_MUTEX_lock_write(&requested_lock); 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_STATIC_MUTEX_unlock_write(&requested_lock);


CRYPTO_once(&once, init_once); 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; ssize_t r;


while (len > 0) { 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) { if (r <= 0) {
return 0; return 0;


Loading…
Cancel
Save