aboutsummaryrefslogtreecommitdiff
path: root/util-linux
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2022-04-30 15:25:55 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2022-04-30 15:25:55 +0200
commit282b61a64921775e5d167df942347a8a3cf984e7 (patch)
tree8b2fe93945df65907de62ba25ecfaca7276c7704 /util-linux
parent0fa16fc7a2e03d4fadae3cd52f59656277f29f9d (diff)
downloadbusybox-w32-282b61a64921775e5d167df942347a8a3cf984e7.tar.gz
busybox-w32-282b61a64921775e5d167df942347a8a3cf984e7.tar.bz2
busybox-w32-282b61a64921775e5d167df942347a8a3cf984e7.zip
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>
Diffstat (limited to 'util-linux')
-rw-r--r--util-linux/seedrng.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/util-linux/seedrng.c b/util-linux/seedrng.c
index 82c69b72b..3f4c5c0c8 100644
--- a/util-linux/seedrng.c
+++ b/util-linux/seedrng.c
@@ -79,25 +79,27 @@ static int read_new_seed(uint8_t *seed, size_t len, bool *is_creditable)
79{ 79{
80 ssize_t ret; 80 ssize_t ret;
81 81
82 *is_creditable = false;
83 ret = getrandom(seed, len, GRND_NONBLOCK); 82 ret = getrandom(seed, len, GRND_NONBLOCK);
84 if (ret == (ssize_t)len) { 83 if (ret == (ssize_t)len) {
85 *is_creditable = true; 84 *is_creditable = true;
86 return 0; 85 return 0;
87 } else if (ret < 0 && errno == ENOSYS) { 86 }
87 if (ret < 0 && errno == ENOSYS) {
88 struct pollfd random_fd = { 88 struct pollfd random_fd = {
89 .fd = open("/dev/random", O_RDONLY), 89 .fd = xopen("/dev/random", O_RDONLY),
90 .events = POLLIN 90 .events = POLLIN
91 }; 91 };
92 if (random_fd.fd < 0)
93 return -1;
94 *is_creditable = poll(&random_fd, 1, 0) == 1; 92 *is_creditable = poll(&random_fd, 1, 0) == 1;
95 close(random_fd.fd); 93 close(random_fd.fd);
96 } else if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len) 94 } else {
97 return 0; 95 *is_creditable = false;
98 if (open_read_close("/dev/urandom", seed, len) == (ssize_t)len) 96 if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len)
99 return 0; 97 return 0;
100 return -1; 98 }
99 errno = 0;
100 if (open_read_close("/dev/urandom", seed, len) != (ssize_t)len)
101 bb_perror_msg_and_die("can't read '%s'", "/dev/urandom");
102 return 0;
101} 103}
102 104
103static void seed_rng(uint8_t *seed, size_t len, bool credit) 105static void seed_rng(uint8_t *seed, size_t len, bool credit)