The common variable operation routines shared by DXE_RINTIME variable\r
module and DXE_SMM variable module.\r
\r
-Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
/**\r
Find the variable in the specified variable store.\r
\r
- @param VariableName Name of the variable to be found\r
- @param VendorGuid Vendor GUID to be found.\r
- @param PtrTrack Variable Track Pointer structure that contains Variable Information.\r
+ @param[in] VariableName Name of the variable to be found\r
+ @param[in] VendorGuid Vendor GUID to be found.\r
+ @param[in] IgnoreRtAttribute Ignore RUNTIME_ACCESS attribute when searching variable.\r
+ @param[in, out] PtrTrack Variable Track Pointer structure that contains Variable Information.\r
\r
- @retval EFI_SUCCESS Variable found successfully\r
- @retval EFI_NOT_FOUND Variable not found\r
+ @retval EFI_SUCCESS Variable found successfully\r
+ @retval EFI_NOT_FOUND Variable not found\r
**/\r
EFI_STATUS\r
FindVariableEx (\r
IN CHAR16 *VariableName,\r
IN EFI_GUID *VendorGuid,\r
+ IN BOOLEAN IgnoreRtAttribute,\r
IN OUT VARIABLE_POINTER_TRACK *PtrTrack\r
)\r
{\r
if (PtrTrack->CurrPtr->State == VAR_ADDED ||\r
PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)\r
) {\r
- if (!AtRuntime () || ((PtrTrack->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) != 0)) {\r
+ if (IgnoreRtAttribute || !AtRuntime () || ((PtrTrack->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) != 0)) {\r
if (VariableName[0] == 0) {\r
if (PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
InDeletedVariable = PtrTrack->CurrPtr;\r
This code finds variable in storage blocks of volatile and non-volatile storage areas.\r
If VariableName is an empty string, then we just return the first\r
qualified variable without comparing VariableName and VendorGuid.\r
- Otherwise, VariableName and VendorGuid are compared.\r
+ If IgnoreRtAttribute is TRUE, then we ignore the EFI_VARIABLE_RUNTIME_ACCESS Attribute\r
+ when searching existing variable, only VariableName and VendorGuid are compared.\r
+ Otherwise, variables with EFI_VARIABLE_RUNTIME_ACCESS are not visible at runtime.\r
\r
- @param VariableName Name of the variable to be found.\r
- @param VendorGuid Vendor GUID to be found.\r
- @param PtrTrack VARIABLE_POINTER_TRACK structure for output,\r
+ @param[in] VariableName Name of the variable to be found.\r
+ @param[in] VendorGuid Vendor GUID to be found.\r
+ @param[out] PtrTrack VARIABLE_POINTER_TRACK structure for output,\r
including the range searched and the target position.\r
- @param Global Pointer to VARIABLE_GLOBAL structure, including\r
+ @param[in] Global Pointer to VARIABLE_GLOBAL structure, including\r
base of volatile variable storage area, base of\r
NV variable storage area, and a lock.\r
+ @param[in] IgnoreRtAttribute Ignore RUNTIME_ACCESS attribute when searching variable.\r
\r
@retval EFI_INVALID_PARAMETER If VariableName is not an empty string, while\r
VendorGuid is NULL.\r
IN CHAR16 *VariableName,\r
IN EFI_GUID *VendorGuid,\r
OUT VARIABLE_POINTER_TRACK *PtrTrack,\r
- IN VARIABLE_GLOBAL *Global\r
+ IN VARIABLE_GLOBAL *Global,\r
+ IN BOOLEAN IgnoreRtAttribute\r
)\r
{\r
EFI_STATUS Status;\r
PtrTrack->EndPtr = GetEndPointer (VariableStoreHeader[Type]);\r
PtrTrack->Volatile = (BOOLEAN) (Type == VariableStoreTypeVolatile);\r
\r
- Status = FindVariableEx (VariableName, VendorGuid, PtrTrack);\r
+ Status = FindVariableEx (VariableName, VendorGuid, IgnoreRtAttribute, PtrTrack);\r
if (!EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
**/\r
VOID\r
-AutoUpdateLangVariable(\r
+AutoUpdateLangVariable (\r
IN CHAR16 *VariableName,\r
IN VOID *Data,\r
IN UINTN DataSize\r
// Update Lang if PlatformLang is already set\r
// Update PlatformLang if Lang is already set\r
//\r
- Status = FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update Lang\r
Data = GetVariableDataPtr (Variable.CurrPtr);\r
DataSize = Variable.CurrPtr->DataSize;\r
} else {\r
- Status = FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update PlatformLang\r
//\r
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.\r
//\r
- FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
\r
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,\r
ISO_639_2_ENTRY_SIZE + 1, Attributes, 0, 0, &Variable, NULL);\r
//\r
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.\r
//\r
- FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
\r
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,\r
AsciiStrSize (BestPlatformLang), Attributes, 0, 0, &Variable, NULL);\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
+ \r
+ //\r
+ // Only variable that have RT attributes can be updated/deleted in Runtime.\r
+ //\r
+ if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
}\r
\r
//\r
\r
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
\r
- Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
\r
- Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
goto Done;\r
}\r
Status = FindVariableEx (\r
GetVariableNamePtr (Variable.CurrPtr),\r
&Variable.CurrPtr->VendorGuid,\r
+ FALSE,\r
&VariableInHob\r
);\r
if (!EFI_ERROR (Status)) {\r
// Sanity check for EFI_VARIABLE_AUTHENTICATION_2 descriptor.\r
//\r
if (DataSize < OFFSET_OF_AUTHINFO2_CERT_DATA ||\r
- DataSize < AUTHINFO2_SIZE (Data) ||\r
- ((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->AuthInfo.Hdr.dwLength < OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)) {\r
+ ((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->AuthInfo.Hdr.dwLength > DataSize - (OFFSET_OF (EFI_VARIABLE_AUTHENTICATION_2, AuthInfo)) ||\r
+ ((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->AuthInfo.Hdr.dwLength < OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)) {\r
return EFI_SECURITY_VIOLATION;\r
}\r
PayloadSize = DataSize - AUTHINFO2_SIZE (Data);\r
//\r
// Check whether the input variable is already existed.\r
//\r
- FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
-\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, TRUE);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (((Variable.CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) && AtRuntime ()) {\r
+ return EFI_WRITE_PROTECTED;\r
+ }\r
+ }\r
+ \r
//\r
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.\r
//\r
Status = ProcessVarWithPk (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes, TRUE);\r
} else if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0)) {\r
Status = ProcessVarWithPk (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes, FALSE);\r
- } else if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) && ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0)) {\r
+ } else if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) && \r
+ ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0))) {\r
Status = ProcessVarWithKek (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes);\r
} else {\r
Status = ProcessVariable (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes);\r
if (TempVariableStoreHeader == 0) {\r
TempVariableStoreHeader = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageVariableBase);\r
}\r
+ \r
+ //\r
+ // Check if the Firmware Volume is not corrupted\r
+ //\r
+ if ((((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(TempVariableStoreHeader))->Signature != EFI_FVH_SIGNATURE) ||\r
+ (!CompareGuid (&gEfiSystemNvDataFvGuid, &((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(TempVariableStoreHeader))->FileSystemGuid))) {\r
+ Status = EFI_VOLUME_CORRUPTED;\r
+ DEBUG ((EFI_D_ERROR, "Firmware Volume for Variable Store is corrupted\n"));\r
+ goto Done;\r
+ }\r
+\r
VariableStoreBase = TempVariableStoreHeader + \\r
(((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)(TempVariableStoreHeader)) -> HeaderLength);\r
VariableStoreLength = (UINT64) PcdGet32 (PcdFlashNvStorageVariableSize) - \\r