diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2022-05-02 15:03:32 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2022-05-02 15:03:32 +0200 |
commit | 3bfbcb5807ec43b6470bd7bb3e3ca0375ed16544 (patch) | |
tree | 3db6982129eb4fa9f470c152bbe84163ff913792 | |
parent | 5ba56e8b95ea84dbd7c0f7adfb9bdb1740480904 (diff) | |
download | busybox-w32-3bfbcb5807ec43b6470bd7bb3e3ca0375ed16544.tar.gz busybox-w32-3bfbcb5807ec43b6470bd7bb3e3ca0375ed16544.tar.bz2 busybox-w32-3bfbcb5807ec43b6470bd7bb3e3ca0375ed16544.zip |
seedrng: restore error check on fsync
Or else security people will never stop nagging us.
function old new delta
seedrng_main 884 906 +22
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/seedrng.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/miscutils/seedrng.c b/miscutils/seedrng.c index 8c81835f6..4f2441abc 100644 --- a/miscutils/seedrng.c +++ b/miscutils/seedrng.c | |||
@@ -134,12 +134,14 @@ static void seed_from_file_if_exists(const char *filename, int dfd, bool credit, | |||
134 | /* We are going to use this data to seed the RNG: | 134 | /* We are going to use this data to seed the RNG: |
135 | * we believe it to genuinely containing entropy. | 135 | * we believe it to genuinely containing entropy. |
136 | * If this just-unlinked file survives | 136 | * If this just-unlinked file survives |
137 | * (e.g. if machine crashes _right now_) | 137 | * (if machine crashes before deletion is recorded on disk) |
138 | * and we reuse it after reboot, this assumption | 138 | * and we reuse it after reboot, this assumption |
139 | * would be violated. Fsync the directory to | 139 | * would be violated, and RNG may end up generating |
140 | * make sure file is gone: | 140 | * the same data. fsync the directory |
141 | * to make sure file is gone: | ||
141 | */ | 142 | */ |
142 | fsync(dfd); | 143 | if (fsync(dfd) != 0) |
144 | bb_simple_perror_msg_and_die("I/O error"); | ||
143 | 145 | ||
144 | //Length is not random, and taking its address spills variable to stack | 146 | //Length is not random, and taking its address spills variable to stack |
145 | // sha256_hash(hash, &seed_len, sizeof(seed_len)); | 147 | // sha256_hash(hash, &seed_len, sizeof(seed_len)); |
@@ -210,10 +212,11 @@ int seedrng_main(int argc UNUSED_PARAM, char **argv) | |||
210 | sha256_hash(&hash, ×tamp, sizeof(timestamp)); | 212 | sha256_hash(&hash, ×tamp, sizeof(timestamp)); |
211 | 213 | ||
212 | for (i = 0; i <= 1; i++) { | 214 | for (i = 0; i <= 1; i++) { |
213 | seed_from_file_if_exists(i == 0 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME, | 215 | seed_from_file_if_exists( |
214 | dfd, | 216 | i == 0 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME, |
215 | /* credit? */ (opts ^ OPT_n) & i, /* 0, then 1 unless -n */ | 217 | dfd, |
216 | &hash); | 218 | /*credit?*/ (opts ^ OPT_n) & i, /* 0, then 1 unless -n */ |
219 | &hash); | ||
217 | } | 220 | } |
218 | 221 | ||
219 | new_seed_len = determine_optimal_seed_len(); | 222 | new_seed_len = determine_optimal_seed_len(); |
@@ -224,7 +227,7 @@ int seedrng_main(int argc UNUSED_PARAM, char **argv) | |||
224 | sha256_end(&hash, new_seed + new_seed_len - SHA256_OUTSIZE); | 227 | sha256_end(&hash, new_seed + new_seed_len - SHA256_OUTSIZE); |
225 | 228 | ||
226 | printf("Saving %u bits of %screditable seed for next boot\n", | 229 | printf("Saving %u bits of %screditable seed for next boot\n", |
227 | (unsigned)new_seed_len * 8, new_seed_creditable ? "" : "non-"); | 230 | (unsigned)new_seed_len * 8, new_seed_creditable ? "" : "non-"); |
228 | fd = xopen3(NON_CREDITABLE_SEED_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0400); | 231 | fd = xopen3(NON_CREDITABLE_SEED_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0400); |
229 | xwrite(fd, new_seed, new_seed_len); | 232 | xwrite(fd, new_seed, new_seed_len); |
230 | if (new_seed_creditable) { | 233 | if (new_seed_creditable) { |