]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
SecurityPkg/SecureBootConfigDxe: Fix invalid NV data issue.
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / SecureBootConfigDxe / SecureBootConfigImpl.c
index 161512a1f47aafaeb31e83b7f49ae7b9c6a1105b..6123b5669779a87927076b11671eca29d6fc433b 100644 (file)
@@ -2,6 +2,7 @@
   HII Config Access protocol implementation of SecureBoot configuration module.\r
 \r
 Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<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
@@ -3073,7 +3074,7 @@ DeleteSignatureEx (
   EFI_SIGNATURE_LIST  *ListWalker;\r
   EFI_SIGNATURE_LIST  *NewCertList;\r
   EFI_SIGNATURE_DATA  *DataWalker;\r
-  CHAR16              *VariableName;\r
+  CHAR16              VariableName[BUFFER_MAX_SIZE];\r
   UINT32              VariableAttr;\r
   UINTN               VariableDataSize;\r
   UINTN               RemainingSize;\r
@@ -3084,7 +3085,6 @@ DeleteSignatureEx (
   UINT8               *NewVariableData;\r
 \r
   Status              = EFI_SUCCESS;\r
-  VariableName        = NULL;\r
   VariableAttr        = 0;\r
   VariableDataSize    = 0;\r
   ListIndex           = 0;\r
@@ -3092,18 +3092,12 @@ DeleteSignatureEx (
   VariableData        = NULL;\r
   NewVariableData     = NULL;\r
 \r
-  VariableName = AllocateZeroPool (100);\r
-  if (VariableName == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
   if (PrivateData->VariableName == Variable_DB) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE);\r
   } else if (PrivateData->VariableName == Variable_DBX) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE1);\r
   } else if (PrivateData->VariableName == Variable_DBT) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
   } else {\r
     goto ON_EXIT;\r
   }\r
@@ -3152,6 +3146,9 @@ DeleteSignatureEx (
   if (DelType == Delete_Signature_List_All) {\r
     VariableDataSize = 0;\r
   } else {\r
+    //\r
+    //  Traverse to target EFI_SIGNATURE_LIST but others will be skipped.\r
+    //\r
     while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {\r
       CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize);\r
       Offset += ListWalker->SignatureListSize;\r
@@ -3161,15 +3158,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
+    //\r
+    //  Handle the target EFI_SIGNATURE_LIST.\r
+    //  If CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) or DelType == Delete_Signature_List_One\r
+    //  it means delete the whole EFI_SIGNATURE_LIST, So we just skip this EFI_SIGNATURE_LIST.\r
+    //\r
+    if (CheckedCount < SIGNATURE_DATA_COUNTS (ListWalker) && DelType == Delete_Signature_Data) {\r
       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);\r
       Offset += sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize;\r
 \r
       DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
@@ -3188,10 +3187,11 @@ DeleteSignatureEx (
         }\r
         DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize);\r
       }\r
-\r
-      RemainingSize -= ListWalker->SignatureListSize;\r
     }\r
 \r
+    RemainingSize -= ListWalker->SignatureListSize;\r
+    ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+\r
     //\r
     // Copy remaining data, maybe 0.\r
     //\r
@@ -3222,7 +3222,6 @@ DeleteSignatureEx (
   }\r
 \r
 ON_EXIT:\r
-  SECUREBOOT_FREE_NON_NULL (VariableName);\r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
   SECUREBOOT_FREE_NON_NULL (NewVariableData);\r
 \r
@@ -3580,6 +3579,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
@@ -3594,20 +3596,19 @@ LoadSignatureList (
   UINTN                 RemainingSize;\r
   UINT16                Index;\r
   UINT8                 *VariableData;\r
-  CHAR16                *VariableName;\r
-  CHAR16                *NameBuffer;\r
-  CHAR16                *HelpBuffer;\r
+  CHAR16                VariableName[BUFFER_MAX_SIZE];\r
+  CHAR16                NameBuffer[BUFFER_MAX_SIZE];\r
+  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
   EndGotoHandle         = NULL;\r
   Index                 = 0;\r
   VariableData          = NULL;\r
-  VariableName          = NULL;\r
-  NameBuffer            = NULL;\r
-  HelpBuffer            = NULL;\r
 \r
   //\r
   // Initialize the container for dynamic opcodes.\r
@@ -3675,20 +3676,14 @@ LoadSignatureList (
   EndGoto->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
   EndGoto->Number = LABEL_END;\r
 \r
-  VariableName = AllocateZeroPool (100);\r
-  if (VariableName == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
   if (PrivateData->VariableName == Variable_DB) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE);\r
     DstFormId = FORMID_SECURE_BOOT_DB_OPTION_FORM;\r
   } else if (PrivateData->VariableName == Variable_DBX) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE1);\r
     DstFormId = FORMID_SECURE_BOOT_DBX_OPTION_FORM;\r
   } else if (PrivateData->VariableName == Variable_DBT) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
     DstFormId = FORMID_SECURE_BOOT_DBT_OPTION_FORM;\r
   } else {\r
     goto ON_EXIT;\r
@@ -3722,15 +3717,9 @@ LoadSignatureList (
     goto ON_EXIT;\r
   }\r
 \r
-  NameBuffer = AllocateZeroPool (100);\r
-  if (NameBuffer == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  HelpBuffer = AllocateZeroPool (100);\r
-  if (HelpBuffer == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\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
@@ -3754,18 +3743,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
-    UnicodeSPrint (NameBuffer,\r
-      100,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL),\r
-      Index + 1\r
-    );\r
+    ZeroMem (NameBuffer, sizeof (NameBuffer));\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
+\r
+    ZeroMem (HelpBuffer, sizeof (HelpBuffer));\r
     UnicodeSPrint (HelpBuffer,\r
-      100,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL),\r
-      HiiGetString (PrivateData->HiiHandle, ListType, NULL),\r
+      sizeof (HelpBuffer),\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
@@ -3776,9 +3770,6 @@ LoadSignatureList (
       QuestionIdBase + Index++\r
     );\r
 \r
-    ZeroMem (NameBuffer, 100);\r
-    ZeroMem (HelpBuffer, 100);\r
-\r
     RemainingSize -= ListWalker->SignatureListSize;\r
     ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
   }\r
@@ -3805,10 +3796,9 @@ ON_EXIT:
   SECUREBOOT_FREE_NON_OPCODE (StartGotoHandle);\r
   SECUREBOOT_FREE_NON_OPCODE (EndGotoHandle);\r
 \r
-  SECUREBOOT_FREE_NON_NULL (VariableName);\r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
-  SECUREBOOT_FREE_NON_NULL (NameBuffer);\r
-  SECUREBOOT_FREE_NON_NULL (HelpBuffer);\r
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
 \r
   PrivateData->ListCount = Index;\r
 \r
@@ -3954,23 +3944,24 @@ 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
-  CHAR16          *GuidString;\r
+  CHAR16          GuidString[BUFFER_MAX_SIZE];\r
+  CHAR16          TimeString[BUFFER_MAX_SIZE];\r
   CHAR16          *DataString;\r
-  CHAR16          *TimeString;\r
   CHAR16          *HelpInfoString;\r
   BOOLEAN         IsCert;\r
 \r
-  Status          = EFI_SUCCESS;\r
-  Time            = NULL;\r
-  HelpInfoIndex   = 0;\r
-  GuidString      = NULL;\r
-  DataString      = NULL;\r
-  TimeString      = 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
@@ -4003,9 +3994,8 @@ FormatHelpInfo (
     goto ON_EXIT;\r
   }\r
 \r
-  GuidString = AllocateZeroPool (100);\r
-  if (GuidString == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
+  FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL);\r
+  if (FormatTypeString == NULL) {\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -4019,55 +4009,56 @@ FormatHelpInfo (
   //\r
   // Format GUID part.\r
   //\r
-  GuidToString(&DataEntry->SignatureOwner, GuidString, 100);\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
   //\r
   if (Time != NULL) {\r
-    TimeString = AllocateZeroPool(100);\r
-    if (TimeString == NULL) {\r
-      Status = EFI_OUT_OF_RESOURCES;\r
-      goto ON_EXIT;\r
-    }\r
-\r
+    ZeroMem (TimeString, sizeof (TimeString));\r
     UnicodeSPrint (\r
       TimeString,\r
-      100,\r
+      sizeof (TimeString),\r
       L"%d-%d-%d %d:%d:%d",\r
       Time->Year,\r
       Time->Month,\r
@@ -4076,23 +4067,27 @@ 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
-\r
 ON_EXIT:\r
-  SECUREBOOT_FREE_NON_NULL (GuidString);\r
   SECUREBOOT_FREE_NON_NULL (DataString);\r
-  SECUREBOOT_FREE_NON_NULL (TimeString);\r
   SECUREBOOT_FREE_NON_NULL (HelpInfoString);\r
 \r
+  SECUREBOOT_FREE_NON_NULL (FormatTypeString);\r
+\r
   return Status;\r
 }\r
 \r
@@ -4123,22 +4118,22 @@ 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
   UINTN                 RemainingSize;\r
   UINT16                Index;\r
   UINT8                 *VariableData;\r
-  CHAR16                *VariableName;\r
-  CHAR16                *NameBuffer;\r
+  CHAR16                VariableName[BUFFER_MAX_SIZE];\r
+  CHAR16                NameBuffer[BUFFER_MAX_SIZE];\r
 \r
   Status              = EFI_SUCCESS;\r
+  FormatNameString    = NULL;\r
   StartOpCodeHandle   = NULL;\r
   EndOpCodeHandle     = NULL;\r
   Index               = 0;\r
   VariableData        = NULL;\r
-  VariableName        = NULL;\r
-  NameBuffer          = NULL;\r
 \r
   //\r
   // Initialize the container for dynamic opcodes.\r
@@ -4176,18 +4171,12 @@ LoadSignatureData (
   EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;\r
   EndLabel->Number        = LABEL_END;\r
 \r
-  VariableName = AllocateZeroPool (100);\r
-  if (VariableName == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
   if (PrivateData->VariableName == Variable_DB) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE);\r
   } else if (PrivateData->VariableName == Variable_DBX) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE1);\r
   } else if (PrivateData->VariableName == Variable_DBT) {\r
-    UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
   } else {\r
     goto ON_EXIT;\r
   }\r
@@ -4211,12 +4200,6 @@ LoadSignatureData (
     goto ON_EXIT;\r
   }\r
 \r
-  NameBuffer = AllocateZeroPool (100);\r
-  if (NameBuffer == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
   RemainingSize = DataSize;\r
   ListWalker = (EFI_SIGNATURE_LIST *)VariableData;\r
 \r
@@ -4228,16 +4211,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
-    UnicodeSPrint (NameBuffer,\r
-      100,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL),\r
-      Index + 1\r
-    );\r
+    ZeroMem (NameBuffer, sizeof (NameBuffer));\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
 \r
     //\r
     // Format help info buffer.\r
@@ -4268,7 +4253,6 @@ LoadSignatureData (
   // This memory buffer will be freed when exit from the SECUREBOOT_DELETE_SIGNATURE_DATA_FORM form.\r
   //\r
   PrivateData->CheckArray = AllocateZeroPool (SIGNATURE_DATA_COUNTS (ListWalker) * sizeof (BOOLEAN));\r
-\r
 ON_EXIT:\r
   HiiUpdateForm (\r
     PrivateData->HiiHandle,\r
@@ -4281,9 +4265,8 @@ ON_EXIT:
   SECUREBOOT_FREE_NON_OPCODE (StartOpCodeHandle);\r
   SECUREBOOT_FREE_NON_OPCODE (EndOpCodeHandle);\r
 \r
-  SECUREBOOT_FREE_NON_NULL (VariableName);\r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
-  SECUREBOOT_FREE_NON_NULL (NameBuffer);\r
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
 \r
   return Status;\r
 }\r
@@ -4337,6 +4320,7 @@ SecureBootCallback (
   UINTN                           NameLength;\r
   UINT16                          *FilePostFix;\r
   SECUREBOOT_CONFIG_PRIVATE_DATA  *PrivateData;\r
+  BOOLEAN                         GetBrowserDataResult;\r
 \r
   Status           = EFI_SUCCESS;\r
   SecureBootEnable = NULL;\r
@@ -4361,7 +4345,7 @@ SecureBootCallback (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  HiiGetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8 *) IfrNvData);\r
+  GetBrowserDataResult = HiiGetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8 *) IfrNvData);\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
     if (QuestionId == KEY_SECURE_BOOT_MODE) {\r
@@ -4907,7 +4891,7 @@ SecureBootCallback (
 \r
 EXIT:\r
 \r
-  if (!EFI_ERROR (Status)) {\r
+  if (!EFI_ERROR (Status) && GetBrowserDataResult) {\r
     BufferSize = sizeof (SECUREBOOT_CONFIGURATION);\r
     HiiSetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8*) IfrNvData, NULL);\r
   }\r