aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2022-04-30 15:33:28 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2022-04-30 15:33:28 +0200
commit52f3cf7e5f8c2635ffd456602b74118cf86ec099 (patch)
treeda656406faf55eef445a7b2b36e9ff298d98b11b
parent282b61a64921775e5d167df942347a8a3cf984e7 (diff)
downloadbusybox-w32-52f3cf7e5f8c2635ffd456602b74118cf86ec099.tar.gz
busybox-w32-52f3cf7e5f8c2635ffd456602b74118cf86ec099.tar.bz2
busybox-w32-52f3cf7e5f8c2635ffd456602b74118cf86ec099.zip
seedrng: simplify read_new_seed() to not have error return
gcc in fact detects this and does this transformation when generating code - no object code changes. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--util-linux/seedrng.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/util-linux/seedrng.c b/util-linux/seedrng.c
index 3f4c5c0c8..5559ba77c 100644
--- a/util-linux/seedrng.c
+++ b/util-linux/seedrng.c
@@ -75,31 +75,38 @@ static size_t determine_optimal_seed_len(void)
75 return MAX(MIN(poolsize, MAX_SEED_LEN), MIN_SEED_LEN); 75 return MAX(MIN(poolsize, MAX_SEED_LEN), MIN_SEED_LEN);
76} 76}
77 77
78static int read_new_seed(uint8_t *seed, size_t len, bool *is_creditable) 78static bool read_new_seed(uint8_t *seed, size_t len)
79{ 79{
80 bool is_creditable;
80 ssize_t ret; 81 ssize_t ret;
81 82
82 ret = getrandom(seed, len, GRND_NONBLOCK); 83 ret = getrandom(seed, len, GRND_NONBLOCK);
83 if (ret == (ssize_t)len) { 84 if (ret == (ssize_t)len) {
84 *is_creditable = true; 85 return true;
85 return 0;
86 } 86 }
87 if (ret < 0 && errno == ENOSYS) { 87 if (ret < 0 && errno == ENOSYS) {
88 struct pollfd random_fd = { 88 struct pollfd random_fd = {
89 .fd = xopen("/dev/random", O_RDONLY), 89 .fd = xopen("/dev/random", O_RDONLY),
90 .events = POLLIN 90 .events = POLLIN
91 }; 91 };
92 *is_creditable = poll(&random_fd, 1, 0) == 1; 92 is_creditable = poll(&random_fd, 1, 0) == 1;
93//This is racy. is_creditable can be set to true here, but other process
94//can consume "good" random data from /dev/urandom before we do it below.
93 close(random_fd.fd); 95 close(random_fd.fd);
94 } else { 96 } else {
95 *is_creditable = false;
96 if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len) 97 if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len)
97 return 0; 98 return false;
99 is_creditable = false;
98 } 100 }
101
102 /* Either getrandom() is not implemented, or
103 * getrandom(GRND_INSECURE) did not give us LEN bytes.
104 * Fallback to reading /dev/urandom.
105 */
99 errno = 0; 106 errno = 0;
100 if (open_read_close("/dev/urandom", seed, len) != (ssize_t)len) 107 if (open_read_close("/dev/urandom", seed, len) != (ssize_t)len)
101 bb_perror_msg_and_die("can't read '%s'", "/dev/urandom"); 108 bb_perror_msg_and_die("can't read '%s'", "/dev/urandom");
102 return 0; 109 return is_creditable;
103} 110}
104 111
105static void seed_rng(uint8_t *seed, size_t len, bool credit) 112static void seed_rng(uint8_t *seed, size_t len, bool credit)
@@ -190,17 +197,13 @@ int seedrng_main(int argc UNUSED_PARAM, char *argv[])
190 } 197 }
191 198
192 new_seed_len = determine_optimal_seed_len(); 199 new_seed_len = determine_optimal_seed_len();
193 if (read_new_seed(new_seed, new_seed_len, &new_seed_creditable) < 0) { 200 new_seed_creditable = read_new_seed(new_seed, new_seed_len);
194 bb_perror_msg("can't%s seed", " read new");
195 new_seed_len = SHA256_OUTSIZE;
196 memset(new_seed, 0, SHA256_OUTSIZE);
197 program_ret |= 1 << 3;
198 }
199 sha256_hash(&hash, &new_seed_len, sizeof(new_seed_len)); 201 sha256_hash(&hash, &new_seed_len, sizeof(new_seed_len));
200 sha256_hash(&hash, new_seed, new_seed_len); 202 sha256_hash(&hash, new_seed, new_seed_len);
201 sha256_end(&hash, new_seed + new_seed_len - SHA256_OUTSIZE); 203 sha256_end(&hash, new_seed + new_seed_len - SHA256_OUTSIZE);
202 204
203 printf("Saving %u bits of %screditable seed for next boot\n", (unsigned)new_seed_len * 8, new_seed_creditable ? "" : "non-"); 205 printf("Saving %u bits of %screditable seed for next boot\n",
206 (unsigned)new_seed_len * 8, new_seed_creditable ? "" : "non-");
204 fd = open(NON_CREDITABLE_SEED_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0400); 207 fd = open(NON_CREDITABLE_SEED_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0400);
205 if (fd < 0 || full_write(fd, new_seed, new_seed_len) != (ssize_t)new_seed_len || fsync(fd) < 0) { 208 if (fd < 0 || full_write(fd, new_seed, new_seed_len) != (ssize_t)new_seed_len || fsync(fd) < 0) {
206 bb_perror_msg("can't%s seed", " write"); 209 bb_perror_msg("can't%s seed", " write");