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 | |
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>
-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(); |