diff options
Diffstat (limited to 'src/shared/efivars.c')
-rw-r--r-- | src/shared/efivars.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/shared/efivars.c b/src/shared/efivars.c index a3850bede2..9ca51cf750 100644 --- a/src/shared/efivars.c +++ b/src/shared/efivars.c @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ /*** This file is part of systemd. @@ -84,10 +85,10 @@ bool is_efi_boot(void) { } static int read_flag(const char *varname) { - int r; _cleanup_free_ void *v = NULL; - size_t s; uint8_t b; + size_t s; + int r; r = efi_get_variable(EFI_VENDOR_GLOBAL, varname, NULL, &v, &s); if (r < 0) @@ -97,8 +98,7 @@ static int read_flag(const char *varname) { return -EINVAL; b = *(uint8_t *)v; - r = b > 0; - return r; + return b > 0; } bool is_efi_secure_boot(void) { @@ -110,29 +110,33 @@ bool is_efi_secure_boot_setup_mode(void) { } int efi_reboot_to_firmware_supported(void) { - int r; - size_t s; - uint64_t b; _cleanup_free_ void *v = NULL; + uint64_t b; + size_t s; + int r; if (!is_efi_boot() || detect_container() > 0) return -EOPNOTSUPP; r = efi_get_variable(EFI_VENDOR_GLOBAL, "OsIndicationsSupported", NULL, &v, &s); + if (r == -ENOENT) /* variable doesn't exist? it's not supported then */ + return -EOPNOTSUPP; if (r < 0) return r; - else if (s != sizeof(uint64_t)) + if (s != sizeof(uint64_t)) return -EINVAL; - b = *(uint64_t *)v; - b &= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; - return b > 0 ? 0 : -EOPNOTSUPP; + b = *(uint64_t*) v; + if (!(b & EFI_OS_INDICATIONS_BOOT_TO_FW_UI)) + return -EOPNOTSUPP; /* bit unset? it's not supported then */ + + return 0; } static int get_os_indications(uint64_t *os_indication) { - int r; - size_t s; _cleanup_free_ void *v = NULL; + size_t s; + int r; r = efi_reboot_to_firmware_supported(); if (r < 0) |