variuos: fwrite() does not set errno

The man page doesn't even mention errno. It just says that ferror() should
be used to check for errors. Those writes are unlikely to fail, but if they
do, errno might even be 0. Also, we have fflush_and_check() which does
additional paranoia around errno, because we apparently do not trust that
errno will always be set correctly.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2023-12-05 19:18:23 +01:00
parent c7ce20f01f
commit f9568765d4
4 changed files with 16 additions and 9 deletions
+7 -3
View File
@@ -2,6 +2,7 @@
#include "analyze.h"
#include "analyze-srk.h"
#include "fileio.h"
#include "tpm2-util.h"
int verb_srk(int argc, char *argv[], void *userdata) {
@@ -33,12 +34,15 @@ int verb_srk(int argc, char *argv[], void *userdata) {
return log_error_errno(r, "Failed to marshal SRK: %m");
if (isatty(STDOUT_FILENO))
return log_error_errno(SYNTHETIC_ERRNO(EIO), "Refusing to write binary data to TTY, please redirect output to file.");
return log_error_errno(SYNTHETIC_ERRNO(EIO),
"Refusing to write binary data to TTY, please redirect output to file.");
if (fwrite(marshalled, 1, marshalled_size, stdout) != marshalled_size)
return log_error_errno(errno, "Failed to write SRK to stdout: %m");
return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to write SRK to stdout: %m");
fflush(stdout);
r = fflush_and_check(stdout);
if (r < 0)
return log_error_errno(r, "Failed to write SRK to stdout: %m");
return EXIT_SUCCESS;
#else
+4 -3
View File
@@ -350,14 +350,15 @@ static int write_blob(FILE *f, const void *data, size_t size) {
}
if (fwrite(data, 1, size, f) != size)
return log_error_errno(errno, "Failed to write credential data: %m");
return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to write credential data: %m");
r = print_newline(f, data, size);
if (r < 0)
return r;
if (fflush(f) != 0)
return log_error_errno(errno, "Failed to flush output: %m");
r = fflush_and_check(f);
if (r < 0)
return log_error_errno(r, "Failed to flush output: %m");
return 0;
}
+1 -1
View File
@@ -384,7 +384,7 @@ static int journal_file_object_verify(JournalFile *f, uint64_t offset, Object *o
static int write_uint64(FILE *fp, uint64_t p) {
if (fwrite(&p, sizeof(p), 1, fp) != 1)
return -errno;
return -EIO;
return 0;
}
+4 -2
View File
@@ -284,7 +284,8 @@ static int run(int argc, char *argv[]) {
if (runtime_key.pkey) {
if (memcmp_nn(tpm2_key.fingerprint, tpm2_key.fingerprint_size,
runtime_key.fingerprint, runtime_key.fingerprint_size) != 0)
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Saved runtime SRK differs from TPM SRK, refusing.");
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),
"Saved runtime SRK differs from TPM SRK, refusing.");
if (arg_early) {
log_info("SRK saved in '%s' matches SRK in TPM2.", runtime_key.path);
@@ -351,7 +352,8 @@ static int run(int argc, char *argv[]) {
return log_error_errno(r, "Failed to marshal TPM2_PUBLIC key.");
if (fwrite(marshalled, 1, marshalled_size, f) != marshalled_size)
return log_error_errno(errno, "Failed to write SRK public key file '%s'.", tpm2b_public_path);
return log_error_errno(SYNTHETIC_ERRNO(EIO),
"Failed to write SRK public key file '%s'.", tpm2b_public_path);
if (fchmod(fileno(f), 0444) < 0)
return log_error_errno(errno, "Failed to adjust access mode of SRK public key file '%s' to 0444: %m", tpm2b_public_path);