]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
MdeModulePkg/PartitionDxe: Add already start check for child hanldes
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / ProcessOptions.c
index 6e9e6ddfcc9637856b5a3746870cef535767454f..e7306f6d04fca92ce294667fd43f4a50efc4eed8 100644 (file)
@@ -2,14 +2,8 @@
 Implementation for handling the User Interface option processing.\r
 \r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2020, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -21,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
   Concatenate a narrow string to another string.\r
 \r
   @param Destination The destination string.\r
+  @param DestMax     The Max length of destination string.\r
   @param Source      The source string. The string to be concatenated.\r
                      to the end of Destination.\r
 \r
@@ -28,6 +23,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 VOID\r
 NewStrCat (\r
   IN OUT CHAR16               *Destination,\r
+  IN     UINTN                DestMax,\r
   IN     CHAR16               *Source\r
   )\r
 {\r
@@ -45,7 +41,7 @@ NewStrCat (
   Destination[Length] = NARROW_CHAR;\r
   Length++;\r
 \r
-  StrCpy (Destination + Length, Source);\r
+  StrCpyS (Destination + Length, DestMax - Length, Source);\r
 }\r
 \r
 /**\r
@@ -100,8 +96,8 @@ HiiValueToUINT64 (
 \r
 /**\r
   Check whether this value type can be transfer to EFI_IFR_TYPE_BUFFER type.\r
-  \r
-  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to \r
+\r
+  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to\r
   EFI_IFR_TYPE_BUFFER when do the value compare.\r
 \r
   @param  Value                  Expression value to compare on.\r
@@ -156,8 +152,8 @@ IsTypeInUINT64 (
 \r
 /**\r
   Return the buffer length and buffer pointer for this value.\r
-  \r
-  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to \r
+\r
+  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to\r
   EFI_IFR_TYPE_BUFFER when do the value compare.\r
 \r
   @param  Value                  Expression value to compare on.\r
@@ -283,7 +279,7 @@ CompareHiiValue (
       *Result = Buf1Len > Buf2Len ? 1 : -1;\r
     }\r
     return EFI_SUCCESS;\r
-  }  \r
+  }\r
 \r
   //\r
   // Take remain types(integer, boolean, date/time) as integer\r
@@ -331,7 +327,7 @@ ValueToOption (
     ZeroMem (&Value, sizeof (EFI_HII_VALUE));\r
     Value.Type = Option->OptionOpCode->Type;\r
     CopyMem (&Value.Value, &Option->OptionOpCode->Value, Option->OptionOpCode->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
-    \r
+\r
     if ((CompareHiiValue (&Value, OptionValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
       return Option;\r
     }\r
@@ -439,12 +435,12 @@ SetArrayData (
   @param  Type                   Type of the data in this array.\r
   @param  Value                  The value to be find.\r
   @param  Index                  The index in the array which has same value with Value.\r
-  \r
+\r
   @retval   TRUE Found the value in the array.\r
   @retval   FALSE Not found the value.\r
 \r
 **/\r
-BOOLEAN \r
+BOOLEAN\r
 FindArrayData (\r
   IN VOID                     *Array,\r
   IN UINT8                    Type,\r
@@ -455,7 +451,7 @@ FindArrayData (
   UINTN  Count;\r
   UINT64 TmpValue;\r
   UINT64 ValueComp;\r
-  \r
+\r
   ASSERT (Array != NULL);\r
 \r
   Count    = 0;\r
@@ -566,7 +562,6 @@ PrintFormattedNumber (
 \r
   default:\r
     return EFI_UNSUPPORTED;\r
-    break;\r
   }\r
 \r
   UnicodeSPrint (FormattedNumber, BufferSize, Format, Value);\r
@@ -803,7 +798,7 @@ PasswordProcess (
 \r
   StringPtr = AllocateZeroPool ((Maximum + 1) * sizeof (CHAR16));\r
   ASSERT (StringPtr);\r
-  \r
+\r
   //\r
   // Use a NULL password to test whether old password is required\r
   //\r
@@ -811,8 +806,13 @@ PasswordProcess (
   Status = Question->PasswordCheck (gFormData, Question, StringPtr);\r
   if (Status == EFI_NOT_AVAILABLE_YET || Status == EFI_UNSUPPORTED) {\r
     //\r
-    // Password can't be set now. \r
+    // Password can't be set now.\r
     //\r
+    if (Status == EFI_UNSUPPORTED) {\r
+      do {\r
+        CreateDialog (&Key, gEmptyString, gPasswordUnsupported, gPressEnter, gEmptyString, NULL);\r
+      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+    }\r
     FreePool (StringPtr);\r
     return EFI_SUCCESS;\r
   }\r
@@ -823,6 +823,7 @@ PasswordProcess (
     //\r
     Status = ReadString (MenuOption, gPromptForPassword, StringPtr);\r
     if (EFI_ERROR (Status)) {\r
+      ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
       FreePool (StringPtr);\r
       return Status;\r
     }\r
@@ -840,12 +841,12 @@ PasswordProcess (
       } else {\r
         Status = EFI_SUCCESS;\r
       }\r
-\r
+      ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
       FreePool (StringPtr);\r
       return Status;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Ask for new password\r
   //\r
@@ -856,10 +857,11 @@ PasswordProcess (
     // Reset state machine for password\r
     //\r
     Question->PasswordCheck (gFormData, Question, NULL);\r
+    ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
     FreePool (StringPtr);\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Confirm new password\r
   //\r
@@ -871,37 +873,29 @@ PasswordProcess (
     // Reset state machine for password\r
     //\r
     Question->PasswordCheck (gFormData, Question, NULL);\r
+    ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
+    ZeroMem (TempString, (Maximum + 1) * sizeof (CHAR16));\r
     FreePool (StringPtr);\r
     FreePool (TempString);\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Compare two typed-in new passwords\r
   //\r
-  if (StrCmp (StringPtr, TempString) == 0) {     \r
+  if (StrCmp (StringPtr, TempString) == 0) {\r
     gUserInput->InputValue.Buffer = AllocateCopyPool (Question->CurrentValue.BufferLen, StringPtr);\r
     gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
     gUserInput->InputValue.Type = Question->CurrentValue.Type;\r
     gUserInput->InputValue.Value.string = HiiSetString(gFormData->HiiHandle, gUserInput->InputValue.Value.string, StringPtr, NULL);\r
-    FreePool (StringPtr); \r
 \r
     Status = EFI_SUCCESS;\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      //\r
-      // Reset state machine for password\r
-      //\r
-      Question->PasswordCheck (gFormData, Question, NULL);\r
-    }\r
-\r
-    return Status;\r
   } else {\r
     //\r
     // Reset state machine for password\r
     //\r
     Question->PasswordCheck (gFormData, Question, NULL);\r
-  \r
+\r
     //\r
     // Two password mismatch, prompt error message\r
     //\r
@@ -911,7 +905,8 @@ PasswordProcess (
 \r
     Status = EFI_INVALID_PARAMETER;\r
   }\r
-  \r
+  ZeroMem (TempString, (Maximum + 1) * sizeof (CHAR16));\r
+  ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
   FreePool (TempString);\r
   FreePool (StringPtr);\r
 \r
@@ -957,6 +952,7 @@ ProcessOptions (
   UINT8                           ValueType;\r
   EFI_IFR_ORDERED_LIST            *OrderList;\r
   BOOLEAN                         ValueInvalid;\r
+  UINTN                           MaxLen;\r
 \r
   Status        = EFI_SUCCESS;\r
 \r
@@ -999,7 +995,8 @@ ProcessOptions (
       // We now know how many strings we will have, so we can allocate the\r
       // space required for the array or strings.\r
       //\r
-      *OptionString = AllocateZeroPool (OrderList->MaxContainers * BufferSize);\r
+      MaxLen = OrderList->MaxContainers * BufferSize / sizeof (CHAR16);\r
+      *OptionString = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
       ASSERT (*OptionString);\r
 \r
       HiiValue.Type = ValueType;\r
@@ -1034,13 +1031,13 @@ ProcessOptions (
           // Exit current DisplayForm with new value.\r
           //\r
           gUserInput->SelectedStatement = Question;\r
-          \r
+          gMisMatch = TRUE;\r
           ValueArray = AllocateZeroPool (Question->CurrentValue.BufferLen);\r
           ASSERT (ValueArray != NULL);\r
           gUserInput->InputValue.Buffer    = ValueArray;\r
           gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
           gUserInput->InputValue.Type      = Question->CurrentValue.Type;\r
-          \r
+\r
           Link = GetFirstNode (&Question->OptionListHead);\r
           Index2 = 0;\r
           while (!IsNull (&Question->OptionListHead, Link) && Index2 < OrderList->MaxContainers) {\r
@@ -1057,14 +1054,14 @@ ProcessOptions (
         }\r
 \r
         Character[0] = LEFT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
         ASSERT (StringPtr != NULL);\r
-        NewStrCat (OptionString[0], StringPtr);\r
+        NewStrCat (OptionString[0], MaxLen, StringPtr);\r
         Character[0] = RIGHT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         Character[0] = CHAR_CARRIAGE_RETURN;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         FreePool (StringPtr);\r
       }\r
 \r
@@ -1092,14 +1089,14 @@ ProcessOptions (
           // Not report error, just get the correct option string info.\r
           //\r
           Character[0] = LEFT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
           ASSERT (StringPtr != NULL);\r
-          NewStrCat (OptionString[0], StringPtr);\r
+          NewStrCat (OptionString[0], MaxLen, StringPtr);\r
           Character[0] = RIGHT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           Character[0] = CHAR_CARRIAGE_RETURN;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           FreePool (StringPtr);\r
 \r
           continue;\r
@@ -1119,14 +1116,14 @@ ProcessOptions (
           // Exit current DisplayForm with new value.\r
           //\r
           gUserInput->SelectedStatement = Question;\r
-          \r
+          gMisMatch = TRUE;\r
           ValueArray = AllocateCopyPool (Question->CurrentValue.BufferLen, Question->CurrentValue.Buffer);\r
           ASSERT (ValueArray != NULL);\r
           gUserInput->InputValue.Buffer    = ValueArray;\r
           gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
           gUserInput->InputValue.Type      = Question->CurrentValue.Type;\r
         }\r
-       \r
+\r
         SetArrayData (ValueArray, ValueType, Index++, OneOfOption->OptionOpCode->Value.u64);\r
       }\r
 \r
@@ -1151,6 +1148,7 @@ ProcessOptions (
       //\r
       Status = GetSelectionInputPopUp (MenuOption);\r
     } else {\r
+      MaxLen = BufferSize / sizeof(CHAR16);\r
       *OptionString = AllocateZeroPool (BufferSize);\r
       ASSERT (*OptionString);\r
 \r
@@ -1159,7 +1157,7 @@ ProcessOptions (
         if (SkipErrorValue) {\r
           //\r
           // Not report error, just get the correct option string info.\r
-          //          \r
+          //\r
           Link = GetFirstNode (&Question->OptionListHead);\r
           OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
         } else {\r
@@ -1196,7 +1194,7 @@ ProcessOptions (
             break;\r
           }\r
           gUserInput->SelectedStatement = Question;\r
-\r
+          gMisMatch = TRUE;\r
           FreePool (*OptionString);\r
           *OptionString = NULL;\r
           return EFI_NOT_FOUND;\r
@@ -1204,12 +1202,12 @@ ProcessOptions (
       }\r
 \r
       Character[0] = LEFT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
+      NewStrCat (OptionString[0], MaxLen, Character);\r
       StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
       ASSERT (StringPtr != NULL);\r
-      NewStrCat (OptionString[0], StringPtr);\r
+      NewStrCat (OptionString[0], MaxLen, StringPtr);\r
       Character[0] = RIGHT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
+      NewStrCat (OptionString[0], MaxLen, Character);\r
 \r
       FreePool (StringPtr);\r
     }\r
@@ -1227,7 +1225,7 @@ ProcessOptions (
       // Perform inconsistent check\r
       //\r
       return EFI_SUCCESS;\r
-    } else {    \r
+    } else {\r
       *OptionString = AllocateZeroPool (BufferSize);\r
       ASSERT (*OptionString);\r
 \r
@@ -1278,19 +1276,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        if (QuestionValue->Value.date.Month == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        }\r
         *(OptionString[0] + 3) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        if (QuestionValue->Value.date.Day == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        }\r
         *(OptionString[0] + 6) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        if (QuestionValue->Value.date.Year == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"????");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        }\r
         *(OptionString[0] + 11) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
@@ -1310,19 +1320,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        if (QuestionValue->Value.time.Hour == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        }\r
         *(OptionString[0] + 3) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        if (QuestionValue->Value.time.Minute == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        }\r
         *(OptionString[0] + 6) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        if (QuestionValue->Value.time.Second == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        }\r
         *(OptionString[0] + 9) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
@@ -1340,7 +1362,7 @@ ProcessOptions (
         FreePool (StringPtr);\r
         return Status;\r
       }\r
-      \r
+\r
       gUserInput->InputValue.Buffer = AllocateCopyPool (Question->CurrentValue.BufferLen, StringPtr);\r
       gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
       gUserInput->InputValue.Type = Question->CurrentValue.Type;\r
@@ -1442,5 +1464,5 @@ ProcessHelpString (
     FreePool (OutputString);\r
   }\r
 \r
-  return TotalRowNum; \r
+  return TotalRowNum;\r
 }\r