diff --git a/src/boot/random-seed.c b/src/boot/random-seed.c index 6d27a92552..4dc5a2b275 100644 --- a/src/boot/random-seed.c +++ b/src/boot/random-seed.c @@ -193,20 +193,24 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) { EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0); if (err == EFI_NOT_FOUND && seeded_by_efi) { + /* If the file does not exist, but we are reasonably well seeded, create the seed file */ - created = true; err = root_dir->Open( root_dir, &handle, (char16_t *) u"\\loader\\random-seed", EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0); - } - if (err != EFI_SUCCESS) { - if (!IN_SET(err, EFI_NOT_FOUND, EFI_WRITE_PROTECTED)) - log_error_status(err, "Failed to open random seed file: %m"); - return err; - } + if (err != EFI_SUCCESS) + return log_full(err, + EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to open random seed file: %m"); + created = true; + + } else if (err != EFI_SUCCESS) + return log_full(err, + err == EFI_NOT_FOUND || EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to open random seed file: %m"); if (!created) { err = get_file_info(handle, &info, /* ret_size= */ NULL); @@ -280,12 +284,16 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) { wsize = info->FileSize - size; err = handle->Write(handle, &wsize, seed /* All zeros now */); if (err != EFI_SUCCESS) - return log_error_status(err, "Failed to write random seed file: %m"); + return log_full(err, + EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to write random seed file: %m"); if (wsize != info->FileSize - size) return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file."); err = handle->Flush(handle); if (err != EFI_SUCCESS) - return log_error_status(err, "Failed to flush random seed file: %m"); + return log_full(err, + EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to flush random seed file: %m"); err = handle->SetPosition(handle, 0); if (err != EFI_SUCCESS) return log_error_status(err, "Failed to seek to beginning of random seed file: %m"); @@ -301,16 +309,21 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) { * flimsy. So instead we rely on userspace eventually truncating this when it writes a new * seed. For now the best we do is zero it. */ } + /* Update the random seed on disk before we use it */ wsize = size; err = handle->Write(handle, &wsize, random_bytes); if (err != EFI_SUCCESS) - return log_error_status(err, "Failed to write random seed file: %m"); + return log_full(err, + EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to write random seed file: %m"); if (wsize != size) return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file."); err = handle->Flush(handle); if (err != EFI_SUCCESS) - return log_error_status(err, "Failed to flush random seed file: %m"); + return log_full(err, + EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR, + "Failed to flush random seed file: %m"); err = BS->AllocatePool(EfiACPIReclaimMemory, offsetof(struct linux_efi_random_seed, seed) + DESIRED_SEED_SIZE, diff --git a/src/boot/util.h b/src/boot/util.h index 89f1184762..207904d759 100644 --- a/src/boot/util.h +++ b/src/boot/util.h @@ -263,3 +263,7 @@ char16_t *get_extra_dir(const EFI_DEVICE_PATH *file_path); #endif char16_t *url_replace_last_component(const char16_t *url, const char16_t *filename); + +static inline bool EFI_STATUS_IS_WRITE_REFUSED(EFI_STATUS status) { + return IN_SET(status, EFI_WRITE_PROTECTED, EFI_DEVICE_ERROR, EFI_ACCESS_DENIED); +}