]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
SecurityPkg/SecureBootConfigDxe: Fix deleting signature data issue.
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / SecureBootConfigDxe / SecureBootConfigImpl.c
index acb0dc055892bb6e3a81d2fc086d30e0a079e014..4ec0f8d13a92a9d68bab170412a32488406ab5d9 100644 (file)
@@ -3145,6 +3145,9 @@ DeleteSignatureEx (
   if (DelType == Delete_Signature_List_All) {\r
     VariableDataSize = 0;\r
   } else {\r
+    //
+    //  Traverse to target EFI_SIGNATURE_LIST but others will be skipped.
+    //
     while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {\r
       CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize);\r
       Offset += ListWalker->SignatureListSize;\r
@@ -3154,15 +3157,17 @@ DeleteSignatureEx (
       ListIndex++;\r
     }\r
 \r
-    if (CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) || DelType == Delete_Signature_List_One) {\r
-      RemainingSize -= ListWalker->SignatureListSize;\r
-      ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
-    } else {\r
+    //
+    //  Handle the target EFI_SIGNATURE_LIST.
+    //  If CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) or DelType == Delete_Signature_List_One
+    //  it means delete the whole EFI_SIGNATURE_LIST, So we just skip this EFI_SIGNATURE_LIST.
+    //
+    if (CheckedCount < SIGNATURE_DATA_COUNTS (ListWalker) && DelType == Delete_Signature_Data) {
       NewCertList = (EFI_SIGNATURE_LIST *)(NewVariableData + Offset);\r
       //\r
       // Copy header.\r
       //\r
-      CopyMem ((UINT8 *)NewVariableData, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
+      CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);
       Offset += sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize;\r
 \r
       DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
@@ -3181,10 +3186,11 @@ DeleteSignatureEx (
         }\r
         DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize);\r
       }\r
-\r
-      RemainingSize -= ListWalker->SignatureListSize;\r
     }\r
 \r
+    RemainingSize -= ListWalker->SignatureListSize;
+    ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);
+
     //\r
     // Copy remaining data, maybe 0.\r
     //\r
@@ -3572,6 +3578,9 @@ LoadSignatureList (
 {\r
   EFI_STATUS            Status;\r
   EFI_STRING_ID         ListType;\r
+  EFI_STRING            FormatNameString;\r
+  EFI_STRING            FormatHelpString;\r
+  EFI_STRING            FormatTypeString;\r
   EFI_SIGNATURE_LIST    *ListWalker;\r
   EFI_IFR_GUID_LABEL    *StartLabel;\r
   EFI_IFR_GUID_LABEL    *EndLabel;\r
@@ -3591,6 +3600,8 @@ LoadSignatureList (
   CHAR16                HelpBuffer[BUFFER_MAX_SIZE];\r
 \r
   Status                = EFI_SUCCESS;\r
+  FormatNameString      = NULL;\r
+  FormatHelpString      = NULL;\r
   StartOpCodeHandle     = NULL;\r
   EndOpCodeHandle       = NULL;\r
   StartGotoHandle       = NULL;\r
@@ -3705,6 +3716,12 @@ LoadSignatureList (
     goto ON_EXIT;\r
   }\r
 \r
+  FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL);\r
+  FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL);\r
+  if (FormatNameString == NULL || FormatHelpString == NULL) {\r
+    goto ON_EXIT;\r
+  }\r
+\r
   RemainingSize = DataSize;\r
   ListWalker    = (EFI_SIGNATURE_LIST *)VariableData;\r
   while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) {\r
@@ -3725,21 +3742,23 @@ LoadSignatureList (
     } else {\r
       ListType = STRING_TOKEN (STR_LIST_TYPE_UNKNOWN);\r
     }\r
+    FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListType, NULL);\r
+    if (FormatTypeString == NULL) {\r
+      goto ON_EXIT;\r
+    }\r
 \r
     ZeroMem (NameBuffer, sizeof (NameBuffer));\r
-    UnicodeSPrint (NameBuffer,\r
-      sizeof (NameBuffer),\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL),\r
-      Index + 1\r
-    );\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
 \r
     ZeroMem (HelpBuffer, sizeof (HelpBuffer));\r
     UnicodeSPrint (HelpBuffer,\r
       sizeof (HelpBuffer),\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL),\r
-      HiiGetString (PrivateData->HiiHandle, ListType, NULL),\r
+      FormatHelpString,\r
+      FormatTypeString,\r
       SIGNATURE_DATA_COUNTS (ListWalker)\r
     );\r
+    SECUREBOOT_FREE_NON_NULL (FormatTypeString);\r
+    FormatTypeString = NULL;\r
 \r
     HiiCreateGotoOpCode (\r
       StartOpCodeHandle,\r
@@ -3777,6 +3796,8 @@ ON_EXIT:
   SECUREBOOT_FREE_NON_OPCODE (EndGotoHandle);\r
 \r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
 \r
   PrivateData->ListCount = Index;\r
 \r
@@ -3922,6 +3943,8 @@ FormatHelpInfo (
   EFI_STATUS      Status;\r
   EFI_TIME        *Time;\r
   EFI_STRING_ID   ListTypeId;\r
+  EFI_STRING      FormatHelpString;\r
+  EFI_STRING      FormatTypeString;\r
   UINTN           DataSize;\r
   UINTN           HelpInfoIndex;\r
   UINTN           TotalSize;\r
@@ -3931,12 +3954,13 @@ FormatHelpInfo (
   CHAR16          *HelpInfoString;\r
   BOOLEAN         IsCert;\r
 \r
-  Status          = EFI_SUCCESS;\r
-  Time            = NULL;\r
-  HelpInfoIndex   = 0;\r
-  DataString      = NULL;\r
-  HelpInfoString  = NULL;\r
-  IsCert          = FALSE;\r
+  Status            = EFI_SUCCESS;\r
+  Time              = NULL;\r
+  FormatTypeString  = NULL;\r
+  HelpInfoIndex     = 0;\r
+  DataString        = NULL;\r
+  HelpInfoString    = NULL;\r
+  IsCert            = FALSE;\r
 \r
   if (CompareGuid(&ListEntry->SignatureType, &gEfiCertRsa2048Guid)) {\r
     ListTypeId = STRING_TOKEN(STR_LIST_TYPE_RSA2048_SHA256);\r
@@ -3969,6 +3993,11 @@ FormatHelpInfo (
     goto ON_EXIT;\r
   }\r
 \r
+  FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL);\r
+  if (FormatTypeString == NULL) {\r
+    goto ON_EXIT;\r
+  }\r
+\r
   TotalSize = 1024;\r
   HelpInfoString = AllocateZeroPool (TotalSize);\r
   if (HelpInfoString == NULL) {\r
@@ -3981,40 +4010,45 @@ FormatHelpInfo (
   //\r
   ZeroMem (GuidString, sizeof (GuidString));\r
   GuidToString(&DataEntry->SignatureOwner, GuidString, BUFFER_MAX_SIZE);\r
+  FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL);\r
+  if (FormatHelpString == NULL) {\r
+    goto ON_EXIT;\r
+  }\r
   HelpInfoIndex += UnicodeSPrint (\r
                      &HelpInfoString[HelpInfoIndex],\r
                      TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
-                     HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL),\r
+                     FormatHelpString,\r
                      GuidString\r
                    );\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+  FormatHelpString = NULL;\r
 \r
   //\r
   // Format content part, it depends on the type of signature list, hash value or CN.\r
   //\r
   if (IsCert) {\r
     GetCommonNameFromX509 (ListEntry, DataEntry, &DataString);\r
-    HelpInfoIndex += UnicodeSPrint(\r
-                       &HelpInfoString[HelpInfoIndex],\r
-                       TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
-                       HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL),\r
-                       HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL),\r
-                       DataSize,\r
-                       DataString\r
-                     );\r
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL);\r
   } else {\r
     //\r
     //  Format hash value for each signature data entry.\r
     //\r
     ParseHashValue (ListEntry, DataEntry, &DataString);\r
-    HelpInfoIndex += UnicodeSPrint (\r
-                       &HelpInfoString[HelpInfoIndex],\r
-                       TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
-                       HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL),\r
-                       HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL),\r
-                       DataSize,\r
-                       DataString\r
-                     );\r
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL);\r
+  }\r
+  if (FormatHelpString == NULL) {\r
+    goto ON_EXIT;\r
   }\r
+  HelpInfoIndex += UnicodeSPrint (\r
+                     &HelpInfoString[HelpInfoIndex],\r
+                     TotalSize - sizeof (CHAR16) * HelpInfoIndex,\r
+                     FormatHelpString,\r
+                     FormatTypeString,\r
+                     DataSize,\r
+                     DataString\r
+                   );\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+  FormatHelpString = NULL;\r
 \r
   //\r
   // Format revocation time part.\r
@@ -4032,13 +4066,18 @@ FormatHelpInfo (
       Time->Minute,\r
       Time->Second\r
     );\r
-\r
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL);\r
+    if (FormatHelpString == NULL) {\r
+      goto ON_EXIT;\r
+    }\r
     UnicodeSPrint (\r
       &HelpInfoString[HelpInfoIndex],\r
       TotalSize - sizeof (CHAR16) * HelpInfoIndex,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL),\r
+      FormatHelpString,\r
       TimeString\r
     );\r
+    SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+    FormatHelpString = NULL;\r
   }\r
 \r
   *StringId = HiiSetString (PrivateData->HiiHandle, 0, HelpInfoString, NULL);\r
@@ -4046,6 +4085,8 @@ ON_EXIT:
   SECUREBOOT_FREE_NON_NULL (DataString);\r
   SECUREBOOT_FREE_NON_NULL (HelpInfoString);\r
 \r
+  SECUREBOOT_FREE_NON_NULL (FormatTypeString);\r
+\r
   return Status;\r
 }\r
 \r
@@ -4076,6 +4117,7 @@ LoadSignatureData (
   EFI_IFR_GUID_LABEL    *StartLabel;\r
   EFI_IFR_GUID_LABEL    *EndLabel;\r
   EFI_STRING_ID         HelpStringId;\r
+  EFI_STRING            FormatNameString;\r
   VOID                  *StartOpCodeHandle;\r
   VOID                  *EndOpCodeHandle;\r
   UINTN                 DataSize;\r
@@ -4086,6 +4128,7 @@ LoadSignatureData (
   CHAR16                NameBuffer[BUFFER_MAX_SIZE];\r
 \r
   Status              = EFI_SUCCESS;\r
+  FormatNameString    = NULL;\r
   StartOpCodeHandle   = NULL;\r
   EndOpCodeHandle     = NULL;\r
   Index               = 0;\r
@@ -4167,17 +4210,18 @@ LoadSignatureData (
     ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
   }\r
 \r
+  FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL);\r
+  if (FormatNameString == NULL) {\r
+    goto ON_EXIT;\r
+  }\r
+\r
   DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
   for (Index = 0; Index < SIGNATURE_DATA_COUNTS(ListWalker); Index = Index + 1) {\r
     //\r
     // Format name buffer.\r
     //\r
     ZeroMem (NameBuffer, sizeof (NameBuffer));\r
-    UnicodeSPrint (NameBuffer,\r
-      sizeof (NameBuffer),\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL),\r
-      Index + 1\r
-    );\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
 \r
     //\r
     // Format help info buffer.\r
@@ -4221,6 +4265,7 @@ ON_EXIT:
   SECUREBOOT_FREE_NON_OPCODE (EndOpCodeHandle);\r
 \r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
 \r
   return Status;\r
 }\r