From: Greg Kroah-Hartman Date: Fri, 29 Mar 2024 13:18:22 +0000 (+0100) Subject: 5.10-stable patches X-Git-Tag: v6.7.12~143 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=782ca2a3e23fca476f0e028ea3d9c18e36759575;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: efivarfs-request-at-most-512-bytes-for-variable-names.patch --- diff --git a/queue-5.10/efivarfs-request-at-most-512-bytes-for-variable-names.patch b/queue-5.10/efivarfs-request-at-most-512-bytes-for-variable-names.patch new file mode 100644 index 00000000000..5f2d9de8067 --- /dev/null +++ b/queue-5.10/efivarfs-request-at-most-512-bytes-for-variable-names.patch @@ -0,0 +1,76 @@ +From f45812cc23fb74bef62d4eb8a69fe7218f4b9f2a Mon Sep 17 00:00:00 2001 +From: Tim Schumacher +Date: Fri, 26 Jan 2024 17:25:23 +0100 +Subject: efivarfs: Request at most 512 bytes for variable names + +From: Tim Schumacher + +commit f45812cc23fb74bef62d4eb8a69fe7218f4b9f2a upstream. + +Work around a quirk in a few old (2011-ish) UEFI implementations, where +a call to `GetNextVariableName` with a buffer size larger than 512 bytes +will always return EFI_INVALID_PARAMETER. + +There is some lore around EFI variable names being up to 1024 bytes in +size, but this has no basis in the UEFI specification, and the upper +bounds are typically platform specific, and apply to the entire variable +(name plus payload). + +Given that Linux does not permit creating files with names longer than +NAME_MAX (255) bytes, 512 bytes (== 256 UTF-16 characters) is a +reasonable limit. + +Cc: # 6.1+ +Signed-off-by: Tim Schumacher +Signed-off-by: Ard Biesheuvel +[timschumi@gmx.de: adjusted diff for changed context and code move] +Signed-off-by: Tim Schumacher +Signed-off-by: Greg Kroah-Hartman +--- + drivers/firmware/efi/vars.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/firmware/efi/vars.c ++++ b/drivers/firmware/efi/vars.c +@@ -415,7 +415,7 @@ int efivar_init(int (*func)(efi_char16_t + void *data, bool duplicates, struct list_head *head) + { + const struct efivar_operations *ops; +- unsigned long variable_name_size = 1024; ++ unsigned long variable_name_size = 512; + efi_char16_t *variable_name; + efi_status_t status; + efi_guid_t vendor_guid; +@@ -438,12 +438,13 @@ int efivar_init(int (*func)(efi_char16_t + } + + /* +- * Per EFI spec, the maximum storage allocated for both +- * the variable name and variable data is 1024 bytes. ++ * A small set of old UEFI implementations reject sizes ++ * above a certain threshold, the lowest seen in the wild ++ * is 512. + */ + + do { +- variable_name_size = 1024; ++ variable_name_size = 512; + + status = ops->get_next_variable(&variable_name_size, + variable_name, +@@ -491,9 +492,13 @@ int efivar_init(int (*func)(efi_char16_t + break; + case EFI_NOT_FOUND: + break; ++ case EFI_BUFFER_TOO_SMALL: ++ pr_warn("efivars: Variable name size exceeds maximum (%lu > 512)\n", ++ variable_name_size); ++ status = EFI_NOT_FOUND; ++ break; + default: +- printk(KERN_WARNING "efivars: get_next_variable: status=%lx\n", +- status); ++ pr_warn("efivars: get_next_variable: status=%lx\n", status); + status = EFI_NOT_FOUND; + break; + } diff --git a/queue-5.10/series b/queue-5.10/series index 49d54dbede1..cc24ab94466 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -147,3 +147,4 @@ documentation-hw-vuln-add-documentation-for-rfds.patch x86-rfds-mitigate-register-file-data-sampling-rfds.patch kvm-x86-export-rfds_no-and-rfds_clear-to-guests.patch perf-core-fix-reentry-problem-in-perf_output_read_group.patch +efivarfs-request-at-most-512-bytes-for-variable-names.patch