Revision: 15404
http://sourceforge.net/p/edk2/code/15404
Author: gdong1
Date: 2014-03-27 10:54:23 +0000 (Thu, 27 Mar 2014)
Log Message:
-----------
Calculate enough space for 2 variables (public key and variable data) instead
of directly setting them 1 by 1.
Fixed a bug in public key reclaim().
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dong Guo <[email protected]>
Reviewed-by: Yao Jiewen <[email protected]>
Reviewed-by: Zeng, Star <[email protected]>
Modified Paths:
--------------
trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/AuthService.c
trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.c
trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.h
Modified: trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
2014-03-27 07:08:15 UTC (rev 15403)
+++ trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c
2014-03-27 10:54:23 UTC (rev 15404)
@@ -1268,8 +1268,10 @@
so follow the argument sequence to check the Variables.
@param[in] Attributes Variable attributes for Variable entries.
- @param ... Variable argument list with type
VARIABLE_ENTRY_CONSISTENCY *.
- A NULL terminates the list.
+ @param ... The variable argument list with type
VARIABLE_ENTRY_CONSISTENCY *.
+ A NULL terminates the list. The VariableSize
of
+ VARIABLE_ENTRY_CONSISTENCY is the variable
data size as input.
+ It will be changed to variable total size as
output.
@retval TRUE Have enough variable space to set the
Variables successfully.
@retval FALSE No enough variable space to set the Variables
successfully.
@@ -1293,6 +1295,8 @@
VARIABLE_STORE_HEADER *VariableStoreHeader;
VARIABLE_POINTER_TRACK VariablePtrTrack;
VARIABLE_HEADER *NextVariable;
+ UINTN VarNameSize;
+ UINTN VarDataSize;
//
// Non-Volatile related.
@@ -1311,6 +1315,15 @@
VA_START (Args, Attributes);
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
while (VariableEntry != NULL) {
+ //
+ // Calculate variable total size.
+ //
+ VarNameSize = StrSize (VariableEntry->Name);
+ VarNameSize += GET_PAD_SIZE (VarNameSize);
+ VarDataSize = VariableEntry->VariableSize;
+ VarDataSize += GET_PAD_SIZE (VarDataSize);
+ VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) +
VarNameSize + VarDataSize);
+
TotalNeededSize += VariableEntry->VariableSize;
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
}
@@ -1407,8 +1420,6 @@
UINT32 Attributes;
VARIABLE_POINTER_TRACK Variable;
BOOLEAN SetLanguageCodes;
- UINTN VarNameSize;
- UINTN VarDataSize;
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];
//
@@ -1532,21 +1543,13 @@
BestLang = GetLangFromSupportedLangCodes
(mVariableModuleGlobal->LangCodes, Index, TRUE);
//
- // Calculate the needed variable size for Lang variable.
+ // Check the variable space for both Lang and PlatformLang variable.
//
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[0].VariableSize = HEADER_ALIGN
(VariableEntry[0].VariableSize);
+ VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME;
- //
- // Calculate the needed variable size for PlatformLang variable.
- //
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);
- VarDataSize = AsciiStrSize (BestPlatformLang);
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[1].VariableSize = HEADER_ALIGN
(VariableEntry[1].VariableSize);
+
+ VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT,
&VariableEntry[0], &VariableEntry[1], NULL)) {
@@ -1589,21 +1592,13 @@
BestPlatformLang = GetLangFromSupportedLangCodes
(mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);
//
- // Calculate the needed variable size for PlatformLang variable.
+ // Check the variable space for both PlatformLang and Lang variable.
//
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);
- VarDataSize = AsciiStrSize (BestPlatformLang);
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[0].VariableSize = HEADER_ALIGN
(VariableEntry[0].VariableSize);
+ VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
- //
- // Calculate the needed variable size for Lang variable.
- //
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[1].VariableSize = HEADER_ALIGN
(VariableEntry[1].VariableSize);
+
+ VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME;
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT,
&VariableEntry[0], &VariableEntry[1], NULL)) {
Modified: trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
2014-03-27 07:08:15 UTC (rev 15403)
+++ trunk/edk2/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h
2014-03-27 10:54:23 UTC (rev 15404)
@@ -101,10 +101,6 @@
typedef struct {
EFI_GUID *Guid;
CHAR16 *Name;
-// UINT32 Attributes;
- //
- // Variable size include variable header, name and data.
- //
UINTN VariableSize;
} VARIABLE_ENTRY_CONSISTENCY;
Modified: trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/AuthService.c
===================================================================
--- trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/AuthService.c
2014-03-27 07:08:15 UTC (rev 15403)
+++ trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/AuthService.c
2014-03-27 10:54:23 UTC (rev 15404)
@@ -456,16 +456,19 @@
**/
UINT32
AddPubKeyInStore (
- IN UINT8 *PubKey
+ IN UINT8 *PubKey,
+ IN VARIABLE_ENTRY_CONSISTENCY *VariableDataEntry
)
{
- EFI_STATUS Status;
- BOOLEAN IsFound;
- UINT32 Index;
- VARIABLE_POINTER_TRACK Variable;
- UINT8 *Ptr;
- UINT8 *Data;
- UINTN DataSize;
+ EFI_STATUS Status;
+ BOOLEAN IsFound;
+ UINT32 Index;
+ VARIABLE_POINTER_TRACK Variable;
+ UINT8 *Ptr;
+ UINT8 *Data;
+ UINTN DataSize;
+ VARIABLE_ENTRY_CONSISTENCY PublicKeyEntry;
+ UINT32 Attributes;
if (PubKey == NULL) {
return 0;
@@ -546,6 +549,21 @@
}
}
+ //
+ // Check the variable space for both public key and variable data.
+ //
+ PublicKeyEntry.VariableSize = (mPubKeyNumber + 1) *
EFI_CERT_TYPE_RSA2048_SIZE;
+ PublicKeyEntry.Guid = &gEfiAuthenticatedVariableGuid;
+ PublicKeyEntry.Name = AUTHVAR_KEYDB_NAME;
+ Attributes = VARIABLE_ATTRIBUTE_NV_BS_RT |
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;
+
+ if (!CheckRemainingSpaceForConsistency (Attributes, &PublicKeyEntry,
VariableDataEntry, NULL)) {
+ //
+ // No enough variable space.
+ //
+ return 0;
+ }
+
CopyMem (mPubKeyStore + mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE,
PubKey, EFI_CERT_TYPE_RSA2048_SIZE);
Index = ++mPubKeyNumber;
//
@@ -556,7 +574,7 @@
&gEfiAuthenticatedVariableGuid,
mPubKeyStore,
mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE,
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS |
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS,
+ Attributes,
0,
0,
&Variable,
@@ -1271,6 +1289,7 @@
EFI_CERT_BLOCK_RSA_2048_SHA256 *CertBlock;
UINT32 KeyIndex;
UINT64 MonotonicCount;
+ VARIABLE_ENTRY_CONSISTENCY VariableDataEntry;
KeyIndex = 0;
CertData = NULL;
@@ -1396,10 +1415,14 @@
// Now, the signature has been verified!
//
if (IsFirstTime && !IsDeletion) {
+ VariableDataEntry.VariableSize = DataSize - AUTHINFO_SIZE;
+ VariableDataEntry.Guid = VendorGuid;
+ VariableDataEntry.Name = VariableName;
+
//
// Update public key database variable if need.
//
- KeyIndex = AddPubKeyInStore (PubKey);
+ KeyIndex = AddPubKeyInStore (PubKey, &VariableDataEntry);
if (KeyIndex == 0) {
return EFI_OUT_OF_RESOURCES;
}
Modified: trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.c
===================================================================
--- trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.c
2014-03-27 07:08:15 UTC (rev 15403)
+++ trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.c
2014-03-27 10:54:23 UTC (rev 15404)
@@ -610,7 +610,7 @@
return FALSE;
}
- Variable = GetStartPointer (mNvVariableCache);
+ Variable = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN)
mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase);
while (IsValidVariableHeader (Variable)) {
if ((Variable->State == VAR_ADDED || Variable->State ==
(VAR_IN_DELETED_TRANSITION & VAR_ADDED)) &&
@@ -1518,8 +1518,10 @@
so follow the argument sequence to check the Variables.
@param[in] Attributes Variable attributes for Variable entries.
- @param ... Variable argument list with type
VARIABLE_ENTRY_CONSISTENCY *.
- A NULL terminates the list.
+ @param ... The variable argument list with type
VARIABLE_ENTRY_CONSISTENCY *.
+ A NULL terminates the list. The VariableSize
of
+ VARIABLE_ENTRY_CONSISTENCY is the variable
data size as input.
+ It will be changed to variable total size as
output.
@retval TRUE Have enough variable space to set the
Variables successfully.
@retval FALSE No enough variable space to set the Variables
successfully.
@@ -1543,6 +1545,8 @@
VARIABLE_STORE_HEADER *VariableStoreHeader;
VARIABLE_POINTER_TRACK VariablePtrTrack;
VARIABLE_HEADER *NextVariable;
+ UINTN VarNameSize;
+ UINTN VarDataSize;
//
// Non-Volatile related.
@@ -1561,6 +1565,15 @@
VA_START (Args, Attributes);
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
while (VariableEntry != NULL) {
+ //
+ // Calculate variable total size.
+ //
+ VarNameSize = StrSize (VariableEntry->Name);
+ VarNameSize += GET_PAD_SIZE (VarNameSize);
+ VarDataSize = VariableEntry->VariableSize;
+ VarDataSize += GET_PAD_SIZE (VarDataSize);
+ VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) +
VarNameSize + VarDataSize);
+
TotalNeededSize += VariableEntry->VariableSize;
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
}
@@ -1657,8 +1670,6 @@
UINT32 Attributes;
VARIABLE_POINTER_TRACK Variable;
BOOLEAN SetLanguageCodes;
- UINTN VarNameSize;
- UINTN VarDataSize;
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];
//
@@ -1782,21 +1793,13 @@
BestLang = GetLangFromSupportedLangCodes
(mVariableModuleGlobal->LangCodes, Index, TRUE);
//
- // Calculate the needed variable size for Lang variable.
+ // Check the variable space for both Lang and PlatformLang variable.
//
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[0].VariableSize = HEADER_ALIGN
(VariableEntry[0].VariableSize);
+ VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME;
- //
- // Calculate the needed variable size for PlatformLang variable.
- //
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);
- VarDataSize = AsciiStrSize (BestPlatformLang);
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[1].VariableSize = HEADER_ALIGN
(VariableEntry[1].VariableSize);
+
+ VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT,
&VariableEntry[0], &VariableEntry[1], NULL)) {
@@ -1839,21 +1842,13 @@
BestPlatformLang = GetLangFromSupportedLangCodes
(mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);
//
- // Calculate the needed variable size for PlatformLang variable.
+ // Check the variable space for both PlatformLang and Lang variable.
//
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);
- VarDataSize = AsciiStrSize (BestPlatformLang);
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[0].VariableSize = HEADER_ALIGN
(VariableEntry[0].VariableSize);
+ VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
- //
- // Calculate the needed variable size for Lang variable.
- //
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize
+ GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);
- VariableEntry[1].VariableSize = HEADER_ALIGN
(VariableEntry[1].VariableSize);
+
+ VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME;
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT,
&VariableEntry[0], &VariableEntry[1], NULL)) {
Modified: trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.h
===================================================================
--- trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.h
2014-03-27 07:08:15 UTC (rev 15403)
+++ trunk/edk2/SecurityPkg/VariableAuthenticated/RuntimeDxe/Variable.h
2014-03-27 10:54:23 UTC (rev 15404)
@@ -111,10 +111,6 @@
typedef struct {
EFI_GUID *Guid;
CHAR16 *Name;
-// UINT32 Attributes;
- //
- // Variable size include variable header, name and data.
- //
UINTN VariableSize;
} VARIABLE_ENTRY_CONSISTENCY;
@@ -222,6 +218,32 @@
);
/**
+ This function is to check if the remaining variable space is enough to set
+ all Variables from argument list successfully. The purpose of the check
+ is to keep the consistency of the Variables to be in variable storage.
+
+ Note: Variables are assumed to be in same storage.
+ The set sequence of Variables will be same with the sequence of
VariableEntry from argument list,
+ so follow the argument sequence to check the Variables.
+
+ @param[in] Attributes Variable attributes for Variable entries.
+ @param ... The variable argument list with type
VARIABLE_ENTRY_CONSISTENCY *.
+ A NULL terminates the list. The VariableSize
of
+ VARIABLE_ENTRY_CONSISTENCY is the variable
data size as input.
+ It will be changed to variable total size as
output.
+
+ @retval TRUE Have enough variable space to set the
Variables successfully.
+ @retval FALSE No enough variable space to set the Variables
successfully.
+
+**/
+BOOLEAN
+EFIAPI
+CheckRemainingSpaceForConsistency (
+ IN UINT32 Attributes,
+ ...
+ );
+
+/**
Update the variable region with Variable information. If
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is set,
index of associated public key is needed.
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits