]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Fix a bug about the iSCSI DHCP dependency issue.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
index 98754ec544735e84f40876a2f79a5a0d9834f74f..4c4411fabb9328d49deeab941517aa1874bf6cd1 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2008 - 2010, 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
@@ -25,6 +25,15 @@ BOOLEAN          mInScopeGrayOut;
 EFI_GUID  mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
 extern EFI_GUID mTianoHiiIfrGuid;\r
 \r
+/**\r
+  Find the question's OneOfOptionMap list in FormSet \r
+  based on the input question Id. \r
+  \r
+  @param FormSet     FormSet context.\r
+  @param QuestionId  Unique ID to specicy the question in FormSet.\r
+  \r
+  @return the found OneOfOptionMap list. If not found, NULL will return.\r
+**/\r
 LIST_ENTRY *\r
 GetOneOfOptionMapEntryListHead (\r
   IN CONST FORM_BROWSER_FORMSET  *FormSet,\r
@@ -47,6 +56,12 @@ GetOneOfOptionMapEntryListHead (
   return NULL;\r
 }\r
 \r
+/**\r
+  Free OneOfOption map list.\r
+  \r
+  @param OneOfOptionMapListHead Pointer to list header of OneOfOptionMap list.\r
+\r
+**/\r
 VOID\r
 DestoryOneOfOptionMap (\r
   IN LIST_ENTRY     *OneOfOptionMapListHead\r
@@ -209,6 +224,7 @@ CreateStorage (
   FORMSET_STORAGE  *Storage;\r
 \r
   Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+  ASSERT (Storage != NULL);\r
   Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
   InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
 \r
@@ -556,7 +572,7 @@ ParseOpCodes (
     //\r
     // If scope bit set, push onto scope stack\r
     //\r
-    if (Scope) {\r
+    if (Scope != 0) {\r
       PushScope (Operand);\r
     }\r
 \r
@@ -586,6 +602,7 @@ ParseOpCodes (
       // Create a new Form for this FormSet\r
       //\r
       CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+      ASSERT (CurrentForm != NULL);\r
       CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
 \r
       InitializeListHead (&CurrentForm->StatementListHead);\r
@@ -604,6 +621,7 @@ ParseOpCodes (
       // Create a new Form Map for this FormSet\r
       //\r
       CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+      ASSERT (CurrentForm != NULL);\r
       CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
 \r
       InitializeListHead (&CurrentForm->StatementListHead);\r
@@ -701,6 +719,7 @@ ParseOpCodes (
     //\r
     case EFI_IFR_DEFAULTSTORE_OP:\r
       DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
+      ASSERT (DefaultStore != NULL);\r
       DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
 \r
       CopyMem (&DefaultStore->DefaultId,   &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId,   sizeof (UINT16));\r
@@ -717,15 +736,17 @@ ParseOpCodes (
     //\r
     case EFI_IFR_SUBTITLE_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
 \r
-      if (Scope) {\r
+      if (Scope != 0) {\r
         mInScopeSubtitle = TRUE;\r
       }\r
       break;\r
 \r
     case EFI_IFR_TEXT_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
       break;\r
@@ -735,6 +756,7 @@ ParseOpCodes (
     //\r
     case EFI_IFR_ACTION_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
         //\r
@@ -748,11 +770,13 @@ ParseOpCodes (
 \r
     case EFI_IFR_RESET_BUTTON_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
       CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
       break;\r
 \r
     case EFI_IFR_REF_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
       if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
@@ -771,6 +795,7 @@ ParseOpCodes (
     case EFI_IFR_ONE_OF_OP:\r
     case EFI_IFR_NUMERIC_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
       Value = &CurrentStatement->HiiValue;\r
@@ -780,7 +805,7 @@ ParseOpCodes (
         CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
         CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
         CurrentStatement->Step    = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
-        CurrentStatement->StorageWidth = sizeof (UINT8);\r
+        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
         Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
         break;\r
 \r
@@ -788,7 +813,7 @@ ParseOpCodes (
         CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
         CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
         CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step,     sizeof (UINT16));\r
-        CurrentStatement->StorageWidth = sizeof (UINT16);\r
+        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
         Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
         break;\r
 \r
@@ -796,7 +821,7 @@ ParseOpCodes (
         CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
         CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
         CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step,     sizeof (UINT32));\r
-        CurrentStatement->StorageWidth = sizeof (UINT32);\r
+        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
         Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
         break;\r
 \r
@@ -804,7 +829,7 @@ ParseOpCodes (
         CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
         CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
         CopyMem (&CurrentStatement->Step,    &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step,     sizeof (UINT64));\r
-        CurrentStatement->StorageWidth = sizeof (UINT64);\r
+        CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
         Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
         break;\r
 \r
@@ -820,6 +845,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_ORDERED_LIST_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
       CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
@@ -837,15 +863,17 @@ ParseOpCodes (
 \r
     case EFI_IFR_CHECKBOX_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
-      CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
+      CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
 \r
       break;\r
 \r
     case EFI_IFR_STRING_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       //\r
       // MinSize is the minimum number of characters that can be accepted for this opcode,\r
@@ -864,6 +892,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_PASSWORD_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       //\r
       // MinSize is the minimum number of characters that can be accepted for this opcode,\r
@@ -881,6 +910,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_DATE_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
@@ -889,6 +919,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_TIME_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
@@ -905,6 +936,7 @@ ParseOpCodes (
       // A Question may have more than one Default value which have different default types.\r
       //\r
       CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
+      ASSERT (CurrentDefault != NULL);\r
       CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
 \r
       CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
@@ -928,6 +960,7 @@ ParseOpCodes (
       // It create a selection for use in current Question.\r
       //\r
       CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
+      ASSERT (CurrentOption != NULL);\r
       CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
 \r
       CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
@@ -999,10 +1032,17 @@ ParseOpCodes (
         break;\r
 \r
       default:\r
+        //\r
+        // Make sure CurrentStatement is not NULL.\r
+        // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+        // file is wrongly generated by tools such as VFR Compiler.\r
+        //\r
+        ASSERT (CurrentStatement != NULL);\r
         ImageId = &CurrentStatement->ImageId;\r
         break;\r
       }\r
-\r
+      \r
+      ASSERT (ImageId != NULL);\r
       CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
       break;\r
 \r
@@ -1010,6 +1050,7 @@ ParseOpCodes (
     // Refresh\r
     //\r
     case EFI_IFR_REFRESH_OP:\r
+      ASSERT (CurrentStatement != NULL);\r
       CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
       break;\r
 \r