]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix deadloop issue in BrowserCallback function.
authorEric Dong <eric.dong@intel.com>
Tue, 24 Sep 2013 10:08:04 +0000 (10:08 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 24 Sep 2013 10:08:04 +0000 (10:08 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14711 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

index ac7dce694be096a3409abbf8f99e975cf82f5602..4006fcd6fc80ed4a6de56f48caee6e7d6b3f4e01 100644 (file)
@@ -510,10 +510,6 @@ CreateStorage (
 \r
     InitializeConfigHdr (FormSet, BrowserStorage);\r
   }\r
-  //\r
-  // Add count because one formset storage use this global storage.\r
-  //\r
-  BrowserStorage->ReferenceCount++;\r
 \r
   Storage->BrowserStorage = BrowserStorage;\r
   Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);\r
@@ -742,12 +738,6 @@ DestroyStorage (
     FreePool (Storage->ConfigRequest);\r
   }\r
 \r
-  //\r
-  // Minus the reference to the global storage.\r
-  //\r
-  ASSERT (Storage->BrowserStorage->ReferenceCount > 0);\r
-  Storage->BrowserStorage->ReferenceCount--; \r
-\r
   FreePool (Storage);\r
 }\r
 \r
index 63f86809faf5d8677f86c394335c269aaa79f69c..7cba785a8822d7d5e799c8be17a51446ffbb6faa 100644 (file)
@@ -53,6 +53,7 @@ BOOLEAN               gExitRequired;
 BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;\r
 BOOLEAN               mBrowserScopeFirstSet = TRUE;\r
 EXIT_HANDLER          ExitHandlerFunction = NULL;\r
+FORM_BROWSER_FORMSET  *mSystemLevelFormSet;\r
 \r
 //\r
 // Browser Global Strings\r
@@ -255,6 +256,9 @@ LoadAllHiiFormset (
   UINTN                   Index;\r
   EFI_GUID                ZeroGuid;\r
   EFI_STATUS              Status;\r
+  FORM_BROWSER_FORMSET    *OldFormset;\r
+\r
+  OldFormset = mSystemLevelFormSet;\r
 \r
   //\r
   // Get all the Hii handles\r
@@ -278,6 +282,8 @@ LoadAllHiiFormset (
     //\r
     LocalFormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));\r
     ASSERT (LocalFormSet != NULL);\r
+    mSystemLevelFormSet = LocalFormSet;\r
+\r
     ZeroMem (&ZeroGuid, sizeof (ZeroGuid));\r
     Status = InitializeFormSet (HiiHandles[Index], &ZeroGuid, LocalFormSet);\r
     if (EFI_ERROR (Status) || IsListEmpty (&LocalFormSet->FormListHead)) {\r
@@ -300,6 +306,8 @@ LoadAllHiiFormset (
   // Free resources, and restore gOldFormSet and gClassOfVfr\r
   //\r
   FreePool (HiiHandles);\r
+\r
+  mSystemLevelFormSet = OldFormset;\r
 }\r
 \r
 /**\r
@@ -388,6 +396,7 @@ SendForm (
         break;\r
       }\r
       Selection->FormSet = FormSet;\r
+      mSystemLevelFormSet = FormSet;\r
 \r
       //\r
       // Display this formset\r
@@ -397,6 +406,7 @@ SendForm (
       Status = SetupBrowser (Selection);\r
 \r
       gCurrentSelection = NULL;\r
+      mSystemLevelFormSet = NULL;\r
 \r
       //\r
       // If no data is changed, don't need to save current FormSet into the maintain list.\r
@@ -580,7 +590,6 @@ BrowserCallback (
   LIST_ENTRY            *Link;\r
   BROWSER_STORAGE       *Storage;\r
   FORMSET_STORAGE       *FormsetStorage;\r
-  FORM_BROWSER_FORMSET  *FormSet;\r
   UINTN                 TotalSize;\r
   BOOLEAN               Found;\r
 \r
@@ -650,16 +659,15 @@ BrowserCallback (
     //\r
     // GUID/Name is not specified, take the first storage in FormSet\r
     //\r
-    if (gCurrentSelection == NULL) {\r
+    if (mSystemLevelFormSet == NULL) {\r
       return EFI_NOT_READY;\r
     }\r
 \r
     //\r
     // Generate <ConfigResp>\r
     //\r
-    FormSet = gCurrentSelection->FormSet;\r
-    Link = GetFirstNode (&FormSet->StorageListHead);\r
-    if (IsNull (&FormSet->StorageListHead, Link)) {\r
+    Link = GetFirstNode (&mSystemLevelFormSet->StorageListHead);\r
+    if (IsNull (&mSystemLevelFormSet->StorageListHead, Link)) {\r
       return EFI_UNSUPPORTED;\r
     }\r
 \r
@@ -2361,7 +2369,8 @@ DiscardForm (
   LIST_ENTRY                   *Link;\r
   FORMSET_STORAGE              *Storage;\r
   FORM_BROWSER_CONFIG_REQUEST  *ConfigInfo;\r
-  FORM_BROWSER_FORMSET    *LocalFormSet;\r
+  FORM_BROWSER_FORMSET         *LocalFormSet;\r
+  FORM_BROWSER_FORMSET         *OldFormSet;\r
 \r
   //\r
   // Check the supported setting level.\r
@@ -2440,7 +2449,8 @@ DiscardForm (
     //\r
     // System Level Discard.\r
     //\r
-    \r
+    OldFormSet = mSystemLevelFormSet;\r
+\r
     //\r
     // Discard changed value for each FormSet in the maintain list.\r
     //\r
@@ -2451,6 +2461,9 @@ DiscardForm (
       if (!ValidateFormSet(LocalFormSet)) {\r
         continue;\r
       }\r
+\r
+      mSystemLevelFormSet = LocalFormSet;\r
+\r
       DiscardForm (LocalFormSet, NULL, FormSetLevel);\r
       if (!IsHiiHandleInBrowserContext (LocalFormSet->HiiHandle)) {\r
         //\r
@@ -2461,6 +2474,8 @@ DiscardForm (
         DestroyFormSet (LocalFormSet);\r
       }\r
     }\r
+\r
+    mSystemLevelFormSet = OldFormSet;\r
   }\r
 \r
   return EFI_SUCCESS;  \r
@@ -3402,6 +3417,7 @@ ExtractDefault (
   LIST_ENTRY              *Link;\r
   FORM_BROWSER_STATEMENT  *Question;\r
   FORM_BROWSER_FORMSET    *LocalFormSet;\r
+  FORM_BROWSER_FORMSET    *OldFormSet;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -3485,7 +3501,9 @@ ExtractDefault (
     // Preload all Hii formset.\r
     //\r
     LoadAllHiiFormset();\r
-       \r
+\r
+    OldFormSet = mSystemLevelFormSet;\r
+\r
     //\r
     // Set Default Value for each FormSet in the maintain list.\r
     //\r
@@ -3496,8 +3514,13 @@ ExtractDefault (
       if (!ValidateFormSet(LocalFormSet)) {\r
         continue;\r
       }\r
+\r
+      mSystemLevelFormSet = LocalFormSet;\r
+\r
       ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
     }\r
+\r
+    mSystemLevelFormSet = OldFormSet;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -4210,7 +4233,7 @@ LoadStorage (
       return;\r
 \r
     case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
-      if (Storage->BrowserStorage->ReferenceCount > 1) {\r
+      if (Storage->BrowserStorage->ConfigRequest != NULL) {\r
         ConfigRequestAdjust(Storage);\r
         return;\r
       }\r
@@ -4311,6 +4334,17 @@ InitializeCurrentSetting (
   FORMSET_STORAGE         *Storage;\r
   FORM_BROWSER_FORMSET    *OldFormSet;\r
 \r
+  //\r
+  // Try to find pre FormSet in the maintain backup list.\r
+  // If old formset != NULL, destroy this formset. Add new formset to gBrowserFormSetList.\r
+  //\r
+  OldFormSet = GetFormSetFromHiiHandle (FormSet->HiiHandle);\r
+  if (OldFormSet != NULL) {\r
+    RemoveEntryList (&OldFormSet->Link);\r
+    DestroyFormSet (OldFormSet);\r
+  }\r
+  InsertTailList (&gBrowserFormSetList, &FormSet->Link);\r
+\r
   //\r
   // Extract default from IFR binary for no storage questions.\r
   //  \r
@@ -4327,17 +4361,6 @@ InitializeCurrentSetting (
 \r
     Link = GetNextNode (&FormSet->StorageListHead, Link);\r
   }\r
-\r
-  //\r
-  // Try to find pre FormSet in the maintain backup list.\r
-  // If old formset != NULL, destroy this formset. Add new formset to gBrowserFormSetList.\r
-  //\r
-  OldFormSet = GetFormSetFromHiiHandle (FormSet->HiiHandle);\r
-  if (OldFormSet != NULL) {\r
-    RemoveEntryList (&OldFormSet->Link);\r
-    DestroyFormSet (OldFormSet);\r
-  }\r
-  InsertTailList (&gBrowserFormSetList, &FormSet->Link);\r
 }\r
 \r
 \r
index bd19ae6cb73c77bfd7b805bcfd3ac1c0f3a5a383..7da21b713c4ae88f722315945008f932d806fd09 100644 (file)
@@ -151,7 +151,6 @@ typedef struct {
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
                                    // <RequestElement> includes all fields which is used by current form sets.\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
-  UINT8            ReferenceCount; // How many form set storage refrence this storage.\r
 } BROWSER_STORAGE;\r
 \r
 #define BROWSER_STORAGE_FROM_LINK(a)  CR (a, BROWSER_STORAGE, Link, BROWSER_STORAGE_SIGNATURE)\r