From: Jan Janssen Date: Sat, 7 Jan 2023 10:17:29 +0000 (+0100) Subject: boot: Query EFI var size before fetching them X-Git-Tag: v254-rc1~1211^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a40960748907212883f4b7de7367e6870657016e;p=thirdparty%2Fsystemd.git boot: Query EFI var size before fetching them --- diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index 683724b66ce..f2e543c6cc6 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; }