From: Lennart Poettering Date: Mon, 10 Jun 2024 12:50:18 +0000 (+0200) Subject: fileio: add new helper write_base64_file_at() which encodes a binary object into... X-Git-Tag: v257-rc1~1156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc163cd40bb28064d4c57729950199894130516c;p=thirdparty%2Fsystemd.git fileio: add new helper write_base64_file_at() which encodes a binary object into base64 and writes it to a file --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 977fdd294c3..24357c1ef86 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -355,6 +355,22 @@ int write_string_filef( return write_string_file(fn, p, flags); } +int write_base64_file_at( + int dir_fd, + const char *fn, + const struct iovec *data, + WriteStringFileFlags flags) { + + _cleanup_free_ char *encoded = NULL; + ssize_t n; + + n = base64mem_full(data ? data->iov_base : NULL, data ? data->iov_len : 0, 79, &encoded); + if (n < 0) + return n; + + return write_string_file_at(dir_fd, fn, encoded, flags); +} + int read_one_line_file_at(int dir_fd, const char *filename, char **ret) { _cleanup_fclose_ FILE *f = NULL; int r; diff --git a/src/basic/fileio.h b/src/basic/fileio.h index e9fba165802..6986ed32766 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -66,6 +66,8 @@ static inline int write_string_file(const char *fn, const char *line, WriteStrin return write_string_file_ts(fn, line, flags, NULL); } +int write_base64_file_at(int dir_fd, const char *fn, const struct iovec *data, WriteStringFileFlags flags); + int write_string_filef(const char *fn, WriteStringFileFlags flags, const char *format, ...) _printf_(3, 4); int read_one_line_file_at(int dir_fd, const char *filename, char **ret); diff --git a/src/pcrlock/pcrlock.c b/src/pcrlock/pcrlock.c index c07132c1350..a40d23a347b 100644 --- a/src/pcrlock/pcrlock.c +++ b/src/pcrlock/pcrlock.c @@ -4391,15 +4391,10 @@ static int write_boot_policy_file(const char *json_text) { if (r < 0) return log_error_errno(r, "Failed to encode policy as credential: %m"); - _cleanup_free_ char *base64_buf = NULL; - ssize_t base64_size; - base64_size = base64mem_full(encoded.iov_base, encoded.iov_len, 79, &base64_buf); - if (base64_size < 0) - return base64_size; - - r = write_string_file( + r = write_base64_file_at( + AT_FDCWD, boot_policy_file, - base64_buf, + &encoded, WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_SYNC|WRITE_STRING_FILE_MKDIR_0755); if (r < 0) return log_error_errno(r, "Failed to write boot policy file to '%s': %m", boot_policy_file);