]> git.proxmox.com Git - mirror_edk2.git/commitdiff
K8:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 20 Jan 2009 02:00:46 +0000 (02:00 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 20 Jan 2009 02:00:46 +0000 (02:00 +0000)
1) Add in "check-for-null" before dereferencing a pointer.
2) unify the handling of EFI_OUT_OF_RESOURCE case.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7310 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
MdeModulePkg/Library/ExtendedIfrSupportLib/Form.c
MdeModulePkg/Library/UefiHiiLib/HiiLib.c
MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrForm.c

index 56f2b79a7145cabd6013e783f8bbee41d697baac..3853a2ec1d8a77b76fb7a2fb15a3afeacece38d6 100644 (file)
@@ -100,14 +100,19 @@ IfrLibExtractClassFromHiiHandle (
   BufferSize = 0;\r
   HiiPackageList = NULL;\r
   Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  //\r
+  // Handle is a invalid handle. Check if Handle is corrupted.\r
+  //\r
   ASSERT (Status != EFI_NOT_FOUND);\r
+  //\r
+  // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+  //\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
   \r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocatePool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
+  HiiPackageList = AllocatePool (BufferSize);\r
+  ASSERT (HiiPackageList != NULL);\r
 \r
-    Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  }\r
+  Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
index 7f7af9cc0c27b6d25987e5aecaa361f937f05d1e..793efdf87849675129f9047f2c756434bebe1983 100644 (file)
@@ -376,15 +376,21 @@ IfrLibUpdateForm (
   BufferSize = 0;\r
   HiiPackageList   = NULL;\r
   Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocatePool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
+  //\r
+  // Handle is a invalid handle. Check if Handle is corrupted.\r
+  //\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  //\r
+  // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+  //\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+  HiiPackageList = AllocatePool (BufferSize);\r
+  ASSERT (HiiPackageList != NULL);\r
 \r
-    Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-    if (EFI_ERROR (Status)) {\r
-      FreePool (HiiPackageList);\r
-      return Status;\r
-    }\r
+  Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (HiiPackageList);\r
+    return Status;\r
   }\r
 \r
   //\r
index f5544d9fce21982e6fd4684bb1fc148551d2a507..83e33d2a6ee67b7501df037fe0a83ab93dba2a27 100644 (file)
@@ -281,13 +281,13 @@ HiiLibGetHiiHandles (
   OUT    EFI_HII_HANDLE            **HiiHandleBuffer\r
   )\r
 {\r
-  UINTN       BufferLength;\r
   EFI_STATUS  Status;\r
 \r
   ASSERT (HandleBufferLength != NULL);\r
   ASSERT (HiiHandleBuffer != NULL);\r
 \r
-  BufferLength = 0;\r
+  *HandleBufferLength = 0;\r
+  *HiiHandleBuffer = NULL;\r
 \r
   //\r
   // Try to find the actual buffer size for HiiHandle Buffer.\r
@@ -296,27 +296,26 @@ HiiLibGetHiiHandles (
                                  mHiiDatabaseProt,\r
                                  EFI_HII_PACKAGE_TYPE_ALL,\r
                                  NULL,\r
-                                 &BufferLength,\r
+                                 HandleBufferLength,\r
                                  *HiiHandleBuffer\r
                                  );\r
-\r
+  \r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
+      *HiiHandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
       ASSERT (*HiiHandleBuffer != NULL);\r
       Status = mHiiDatabaseProt->ListPackageLists (\r
                                      mHiiDatabaseProt,\r
                                      EFI_HII_PACKAGE_TYPE_ALL,\r
                                      NULL,\r
-                                     &BufferLength,\r
+                                     HandleBufferLength,\r
                                      *HiiHandleBuffer\r
                                      );\r
-      //\r
-      // we should not fail here.\r
-      //\r
-      ASSERT_EFI_ERROR (Status);\r
-  }\r
 \r
-  *HandleBufferLength = BufferLength;\r
+      if (EFI_ERROR (Status)) {\r
+        FreePool (*HiiHandleBuffer);\r
+        *HiiHandleBuffer = NULL;\r
+      }\r
+  }\r
 \r
   return Status;\r
 }\r
index fb023c39949984f5ce43c4a6b4e7888a8f76d7fd..bfca72ec30d61c6759f79d482c101a9b891e27fd 100644 (file)
@@ -342,10 +342,10 @@ ExtractBlockName (
   //                 |   8  | 4 |  7   | 4 |\r
   //\r
   StringPtr = AllocateZeroPool ((BlockNameNumber * (8 + 4 + 7 + 4) + 1) * sizeof (CHAR16));\r
-  *BlockName = StringPtr;\r
   if (StringPtr == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+  *BlockName = StringPtr;\r
 \r
   Buffer += sizeof (UINT32);\r
   for (Index = 0; Index < BlockNameNumber; Index++) {\r
@@ -522,6 +522,13 @@ ConstructConfigAltResp (
   if (ConfigAltResp == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+  \r
+  DescHdr = NULL;\r
+  StringPtr = NULL;\r
+  AltCfg    = NULL;\r
+  ConfigResp = NULL;\r
+  BlockName = NULL;\r
+  NeedFreeConfigRequest = FALSE;\r
 \r
   //\r
   // Construct <ConfigHdr> : "GUID=...&NAME=...&PATH=..."\r
@@ -535,39 +542,47 @@ ConstructConfigAltResp (
              Name,\r
              DriverHandle\r
              );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    ConfigHdr = AllocateZeroPool (StrBufferLen);\r
-    Status = ConstructConfigHdr (\r
-               ConfigHdr,\r
-               &StrBufferLen,\r
-               Guid,\r
-               Name,\r
-               DriverHandle\r
-               );\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+  ConfigHdr = AllocateZeroPool (StrBufferLen);\r
+  if (ConfigHdr == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Exit;\r
   }\r
+  Status = ConstructConfigHdr (\r
+             ConfigHdr,\r
+             &StrBufferLen,\r
+             Guid,\r
+             Name,\r
+             DriverHandle\r
+             );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   //\r
   // Construct <ConfigResp>\r
   //\r
-  NeedFreeConfigRequest = FALSE;\r
   if (ConfigRequest == NULL) {\r
     //\r
     // If ConfigRequest is set to NULL, export all configurable elements in BlockNameArray\r
     //\r
     Status = ExtractBlockName (BlockNameArray, &BlockName);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Exit;\r
     }\r
     \r
     Len = StrSize (ConfigHdr);\r
     ConfigRequest = AllocateZeroPool (Len + StrSize (BlockName) - sizeof (CHAR16));\r
+    if (ConfigRequest == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Exit;\r
+    }\r
+    \r
     StrCpy (ConfigRequest, ConfigHdr);\r
     StrCat (ConfigRequest, BlockName);\r
     NeedFreeConfigRequest = TRUE;\r
+\r
   }\r
 \r
   Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
@@ -587,36 +602,48 @@ ConstructConfigAltResp (
     return Status;\r
   }\r
 \r
+  AltRespLen = 0;\r
   //\r
   // Construct <AltResp>\r
   //\r
-  DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
-  StringPtr = DescHdr;\r
-  AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
-  AltRespLen = 0;\r
-  VA_START (Args, NumberAltCfg);\r
-  for (Index = 0; Index < NumberAltCfg; Index++) {\r
-    AltCfgId = (UINT16) VA_ARG (Args, UINT16);\r
-    DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *);\r
-\r
-    //\r
-    // '&' <ConfigHdr>\r
-    //\r
-    AltRespLen += (StrLen (ConfigHdr) + 1);\r
-\r
-    StringPtr = DescHdr + Index * 16;\r
-    StrCpy (StringPtr, L"&ALTCFG=");\r
-    AltRespLen += (8 + sizeof (UINT16) * 2);\r
+  if (NumberAltCfg > 0) {\r
+    DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
+    if (DescHdr == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Exit;\r
+    }\r
+    \r
+    StringPtr = DescHdr;\r
+    AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
+    if (AltCfg == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Exit;\r
+    }\r
 \r
-    StrBufferLen = 5;\r
-    BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16));\r
-    Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    VA_START (Args, NumberAltCfg);\r
+    for (Index = 0; Index < NumberAltCfg; Index++) {\r
+      AltCfgId = (UINT16) VA_ARG (Args, UINT16);\r
+      DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *);\r
+    \r
+      //\r
+      // '&' <ConfigHdr>\r
+      //\r
+      AltRespLen += (StrLen (ConfigHdr) + 1);\r
+    \r
+      StringPtr = DescHdr + Index * 16;\r
+      StrCpy (StringPtr, L"&ALTCFG=");\r
+      AltRespLen += (8 + sizeof (UINT16) * 2);\r
+    \r
+      StrBufferLen = 5;\r
+      BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16));\r
+      Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]);\r
+      if (EFI_ERROR (Status)) {\r
+        goto Exit;\r
+      }\r
+      AltRespLen += StrLen (AltCfg[Index]);\r
     }\r
-    AltRespLen += StrLen (AltCfg[Index]);\r
+    VA_END (Args);\r
   }\r
-  VA_END (Args);\r
 \r
   //\r
   // Generate the final <ConfigAltResp>\r
@@ -625,7 +652,7 @@ ConstructConfigAltResp (
   TempStr = AllocateZeroPool (StrBufferLen);\r
   *ConfigAltResp = TempStr;\r
   if (TempStr == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    goto Exit;\r
   }\r
 \r
   //\r
@@ -641,13 +668,23 @@ ConstructConfigAltResp (
     FreePool (AltCfg[Index]);\r
   }\r
 \r
+Exit:\r
   if (NeedFreeConfigRequest) {\r
     FreePool (ConfigRequest);\r
   }\r
   FreePool (ConfigHdr);\r
-  FreePool (ConfigResp);\r
-  FreePool (DescHdr);\r
-  FreePool (AltCfg);\r
+  if (ConfigResp != NULL) {\r
+    FreePool (ConfigResp);\r
+  }\r
+\r
+  if (BlockName != NULL) {\r
+    FreePool (BlockName);\r
+  }\r
+\r
+  if (NumberAltCfg > 0) {\r
+    FreePool (DescHdr);\r
+    FreePool (AltCfg);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -1213,7 +1250,7 @@ GetBrowserData (
   BufferLen = 0x4000;\r
   ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
   if (ConfigResp == NULL) {\r
-    BufferLen = 0;\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   StringPtr = ConfigResp + HeaderLen;\r
@@ -1229,9 +1266,7 @@ GetBrowserData (
                            VariableName\r
                            );\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    if (ConfigResp != NULL) {\r
-      FreePool (ConfigResp);\r
-    }\r
+    FreePool (ConfigResp);\r
 \r
     ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
     if (ConfigResp == NULL) {\r