]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: Query EFI var size before fetching them
authorJan Janssen <medhefgo@web.de>
Sat, 7 Jan 2023 10:17:29 +0000 (11:17 +0100)
committerJan Janssen <medhefgo@web.de>
Tue, 21 Feb 2023 13:44:53 +0000 (14:44 +0100)
src/boot/efi/util.c

index 683724b66cec83b82a05e8ff96ebca4c8870041b..f2e543c6cc67091bbe5d5cbdd1d6b3594055e55e 100644 (file)
@@ -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;
 }