| From 55fc3dbfb0ec21b1239808d0dddae14fbb8bb5f3 Mon Sep 17 00:00:00 2001 |
| From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com> |
| Date: Mon, 20 Dec 2021 19:56:30 +0000 |
| Subject: [PATCH] Add missing features to setVariable() |
| |
| This patch resolves the failing tests in SCT related to |
| setVariable() function. The existing implementation is |
| missing few cases where error codes are returned when called |
| with certain paramters. These conditions are implemented in |
| this patch based on the explanation provided in uefi spec. |
| |
| Upstream-Status: Pending [Not submitted to upstream yet] |
| Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com> |
| |
| |
| --- |
| .../backend/uefi_variable_store.c | 29 ++++++++++++++++--- |
| 1 file changed, 25 insertions(+), 4 deletions(-) |
| |
| diff --git a/components/service/smm_variable/backend/uefi_variable_store.c b/components/service/smm_variable/backend/uefi_variable_store.c |
| index 1bb869ae..a1671074 100644 |
| --- a/components/service/smm_variable/backend/uefi_variable_store.c |
| +++ b/components/service/smm_variable/backend/uefi_variable_store.c |
| @@ -161,6 +161,17 @@ efi_status_t uefi_variable_store_set_variable( |
| bool should_sync_index = false; |
| |
| if (status != EFI_SUCCESS) return status; |
| + |
| + /* |
| + * Runtime access to a data variable implies boot service access. Attributes that have |
| + * EFI_VARIABLE_RUNTIME_ACCESS set must also have EFI_VARIABLE_BOOTSERVICE_ACCESS set. |
| + * The caller is responsible for following this rule. |
| + */ |
| + if((var->Attributes & EFI_VARIABLE_RUNTIME_ACCESS)) |
| + { |
| + if((var->Attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS) != EFI_VARIABLE_BOOTSERVICE_ACCESS ) |
| + return EFI_INVALID_PARAMETER; |
| + } |
| |
| /* Find in index */ |
| const struct variable_info *info = variable_index_find( |
| @@ -221,6 +232,13 @@ efi_status_t uefi_variable_store_set_variable( |
| if (!info) status = EFI_OUT_OF_RESOURCES; |
| should_sync_index = info && (info->metadata.attributes & EFI_VARIABLE_NON_VOLATILE); |
| } |
| + else |
| + { |
| + /* Return EFI_NOT_FOUND when a remove operation is performed |
| + * on variable that is not existing. |
| + */ |
| + status = EFI_NOT_FOUND; |
| + } |
| |
| /* The order of these operations is important. For an update |
| * or create operation, The variable index is always synchronized |
| @@ -555,10 +573,13 @@ static efi_status_t check_access_permitted_on_set( |
| if ((status == EFI_SUCCESS) && var->DataSize) { |
| |
| /* Restrict which attributes can be modified for an existing variable */ |
| - if ((var->Attributes & EFI_VARIABLE_NON_VOLATILE) != |
| - (info->metadata.attributes & EFI_VARIABLE_NON_VOLATILE)) { |
| - |
| - /* Don't permit change of storage class */ |
| + if (((var->Attributes & EFI_VARIABLE_NON_VOLATILE) != |
| + (info->metadata.attributes & EFI_VARIABLE_NON_VOLATILE)) || |
| + ((var->Attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS) != |
| + (info->metadata.attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS)) || |
| + ((var->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) != |
| + (info->metadata.attributes & EFI_VARIABLE_RUNTIME_ACCESS))) { |
| + /* Don't permit change of attributes */ |
| status = EFI_INVALID_PARAMETER; |
| } |
| } |