summaryrefslogtreecommitdiffstats
path: root/fs/efivarfs/vars.c
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2022-10-19 23:29:58 +0200
committerArd Biesheuvel <ardb@kernel.org>2022-10-21 11:09:40 +0200
commit8a254d90a77580244ec57e82bca7eb65656cc167 (patch)
tree070e9b3229edbf81b724c919be3e0d8b10e79ca2 /fs/efivarfs/vars.c
parentefi: ssdt: Don't free memory if ACPI table was loaded successfully (diff)
downloadlinux-8a254d90a77580244ec57e82bca7eb65656cc167.tar.xz
linux-8a254d90a77580244ec57e82bca7eb65656cc167.zip
efi: efivars: Fix variable writes without query_variable_store()
Commit bbc6d2c6ef22 ("efi: vars: Switch to new wrapper layer") refactored the efivars layer so that the 'business logic' related to which UEFI variables affect the boot flow in which way could be moved out of it, and into the efivarfs driver. This inadvertently broke setting variables on firmware implementations that lack the QueryVariableInfo() boot service, because we no longer tolerate a EFI_UNSUPPORTED result from check_var_size() when calling efivar_entry_set_get_size(), which now ends up calling check_var_size() a second time inadvertently. If QueryVariableInfo() is missing, we support writes of up to 64k - let's move that logic into check_var_size(), and drop the redundant call. Cc: <stable@vger.kernel.org> # v6.0 Fixes: bbc6d2c6ef22 ("efi: vars: Switch to new wrapper layer") Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Diffstat (limited to 'fs/efivarfs/vars.c')
-rw-r--r--fs/efivarfs/vars.c16
1 files changed, 0 insertions, 16 deletions
diff --git a/fs/efivarfs/vars.c b/fs/efivarfs/vars.c
index a0ef63cfcecb..9e4f47808bd5 100644
--- a/fs/efivarfs/vars.c
+++ b/fs/efivarfs/vars.c
@@ -651,22 +651,6 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
if (err)
return err;
- /*
- * Ensure that the available space hasn't shrunk below the safe level
- */
- status = check_var_size(attributes, *size + ucs2_strsize(name, 1024));
- if (status != EFI_SUCCESS) {
- if (status != EFI_UNSUPPORTED) {
- err = efi_status_to_err(status);
- goto out;
- }
-
- if (*size > 65536) {
- err = -ENOSPC;
- goto out;
- }
- }
-
status = efivar_set_variable_locked(name, vendor, attributes, *size,
data, false);
if (status != EFI_SUCCESS) {