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

Reply via email to