]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg/UefiHandleParsingLib: Fix memory leak
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index 1049dea0c009bdb628e0032f890f0d6ba03a9d20..da1d92fd1717b7101ae40dabf3920d1578918ad7 100644 (file)
@@ -933,25 +933,22 @@ AdapterInformationDumpInformation (
       } else {\r
 \r
         GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);\r
+        if (GuidStr == NULL) {\r
+          TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
 \r
-        if (GuidStr != NULL) {\r
-          if (StrCmp(GuidStr, L"UnknownDevice") == 0) {\r
-            TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
-            SHELL_FREE_NON_NULL (RetVal);\r
-            RetVal = TempRetVal;\r
-\r
-            SHELL_FREE_NON_NULL (TempStr);\r
-            SHELL_FREE_NON_NULL(GuidStr);\r
-            //\r
-            // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
-            //\r
-            continue;\r
-          } else {\r
-            TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
-            SHELL_FREE_NON_NULL (RetVal);\r
-            RetVal = TempRetVal;\r
-            SHELL_FREE_NON_NULL(GuidStr);\r
-          }\r
+          SHELL_FREE_NON_NULL (TempStr);\r
+          SHELL_FREE_NON_NULL(GuidStr);\r
+          //\r
+          // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
+          //\r
+          continue;\r
+        } else {\r
+          TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+          SHELL_FREE_NON_NULL(GuidStr);\r
         }\r
       }\r
 \r
@@ -1500,7 +1497,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {
   {STRING_TOKEN(STR_WINNT_THUNK),           (EFI_GUID*)&WinNtThunkProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_WINNT_DRIVER_IO),       (EFI_GUID*)&WinNtIoProtocolGuid,                  NULL},\r
   {STRING_TOKEN(STR_WINNT_SERIAL_PORT),     (EFI_GUID*)&WinNtSerialPortGuid,                  NULL},\r
-  {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\r
+  {0,                                       NULL,                                             NULL},\r
 };\r
 \r
 STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
@@ -1816,7 +1813,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
 //\r
 // terminator\r
 //\r
-  {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\r
+  {0,                                       NULL,                                             NULL},\r
 };\r
 \r
 /**\r
@@ -1964,7 +1961,10 @@ GetStringNameFromGuid(
   HandleParsingHiiInit();\r
 \r
   Id = InternalShellGetNodeFromGuid(Guid);\r
-  return (HiiGetString(mHandleParsingHiiHandle, Id==NULL?STRING_TOKEN(STR_UNKNOWN_DEVICE):Id->StringId, Lang));\r
+  if (Id == NULL) {\r
+    return NULL;\r
+  }\r
+  return HiiGetString (mHandleParsingHiiHandle, Id->StringId, Lang);\r
 }\r
 \r
 /**\r
@@ -2331,7 +2331,9 @@ ConvertHandleIndexToHandle(
       // Verify that LinkWalker->TheHandle is valid handle\r
       //\r
       Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
-      if (EFI_ERROR (Status)) {\r
+      if (!EFI_ERROR (Status)) {\r
+        FreePool (ProtocolBuffer);\r
+      } else {\r
         //\r
         // TheHandle is not valid, so do not add to handle list\r
         //\r
@@ -3079,3 +3081,55 @@ GetHandleListByProtocolList (
 \r
   return (HandleList);\r
 }\r
+\r
+/**\r
+  Return all supported GUIDs.\r
+\r
+  @param[out]     Guids  The buffer to return all supported GUIDs.\r
+  @param[in, out] Count  On input, the count of GUIDs the buffer can hold,\r
+                         On output, the count of GUIDs to return.\r
+\r
+  @retval EFI_INVALID_PARAMETER Count is NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL  Buffer is not enough to hold all GUIDs.\r
+  @retval EFI_SUCCESS           GUIDs are returned successfully.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetAllMappingGuids (\r
+  OUT EFI_GUID *Guids,\r
+  IN OUT UINTN *Count\r
+  )\r
+{\r
+  UINTN GuidCount;\r
+  UINTN NtGuidCount;\r
+  UINTN Index;\r
+\r
+  if (Count == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  NtGuidCount = 0;\r
+  if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
+    NtGuidCount = ARRAY_SIZE (mGuidStringListNT) - 1;\r
+  }\r
+  GuidCount   = ARRAY_SIZE (mGuidStringList) - 1;\r
+\r
+  if (*Count < NtGuidCount + GuidCount + mGuidListCount) {\r
+    *Count = NtGuidCount + GuidCount + mGuidListCount;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  for (Index = 0; Index < NtGuidCount; Index++) {\r
+    CopyGuid (&Guids[Index], mGuidStringListNT[Index].GuidId);\r
+  }\r
+\r
+  for (Index = 0; Index < GuidCount; Index++) {\r
+    CopyGuid (&Guids[NtGuidCount + Index], mGuidStringList[Index].GuidId);\r
+  }\r
+\r
+  for (Index = 0; Index < mGuidListCount; Index++) {\r
+    CopyGuid (&Guids[NtGuidCount + GuidCount + Index], mGuidList[Index].GuidId);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r