]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/ConfigKeywordHandler.c
MdeModulePkg:Refine the code in HiiDatabaseDxe
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / ConfigKeywordHandler.c
index c3cd064074a8213b3e736e3d16b255b7f183abf3..e88a0c45975fb9a3352d3069008d164902f48f29 100644 (file)
@@ -1321,10 +1321,12 @@ GetStringIdFromRecord (
   HII_STRING_PACKAGE_INSTANCE         *StringPackage;\r
   EFI_STATUS                          Status;\r
   CHAR8                               *Name;\r
+  UINT32                              RetVal;\r
 \r
   ASSERT (DatabaseRecord != NULL && NameSpace != NULL && KeywordValue != NULL);\r
 \r
   PackageListNode = DatabaseRecord->PackageList;\r
+  RetVal = KEYWORD_HANDLER_NAMESPACE_ID_NOT_FOUND;\r
 \r
   if (*NameSpace != NULL) {\r
     Name = *NameSpace;\r
@@ -1338,7 +1340,8 @@ GetStringIdFromRecord (
     if (AsciiStrnCmp(Name, StringPackage->StringPkgHdr->Language, AsciiStrLen (Name)) == 0) {\r
       Status = GetStringIdFromString (StringPackage, KeywordValue, StringId); \r
       if (EFI_ERROR (Status)) {\r
-        return KEYWORD_HANDLER_KEYWORD_NOT_FOUND;\r
+        RetVal = KEYWORD_HANDLER_KEYWORD_NOT_FOUND;\r
+        continue;\r
       } else {\r
         if (*NameSpace == NULL) {\r
           *NameSpace = AllocateCopyPool (AsciiStrSize (StringPackage->StringPkgHdr->Language), StringPackage->StringPkgHdr->Language);\r
@@ -1351,7 +1354,7 @@ GetStringIdFromRecord (
     }\r
   }\r
 \r
-  return KEYWORD_HANDLER_NAMESPACE_ID_NOT_FOUND;\r
+  return RetVal;\r
 }\r
 \r
 /**\r
@@ -1571,7 +1574,6 @@ GetWidth (
     \r
     case EFI_IFR_TYPE_NUM_SIZE_64:\r
       return (UINT16) sizeof (UINT64) * ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
-      break;\r
     \r
     default:\r
       ASSERT (FALSE);\r
@@ -1668,6 +1670,7 @@ ConstructConfigHdr (
   CHAR16                    *Name;\r
   CHAR8                     *AsciiName;\r
   EFI_GUID                  *Guid;\r
+  UINTN                     MaxLen;\r
 \r
   ASSERT (OpCodeData != NULL);\r
 \r
@@ -1731,7 +1734,8 @@ ConstructConfigHdr (
   // GUID=<HexCh>32&NAME=<Char>NameLength&PATH=<HexChar>DevicePathSize <Null>\r
   // | 5 | sizeof (EFI_GUID) * 2 | 6 | NameStrLen*4 | 6 | DevicePathSize * 2 | 1 |\r
   //\r
-  String = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16));\r
+  MaxLen = 5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathSize * 2 + 1;\r
+  String = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
   if (String == NULL) {\r
     return NULL;\r
   }\r
@@ -1739,7 +1743,8 @@ ConstructConfigHdr (
   //\r
   // Start with L"GUID="\r
   //\r
-  ReturnString = StrCpy (String, L"GUID=");\r
+  StrCpyS (String, MaxLen, L"GUID=");\r
+  ReturnString = String;\r
   String += StrLen (String);\r
 \r
   if (Guid != NULL) {\r
@@ -1754,7 +1759,7 @@ ConstructConfigHdr (
   //\r
   // Append L"&NAME="\r
   //\r
-  StrCpy (String, L"&NAME=");\r
+  StrCpyS (String, MaxLen, L"&NAME=");\r
   String += StrLen (String);\r
 \r
   if (Name != NULL) {\r
@@ -1769,7 +1774,7 @@ ConstructConfigHdr (
   //\r
   // Append L"&PATH="\r
   //\r
-  StrCpy (String, L"&PATH=");\r
+  StrCpyS (String, MaxLen, L"&PATH=");\r
   String += StrLen (String);\r
 \r
   //\r
@@ -1989,7 +1994,7 @@ ExtractConfigRequest (
   UINT16                              Width;\r
   CHAR16                              *ConfigHdr;\r
   CHAR16                              *RequestElement;\r
-  UINTN                               Length;\r
+  UINTN                               MaxLen;\r
   CHAR16                              *StringPtr;\r
 \r
   ASSERT (DatabaseRecord != NULL && OpCodeData != NULL && ConfigRequest != NULL);\r
@@ -2028,9 +2033,10 @@ ExtractConfigRequest (
       }\r
       RequestElement = ConstructRequestElement(Name, Offset, Width);\r
       ConfigHdr = ConstructConfigHdr(Storage, DatabaseRecord->DriverHandle);\r
+      ASSERT (ConfigHdr != NULL);\r
 \r
-      Length = (StrLen (ConfigHdr) + 1 + StrLen(RequestElement) + 1) * sizeof (CHAR16);\r
-      *ConfigRequest = AllocatePool (Length);\r
+      MaxLen = StrLen (ConfigHdr) + 1 + StrLen(RequestElement) + 1;\r
+      *ConfigRequest = AllocatePool (MaxLen * sizeof (CHAR16));\r
       if (*ConfigRequest == NULL) {\r
         FreePool (ConfigHdr);\r
         FreePool (RequestElement);\r
@@ -2038,13 +2044,13 @@ ExtractConfigRequest (
       }\r
       StringPtr = *ConfigRequest;\r
 \r
-      StrCpy (StringPtr, ConfigHdr);\r
+      StrCpyS (StringPtr, MaxLen, ConfigHdr);\r
       StringPtr += StrLen (StringPtr);\r
 \r
       *StringPtr = L'&';\r
       StringPtr++;\r
 \r
-      StrCpy (StringPtr, RequestElement);\r
+      StrCpyS (StringPtr, MaxLen, RequestElement);\r
       StringPtr += StrLen (StringPtr);\r
       *StringPtr = L'\0';\r
 \r
@@ -2095,7 +2101,7 @@ ExtractConfigResp (
   UINT16                              Width;\r
   CHAR16                              *ConfigHdr;\r
   CHAR16                              *RequestElement;\r
-  UINTN                               Length;\r
+  UINTN                               MaxLen;\r
   CHAR16                              *StringPtr;\r
 \r
   ASSERT ((DatabaseRecord != NULL) && (OpCodeData != NULL) && (ConfigResp != NULL) && (ValueElement != NULL));\r
@@ -2135,9 +2141,10 @@ ExtractConfigResp (
       RequestElement = ConstructRequestElement(Name, Offset, Width);\r
 \r
       ConfigHdr = ConstructConfigHdr(Storage, DatabaseRecord->DriverHandle);\r
+      ASSERT (ConfigHdr != NULL);\r
 \r
-      Length = (StrLen (ConfigHdr) + 1 + StrLen(RequestElement) + 1 + StrLen (L"VALUE=") + StrLen(ValueElement) + 1) * sizeof (CHAR16);\r
-      *ConfigResp = AllocatePool (Length);\r
+      MaxLen = StrLen (ConfigHdr) + 1 + StrLen(RequestElement) + 1 + StrLen (L"VALUE=") + StrLen(ValueElement) + 1;\r
+      *ConfigResp = AllocatePool (MaxLen * sizeof (CHAR16));\r
       if (*ConfigResp == NULL) {\r
         FreePool (ConfigHdr);\r
         FreePool (RequestElement);\r
@@ -2145,22 +2152,22 @@ ExtractConfigResp (
       }\r
       StringPtr = *ConfigResp;\r
 \r
-      StrCpy (StringPtr, ConfigHdr);\r
+      StrCpyS (StringPtr, MaxLen, ConfigHdr);\r
       StringPtr += StrLen (StringPtr);\r
 \r
       *StringPtr = L'&';\r
       StringPtr++;\r
 \r
-      StrCpy (StringPtr, RequestElement);\r
+      StrCpyS (StringPtr, MaxLen, RequestElement);\r
       StringPtr += StrLen (StringPtr);\r
       \r
       *StringPtr = L'&';\r
       StringPtr++;\r
 \r
-      StrCpy (StringPtr, L"VALUE=");\r
+      StrCpyS (StringPtr, MaxLen, L"VALUE=");\r
       StringPtr += StrLen (StringPtr);\r
 \r
-      StrCpy (StringPtr, ValueElement);\r
+      StrCpyS (StringPtr, MaxLen, ValueElement);\r
       StringPtr += StrLen (StringPtr);\r
       *StringPtr = L'\0';\r
 \r
@@ -2429,9 +2436,10 @@ GenerateKeywordResp (
   }\r
 \r
   //\r
-  // 2. Allocate the buffer and create the KeywordResp string.\r
+  // 2. Allocate the buffer and create the KeywordResp string include '\0'.\r
   //\r
-  *KeywordResp = AllocatePool ((RespStrLen + 1) * sizeof (CHAR16));\r
+  RespStrLen += 1;\r
+  *KeywordResp = AllocatePool (RespStrLen * sizeof (CHAR16));\r
   if (*KeywordResp == NULL) {\r
     if (UnicodeNameSpace != NULL) {\r
       FreePool (UnicodeNameSpace);\r
@@ -2444,36 +2452,36 @@ GenerateKeywordResp (
   //\r
   // 2.1 Copy NameSpaceId section.\r
   //\r
-  StrCpy (RespStr, L"NAMESPACE=");\r
+  StrCpyS (RespStr, RespStrLen, L"NAMESPACE=");\r
   RespStr += StrLen (RespStr);\r
-  StrCpy (RespStr, UnicodeNameSpace);\r
+  StrCpyS (RespStr, RespStrLen, UnicodeNameSpace);\r
   RespStr += StrLen (RespStr);\r
 \r
   //\r
   // 2.2 Copy PathHdr section.\r
   //\r
-  StrCpy (RespStr, PathHdr);\r
+  StrCpyS (RespStr, RespStrLen, PathHdr);\r
   RespStr += StrLen (RespStr);\r
 \r
   //\r
   // 2.3 Copy Keyword section.\r
   //\r
-  StrCpy (RespStr, L"KEYWORD=");\r
+  StrCpyS (RespStr, RespStrLen, L"KEYWORD=");\r
   RespStr += StrLen (RespStr);\r
-  StrCpy (RespStr, KeywordData);\r
+  StrCpyS (RespStr, RespStrLen, KeywordData);\r
   RespStr += StrLen (RespStr);\r
 \r
   //\r
   // 2.4 Copy the Value section.\r
   //\r
-  StrCpy (RespStr, ValueStr);\r
+  StrCpyS (RespStr, RespStrLen, ValueStr);\r
   RespStr += StrLen (RespStr);\r
 \r
   //\r
   // 2.5 Copy ReadOnly section if exist.\r
   //\r
   if (ReadOnly) {\r
-    StrCpy (RespStr, L"&READONLY");\r
+    StrCpyS (RespStr, RespStrLen, L"&READONLY");\r
     RespStr += StrLen (RespStr);\r
   }\r
 \r
@@ -2534,7 +2542,7 @@ MergeToMultiKeywordResp (
   *StringPtr = L'&';\r
   StringPtr++;\r
 \r
-  StrCpy (StringPtr, *KeywordResp);\r
+  StrCpyS (StringPtr, MultiKeywordRespLen / sizeof (CHAR16), *KeywordResp);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -2565,7 +2573,6 @@ EnumerateAllKeywords (
   UINT8                               *DevicePathPkg;\r
   UINT8                               *DevicePath;\r
   HII_DATABASE_RECORD                 *DataBaseRecord;\r
-  UINTN                               DevicePathSize;\r
   HII_DATABASE_PACKAGE_LIST_INSTANCE  *PackageListNode;\r
   HII_STRING_PACKAGE_INSTANCE         *StringPackage;\r
   CHAR8                               *LocalNameSpace;\r
@@ -2580,7 +2587,6 @@ EnumerateAllKeywords (
   BOOLEAN                             ReadOnly;\r
 \r
   DataBaseRecord   = NULL;\r
-  DevicePathSize   = 0;\r
   Status           = EFI_SUCCESS;\r
   MultiKeywordResp = NULL;\r
   DevicePath       = NULL;\r
@@ -2600,7 +2606,6 @@ EnumerateAllKeywords (
     DataBaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
     if ((DevicePathPkg = DataBaseRecord->PackageList->DevicePathPkg) != NULL) {\r
       DevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
-      DevicePathSize    = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath);\r
     }\r
     PackageListNode = DataBaseRecord->PackageList;\r
 \r
@@ -2803,7 +2808,7 @@ EfiConfigKeywordHandlerSetData (
   EFI_STATUS                          Status;\r
   CHAR16                              *StringPtr;\r
   EFI_DEVICE_PATH_PROTOCOL            *DevicePath;\r
-  CHAR16                              *NextStringPtr;  \r
+  CHAR16                              *NextStringPtr;\r
   CHAR16                              *KeywordData;\r
   EFI_STRING_ID                       KeywordStringId;\r
   UINT32                              RetVal;\r
@@ -2814,6 +2819,7 @@ EfiConfigKeywordHandlerSetData (
   CHAR16                              *ValueElement;\r
   BOOLEAN                             ReadOnly;\r
   EFI_STRING                          InternalProgress;\r
+  CHAR16                              *TempString;\r
 \r
   if (This == NULL || Progress == NULL || ProgressErr == NULL || KeywordString == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -2822,7 +2828,6 @@ EfiConfigKeywordHandlerSetData (
   *Progress    = KeywordString;\r
   *ProgressErr = KEYWORD_HANDLER_UNDEFINED_PROCESSING_ERROR;\r
   Status       = EFI_SUCCESS;\r
-  StringPtr    = KeywordString;\r
   MultiConfigResp = NULL;\r
   NameSpace       = NULL;\r
   DevicePath      = NULL;\r
@@ -2831,6 +2836,13 @@ EfiConfigKeywordHandlerSetData (
   ConfigResp      = NULL;\r
   KeywordStringId = 0;\r
 \r
+  //\r
+  // Use temp string to avoid changing input string buffer.\r
+  //\r
+  TempString = AllocateCopyPool (StrSize (KeywordString), KeywordString);\r
+  ASSERT (TempString != NULL);\r
+  StringPtr = TempString;\r
+\r
   while ((StringPtr != NULL) && (*StringPtr != L'\0')) {\r
     //\r
     // 1. Get NameSpace from NameSpaceId keyword.\r
@@ -2838,8 +2850,18 @@ EfiConfigKeywordHandlerSetData (
     Status = ExtractNameSpace (StringPtr, &NameSpace, &NextStringPtr);\r
     if (EFI_ERROR (Status)) {\r
       *ProgressErr = KEYWORD_HANDLER_MALFORMED_STRING;\r
-      return Status;\r
+      goto Done;\r
+    }\r
+    ASSERT (NameSpace != NULL);\r
+    //\r
+    // 1.1 Check whether the input namespace is valid.\r
+    //\r
+    if (AsciiStrnCmp(NameSpace, UEFI_CONFIG_LANG, AsciiStrLen (UEFI_CONFIG_LANG)) != 0) {\r
+      *ProgressErr = KEYWORD_HANDLER_UNDEFINED_PROCESSING_ERROR;\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto Done;\r
     }\r
+\r
     StringPtr = NextStringPtr;\r
 \r
     //\r
@@ -2957,6 +2979,8 @@ EfiConfigKeywordHandlerSetData (
   *ProgressErr = KEYWORD_HANDLER_NO_ERROR;\r
 \r
 Done:\r
+  ASSERT (TempString != NULL);\r
+  FreePool (TempString);\r
   if (NameSpace != NULL) {\r
     FreePool (NameSpace);\r
   }\r
@@ -3073,6 +3097,7 @@ EfiConfigKeywordHandlerGetData (
   BOOLEAN                             ReadOnly;\r
   CHAR16                              *KeywordResp;\r
   CHAR16                              *MultiKeywordResp;\r
+  CHAR16                              *TempString;\r
 \r
   if (This == NULL || Progress == NULL || ProgressErr == NULL || Results == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -3088,18 +3113,44 @@ EfiConfigKeywordHandlerGetData (
   ReadOnly     = FALSE;\r
   MultiKeywordResp = NULL;\r
   KeywordStringId  = 0;\r
+  TempString   = NULL;\r
 \r
+  //\r
+  // Use temp string to avoid changing input string buffer.\r
+  //\r
+  if (NameSpaceId != NULL) {\r
+    TempString = AllocateCopyPool (StrSize (NameSpaceId), NameSpaceId);\r
+    ASSERT (TempString != NULL);\r
+  }\r
   //\r
   // 1. Get NameSpace from NameSpaceId keyword.\r
   //\r
-  Status = ExtractNameSpace (NameSpaceId, &NameSpace, NULL);\r
+  Status = ExtractNameSpace (TempString, &NameSpace, NULL);\r
+  if (TempString != NULL) {\r
+    FreePool (TempString);\r
+    TempString = NULL;\r
+  }\r
   if (EFI_ERROR (Status)) {\r
     *ProgressErr = KEYWORD_HANDLER_NAMESPACE_ID_NOT_FOUND;\r
     return Status;\r
   }\r
-\r
+  //\r
+  // 1.1 Check whether the input namespace is valid.\r
+  //\r
+  if (NameSpace != NULL){\r
+    if (AsciiStrnCmp(NameSpace, UEFI_CONFIG_LANG, AsciiStrLen (UEFI_CONFIG_LANG)) != 0) {\r
+      *ProgressErr = KEYWORD_HANDLER_UNDEFINED_PROCESSING_ERROR;\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+  \r
   if (KeywordString != NULL) {\r
-    StringPtr = KeywordString;\r
+    //\r
+    // Use temp string to avoid changing input string buffer.\r
+    //\r
+    TempString = AllocateCopyPool (StrSize (KeywordString), KeywordString);\r
+    ASSERT (TempString != NULL);\r
+    StringPtr = TempString;\r
 \r
     while (*StringPtr != L'\0') {\r
       //\r
@@ -3220,6 +3271,9 @@ EfiConfigKeywordHandlerGetData (
   *ProgressErr = KEYWORD_HANDLER_NO_ERROR;\r
 \r
 Done:\r
+  if (TempString != NULL) {\r
+    FreePool (TempString);\r
+  }\r
   if (NameSpace != NULL) {\r
     FreePool (NameSpace);\r
   }\r