seedrng: prepare read_new_seed() to not need a "success" retval

We do not expect /dev/[u]random to be not openable/readable.
If they are, just bail out (something is obviously very wrong).

function                                             old     new   delta
seedrng_main                                        1077    1076      -1
.rodata                                           104939  104929     -10

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2022-04-30 15:25:55 +02:00
parent 0fa16fc7a2
commit 282b61a649

View File

@ -79,25 +79,27 @@ static int read_new_seed(uint8_t *seed, size_t len, bool *is_creditable)
{ {
ssize_t ret; ssize_t ret;
*is_creditable = false;
ret = getrandom(seed, len, GRND_NONBLOCK); ret = getrandom(seed, len, GRND_NONBLOCK);
if (ret == (ssize_t)len) { if (ret == (ssize_t)len) {
*is_creditable = true; *is_creditable = true;
return 0; return 0;
} else if (ret < 0 && errno == ENOSYS) { }
if (ret < 0 && errno == ENOSYS) {
struct pollfd random_fd = { struct pollfd random_fd = {
.fd = open("/dev/random", O_RDONLY), .fd = xopen("/dev/random", O_RDONLY),
.events = POLLIN .events = POLLIN
}; };
if (random_fd.fd < 0)
return -1;
*is_creditable = poll(&random_fd, 1, 0) == 1; *is_creditable = poll(&random_fd, 1, 0) == 1;
close(random_fd.fd); close(random_fd.fd);
} else if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len) } else {
return 0; *is_creditable = false;
if (open_read_close("/dev/urandom", seed, len) == (ssize_t)len) if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len)
return 0; return 0;
return -1; }
errno = 0;
if (open_read_close("/dev/urandom", seed, len) != (ssize_t)len)
bb_perror_msg_and_die("can't read '%s'", "/dev/urandom");
return 0;
} }
static void seed_rng(uint8_t *seed, size_t len, bool credit) static void seed_rng(uint8_t *seed, size_t len, bool credit)