blob: da3ddaf63e94d41a518b0867572078e8822f73d2 [file] [log] [blame]
From 571ddac16048dfba4b25b04fe5cbd706c392b5ba Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 24 Dec 2021 19:17:17 +0000
Subject: [PATCH] smm_gateway: add checks for null attributes
As par EDK-2 and EDK-2 test code, when a user issue's
setVariable() with 0 in attributes field, it means a variable
delete request. Currently, smm gatway doesn't handle this scenario.
This change is to add that support
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
Upstream-Status: Pending [Not submitted to upstream yet]
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
---
.../backend/uefi_variable_store.c | 28 ++++++++++++-------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/components/service/smm_variable/backend/uefi_variable_store.c b/components/service/smm_variable/backend/uefi_variable_store.c
index a57b3346..e8771c21 100644
--- a/components/service/smm_variable/backend/uefi_variable_store.c
+++ b/components/service/smm_variable/backend/uefi_variable_store.c
@@ -167,7 +167,9 @@ efi_status_t uefi_variable_store_set_variable(
* 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)
+ EMSG("It might be a delete variable request\n");
+ else if((var->Attributes & EFI_VARIABLE_RUNTIME_ACCESS))
{
if((var->Attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS) != EFI_VARIABLE_BOOTSERVICE_ACCESS )
return EFI_INVALID_PARAMETER;
@@ -191,7 +193,7 @@ efi_status_t uefi_variable_store_set_variable(
(var->Attributes & EFI_VARIABLE_NON_VOLATILE) ||
(info->is_variable_set && (info->metadata.attributes & EFI_VARIABLE_NON_VOLATILE));
- if (var->DataSize) {
+ if (var->DataSize && var->Attributes) {
/* It's a set rather than a remove operation */
variable_index_update_variable(
@@ -206,7 +208,9 @@ efi_status_t uefi_variable_store_set_variable(
* that it's never possible for an object to exist within
* the storage backend without a corresponding index entry.
*/
- remove_variable_data(context, info);
+ EMSG(" deleting variable %s \n",var->Name);
+ if (remove_variable_data(context, info) != PSA_SUCCESS)
+ EMSG(" deleting variable %s FAILED\n",var->Name);
variable_index_remove_variable(&context->variable_index, info);
/* Variable info no longer valid */
@@ -587,14 +591,18 @@ static efi_status_t check_access_permitted_on_set(
}
if ((status == EFI_SUCCESS) && var->DataSize) {
-
+ /* Delete the variable with Attributes is 0 */
+ if (!var->Attributes) {
+ EMSG("Null attributes, may be a delete variable request\n");
+ status = EFI_SUCCESS;
+ }
/* Restrict which attributes can be modified for an existing variable */
- 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))) {
+ else 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;
}