diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2022-04-29 18:37:42 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2022-04-30 15:17:32 +0200 |
| commit | 0fa16fc7a2e03d4fadae3cd52f59656277f29f9d (patch) | |
| tree | 2c2999cd873ca0cafe8d1b82ff23ce991a3ce429 /util-linux | |
| parent | 002d6ee46d7a188aff9530cf21363b4cf7795dc4 (diff) | |
| download | busybox-w32-0fa16fc7a2e03d4fadae3cd52f59656277f29f9d.tar.gz busybox-w32-0fa16fc7a2e03d4fadae3cd52f59656277f29f9d.tar.bz2 busybox-w32-0fa16fc7a2e03d4fadae3cd52f59656277f29f9d.zip | |
seedrng: do not try to continue on unexpected errors (just exit)
function old new delta
.rodata 104946 104938 -8
seedrng_main 1225 1077 -148
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-156) Total: -156 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux')
| -rw-r--r-- | util-linux/seedrng.c | 54 |
1 files changed, 16 insertions, 38 deletions
diff --git a/util-linux/seedrng.c b/util-linux/seedrng.c index c42274759..82c69b72b 100644 --- a/util-linux/seedrng.c +++ b/util-linux/seedrng.c | |||
| @@ -100,63 +100,43 @@ static int read_new_seed(uint8_t *seed, size_t len, bool *is_creditable) | |||
| 100 | return -1; | 100 | return -1; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | static int seed_rng(uint8_t *seed, size_t len, bool credit) | 103 | static void seed_rng(uint8_t *seed, size_t len, bool credit) |
| 104 | { | 104 | { |
| 105 | struct { | 105 | struct { |
| 106 | int entropy_count; | 106 | int entropy_count; |
| 107 | int buf_size; | 107 | int buf_size; |
| 108 | uint8_t buffer[MAX_SEED_LEN]; | 108 | uint8_t buffer[MAX_SEED_LEN]; |
| 109 | } req; | 109 | } req; |
| 110 | int random_fd, ret; | 110 | int random_fd; |
| 111 | |||
| 112 | if (len > sizeof(req.buffer)) { | ||
| 113 | errno = EFBIG; | ||
| 114 | return -1; | ||
| 115 | } | ||
| 116 | 111 | ||
| 117 | req.entropy_count = credit ? len * 8 : 0; | 112 | req.entropy_count = credit ? len * 8 : 0; |
| 118 | req.buf_size = len; | 113 | req.buf_size = len; |
| 119 | memcpy(req.buffer, seed, len); | 114 | memcpy(req.buffer, seed, len); |
| 120 | 115 | ||
| 121 | random_fd = open("/dev/urandom", O_RDONLY); | 116 | random_fd = xopen("/dev/urandom", O_RDONLY); |
| 122 | if (random_fd < 0) | 117 | xioctl(random_fd, RNDADDENTROPY, &req); |
| 123 | return -1; | ||
| 124 | ret = ioctl(random_fd, RNDADDENTROPY, &req); | ||
| 125 | if (ret) | ||
| 126 | ret = -errno ? -errno : -EIO; | ||
| 127 | if (ENABLE_FEATURE_CLEAN_UP) | 118 | if (ENABLE_FEATURE_CLEAN_UP) |
| 128 | close(random_fd); | 119 | close(random_fd); |
| 129 | errno = -ret; | ||
| 130 | return ret ? -1 : 0; | ||
| 131 | } | 120 | } |
| 132 | 121 | ||
| 133 | static int seed_from_file_if_exists(const char *filename, int dfd, bool credit, sha256_ctx_t *hash) | 122 | static void seed_from_file_if_exists(const char *filename, bool credit, sha256_ctx_t *hash) |
| 134 | { | 123 | { |
| 135 | uint8_t seed[MAX_SEED_LEN]; | 124 | uint8_t seed[MAX_SEED_LEN]; |
| 136 | ssize_t seed_len; | 125 | ssize_t seed_len; |
| 137 | 126 | ||
| 138 | seed_len = open_read_close(filename, seed, sizeof(seed)); | 127 | seed_len = open_read_close(filename, seed, sizeof(seed)); |
| 139 | if (seed_len < 0) { | 128 | if (seed_len < 0) { |
| 140 | if (errno == ENOENT) | 129 | if (errno != ENOENT) |
| 141 | return 0; | 130 | bb_perror_msg_and_die("can't%s seed", " read"); |
| 142 | bb_perror_msg("can't%s seed", " read"); | 131 | return; |
| 143 | return -1; | ||
| 144 | } | 132 | } |
| 145 | if ((unlink(filename) < 0 || fsync(dfd) < 0) && seed_len) { | 133 | xunlink(filename); |
| 146 | bb_perror_msg("can't%s seed", " remove"); | 134 | if (seed_len != 0) { |
| 147 | return -1; | 135 | sha256_hash(hash, &seed_len, sizeof(seed_len)); |
| 148 | } else if (!seed_len) | 136 | sha256_hash(hash, seed, seed_len); |
| 149 | return 0; | 137 | printf("Seeding %u bits %s crediting\n", (unsigned)seed_len * 8, credit ? "and" : "without"); |
| 150 | 138 | seed_rng(seed, seed_len, credit); | |
| 151 | sha256_hash(hash, &seed_len, sizeof(seed_len)); | ||
| 152 | sha256_hash(hash, seed, seed_len); | ||
| 153 | |||
| 154 | printf("Seeding %u bits %s crediting\n", (unsigned)seed_len * 8, credit ? "and" : "without"); | ||
| 155 | if (seed_rng(seed, seed_len, credit) < 0) { | ||
| 156 | bb_perror_msg("can't%s seed", ""); | ||
| 157 | return -1; | ||
| 158 | } | 139 | } |
| 159 | return 0; | ||
| 160 | } | 140 | } |
| 161 | 141 | ||
| 162 | int seedrng_main(int argc, char *argv[]) MAIN_EXTERNALLY_VISIBLE; | 142 | int seedrng_main(int argc, char *argv[]) MAIN_EXTERNALLY_VISIBLE; |
| @@ -202,11 +182,9 @@ int seedrng_main(int argc UNUSED_PARAM, char *argv[]) | |||
| 202 | sha256_hash(&hash, ×tamp, sizeof(timestamp)); | 182 | sha256_hash(&hash, ×tamp, sizeof(timestamp)); |
| 203 | 183 | ||
| 204 | for (int i = 1; i < 3; ++i) { | 184 | for (int i = 1; i < 3; ++i) { |
| 205 | if (seed_from_file_if_exists(i == 1 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME, | 185 | seed_from_file_if_exists(i == 1 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME, |
| 206 | dfd, | ||
| 207 | i == 1 ? false : !skip_credit, | 186 | i == 1 ? false : !skip_credit, |
| 208 | &hash) < 0) | 187 | &hash); |
| 209 | program_ret |= 1 << i; | ||
| 210 | } | 188 | } |
| 211 | 189 | ||
| 212 | new_seed_len = determine_optimal_seed_len(); | 190 | new_seed_len = determine_optimal_seed_len(); |
