]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiHiiLib/HiiString.c
Fix a minor issue to ensure the converted RFC 3066 language is NULL-terminated.
[mirror_edk2.git] / MdeModulePkg / Library / UefiHiiLib / HiiString.c
index cd4944152aee68af217fd30b4f3726962cd15393..333c29fc3be2b337eee321e781ba58ea22c0477b 100644 (file)
@@ -191,7 +191,7 @@ HiiLibNewString (
   EFI_STATUS  Status;\r
   CHAR8       *Languages;\r
   CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       *Lang;\r
 \r
   ASSERT (String != NULL);\r
   ASSERT (StringId != NULL);\r
@@ -199,6 +199,12 @@ HiiLibNewString (
   Status = EFI_SUCCESS;\r
 \r
   Languages = HiiLibGetSupportedLanguages (PackageList);\r
+  ASSERT (Languages != NULL);\r
+  //\r
+  // Allocate working buffer to contain substring of Languages.\r
+  //\r
+  Lang = AllocatePool (AsciiStrSize (Languages));\r
+  ASSERT (Lang != NULL);\r
 \r
   LangStrings = Languages;\r
   while (*LangStrings != 0) {\r
@@ -222,6 +228,7 @@ HiiLibNewString (
     }\r
   }\r
 \r
+  FreePool (Lang);\r
   FreePool (Languages);\r
 \r
   return Status;\r
@@ -257,7 +264,7 @@ HiiLibSetString (
   EFI_STATUS  Status;\r
   CHAR8       *Languages;\r
   CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       *Lang;\r
 \r
   ASSERT (IsHiiHandleRegistered (PackageList));\r
 \r
@@ -266,6 +273,12 @@ HiiLibSetString (
   Languages = HiiLibGetSupportedLanguages (PackageList);\r
   ASSERT (Languages != NULL);\r
 \r
+  //\r
+  // Allocate working buffer to contain substring of Languages.\r
+  //\r
+  Lang = AllocatePool (AsciiStrSize (Languages));\r
+  ASSERT (Lang != NULL);\r
+\r
   LangStrings = Languages;\r
   while (*LangStrings != 0) {\r
     HiiLibGetNextLanguage (&LangStrings, Lang);\r
@@ -287,6 +300,7 @@ HiiLibSetString (
     }\r
   }\r
 \r
+  FreePool (Lang);\r
   FreePool (Languages);\r
 \r
   return Status;\r
@@ -324,8 +338,8 @@ HiiLibGetStringFromToken (
   EFI_GUID        Guid;\r
 \r
   Status = HiiLibGetHiiHandles (&HandleBufferLen, &HiiHandleBuffer);\r
-  if (EFI_ERROR(Status)) {\r
-    return Status;\r
+  if (HiiHandleBuffer == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
   for (Index = 0; Index < (HandleBufferLen / sizeof (EFI_HII_HANDLE)); Index++) {\r
     Status = HiiLibExtractGuidFromHiiHandle (HiiHandleBuffer[Index], &Guid);\r
@@ -349,9 +363,8 @@ HiiLibGetStringFromToken (
   Status = HiiLibGetStringFromHandle (HiiHandleBuffer[Index], StringId, String);\r
 \r
 Out:\r
-  if (HiiHandleBuffer != NULL) {\r
-    FreePool (HiiHandleBuffer);\r
-  }\r
+  FreePool (HiiHandleBuffer);\r
+\r
   return Status;\r
 }\r
 \r
@@ -390,44 +403,43 @@ HiiLibGetString (
 {\r
   EFI_STATUS  Status;\r
   CHAR8       *Languages;\r
-  CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
-  CHAR8       CurrentLang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       *CurrentLang;\r
+  CHAR8       *BestLanguage;\r
 \r
   ASSERT (StringSize != NULL);\r
   ASSERT (!(*StringSize != 0 && String == NULL));\r
   ASSERT (IsHiiHandleRegistered (PackageList));\r
 \r
-  GetCurrentLanguage (CurrentLang);\r
+  Languages = HiiLibGetSupportedLanguages (PackageList);\r
+  ASSERT (Languages != NULL);\r
 \r
-  Status = mHiiStringProt->GetString (\r
+  CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
+  \r
+  Status = EFI_NOT_FOUND;\r
+  BestLanguage = GetBestLanguage (\r
+                   Languages,\r
+                   FALSE,\r
+                   (CurrentLang != NULL) ? CurrentLang : "",\r
+                   (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
+                   Languages,\r
+                   NULL\r
+                   );\r
+  if (BestLanguage != NULL ) {\r
+     Status = mHiiStringProt->GetString (\r
                                mHiiStringProt,\r
-                               CurrentLang,\r
+                               BestLanguage,\r
                                PackageList,\r
                                StringId,\r
                                String,\r
                                StringSize,\r
                                NULL\r
                                );\r
-\r
-  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
-    Languages = HiiLibGetSupportedLanguages (PackageList);\r
-    ASSERT (Languages != NULL);\r
-    \r
-    LangStrings = Languages;\r
-    HiiLibGetNextLanguage (&LangStrings, Lang);\r
-    FreePool (Languages);\r
-\r
-    Status = mHiiStringProt->GetString (\r
-                                 mHiiStringProt,\r
-                                 Lang,\r
-                                 PackageList,\r
-                                 StringId,\r
-                                 String,\r
-                                 StringSize,\r
-                                 NULL\r
-                                 );\r
+     FreePool (BestLanguage);\r
   }\r
+  if (CurrentLang != NULL) {\r
+    FreePool (CurrentLang);\r
+  }\r
+  FreePool (Languages);\r
 \r
   return Status;\r
 }\r
@@ -520,41 +532,40 @@ ConvertRfc3066LanguageToIso639Language (
 \r
 \r
 /**\r
-  Convert language code from ISO639-2 to RFC3066.\r
+  Convert language code from ISO639-2 to RFC3066 and return the converted language.\r
+  Caller is responsible for freeing the allocated buffer.\r
 \r
   LanguageIso639 contain a single ISO639-2 code such as\r
   "eng" or "fra".\r
 \r
-  The LanguageRfc3066 must be a buffer large enough\r
-  for RFC_3066_ENTRY_SIZE characters.\r
-\r
   If LanguageIso639 is NULL, then ASSERT.\r
   If LanguageRfc3066 is NULL, then ASSERT.\r
 \r
   @param  LanguageIso639         ISO639-2 language code.\r
-  @param  LanguageRfc3066        RFC3066 language code.\r
 \r
-  @retval EFI_SUCCESS            Language code converted.\r
-  @retval EFI_NOT_FOUND          Language code not found.\r
+  @return the allocated buffer or NULL, if the language is not found.\r
 \r
 **/\r
-EFI_STATUS\r
+CHAR8*\r
 EFIAPI\r
 ConvertIso639LanguageToRfc3066Language (\r
-  IN  CONST CHAR8   *LanguageIso639,\r
-  OUT CHAR8         *LanguageRfc3066\r
+  IN  CONST CHAR8   *LanguageIso639\r
   )\r
 {\r
   UINTN Index;\r
+  CHAR8 *Rfc3066Language;\r
   \r
   for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
     if (CompareMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3) == 0) {\r
-      CopyMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
-      return EFI_SUCCESS;\r
+      Rfc3066Language = AllocateZeroPool (3);\r
+      if (Rfc3066Language != NULL) {\r
+        Rfc3066Language = CopyMem (Rfc3066Language, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
+      }\r
+      return Rfc3066Language;\r
     }\r
   }\r
 \r
-  return EFI_NOT_FOUND;\r
+  return NULL;\r
 }\r
 \r
 /**\r
@@ -575,15 +586,25 @@ Rfc3066ToIso639 (
   CHAR8       *Languages;\r
   CHAR8       *ReturnValue;\r
   CHAR8       *LangCodes;\r
-  CHAR8       LangRfc3066[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       *LangRfc3066;\r
   CHAR8       LangIso639[ISO_639_2_ENTRY_SIZE];\r
+  UINTN       LanguageSize;\r
   EFI_STATUS  Status;\r
 \r
-  ReturnValue = AllocateZeroPool (AsciiStrSize (SupportedLanguages));\r
+  LanguageSize = AsciiStrSize (SupportedLanguages);\r
+  ReturnValue = AllocateZeroPool (LanguageSize);\r
   if (ReturnValue == NULL) {\r
     return ReturnValue;\r
   }\r
 \r
+  //\r
+  // Allocate working buffer to contain substring in SupportedLanguages;\r
+  //\r
+  LangRfc3066 = AllocatePool (LanguageSize);\r
+  if (LangRfc3066 == NULL) {\r
+    FreePool (ReturnValue);\r
+    return NULL;\r
+  }\r
   Languages = ReturnValue;\r
   LangCodes = SupportedLanguages;\r
   while (*LangCodes != 0) {\r
@@ -596,6 +617,7 @@ Rfc3066ToIso639 (
     }\r
   }\r
 \r
+  FreePool (LangRfc3066);\r
   return ReturnValue;\r
 }\r
 \r