aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2022-04-29 18:37:42 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2022-04-30 15:17:32 +0200
commit0fa16fc7a2e03d4fadae3cd52f59656277f29f9d (patch)
tree2c2999cd873ca0cafe8d1b82ff23ce991a3ce429
parent002d6ee46d7a188aff9530cf21363b4cf7795dc4 (diff)
downloadbusybox-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.c54
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
103static int seed_rng(uint8_t *seed, size_t len, bool credit) 103static 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
133static int seed_from_file_if_exists(const char *filename, int dfd, bool credit, sha256_ctx_t *hash) 122static 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
162int seedrng_main(int argc, char *argv[]) MAIN_EXTERNALLY_VISIBLE; 142int 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, &timestamp, sizeof(timestamp)); 182 sha256_hash(&hash, &timestamp, 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();