summaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2023-01-07 11:17:29 +0100
committerJan Janssen <medhefgo@web.de>2023-02-21 14:44:53 +0100
commita40960748907212883f4b7de7367e6870657016e (patch)
treebde74e854519af6193454ca950aa13dc62a29198 /src/boot
parentb3e25576290820f16181d7921498caf527b574b3 (diff)
downloadsystemd-a40960748907212883f4b7de7367e6870657016e.tar.gz
boot: Query EFI var size before fetching them
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/efi/util.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
index 683724b66c..f2e543c6cc 100644
--- a/src/boot/efi/util.c
+++ b/src/boot/efi/util.c
@@ -186,24 +186,25 @@ EFI_STATUS efivar_get_uint64_le(const EFI_GUID *vendor, const char16_t *name, ui
}
EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, const char16_t *name, char **ret, size_t *ret_size) {
- _cleanup_free_ char *buf = NULL;
- size_t l;
EFI_STATUS err;
assert(vendor);
assert(name);
- l = sizeof(char16_t *) * EFI_MAXIMUM_VARIABLE_SIZE;
- buf = xmalloc(l);
+ size_t size = 0;
+ err = RT->GetVariable((char16_t *) name, (EFI_GUID *) vendor, NULL, &size, NULL);
+ if (err != EFI_BUFFER_TOO_SMALL)
+ return err;
- err = RT->GetVariable((char16_t *) name, (EFI_GUID *) vendor, NULL, &l, buf);
+ _cleanup_free_ void *buf = xmalloc(size);
+ err = RT->GetVariable((char16_t *) name, (EFI_GUID *) vendor, NULL, &size, buf);
if (err != EFI_SUCCESS)
return err;
if (ret)
*ret = TAKE_PTR(buf);
if (ret_size)
- *ret_size = l;
+ *ret_size = size;
return EFI_SUCCESS;
}