]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c
OvmfPkg/X86QemuLoadImageLib: plug cmdline blob leak on success
[mirror_edk2.git] / OvmfPkg / Library / X86QemuLoadImageLib / X86QemuLoadImageLib.c
index e52ec668f3751624522ac59a984fc119f0b558d1..6b1e7e64901474f6e0385b75860eef7a7aaa9d33 100644 (file)
@@ -161,6 +161,11 @@ QemuLoadLegacyImage (
     LoadedImage->CommandLine = LoadLinuxAllocateCommandLinePages (\r
                                  EFI_SIZE_TO_PAGES (\r
                                    LoadedImage->CommandLineSize));\r
+    if (LoadedImage->CommandLine == NULL) {\r
+      DEBUG ((DEBUG_ERROR, "Unable to allocate memory for kernel command line!\n"));\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto FreeImage;\r
+    }\r
     QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);\r
     QemuFwCfgReadBytes (LoadedImage->CommandLineSize, LoadedImage->CommandLine);\r
   }\r
@@ -178,6 +183,11 @@ QemuLoadLegacyImage (
     LoadedImage->InitrdData = LoadLinuxAllocateInitrdPages (\r
                                 LoadedImage->SetupBuf,\r
                                 EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize));\r
+    if (LoadedImage->InitrdData == NULL) {\r
+      DEBUG ((DEBUG_ERROR, "Unable to allocate memory for initrd!\n"));\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto FreeImage;\r
+    }\r
     DEBUG ((DEBUG_INFO, "Initrd size: 0x%x\n",\r
       (UINT32)LoadedImage->InitrdSize));\r
     DEBUG ((DEBUG_INFO, "Reading initrd image ..."));\r
@@ -291,6 +301,11 @@ QemuLoadKernelImage (
   CHAR8                     *CommandLine;\r
   UINTN                     InitrdSize;\r
 \r
+  //\r
+  // Redundant assignment to work around GCC48/GCC49 limitations.\r
+  //\r
+  CommandLine = NULL;\r
+\r
   //\r
   // Load the image. This should call back into the QEMU EFI loader file system.\r
   //\r
@@ -315,15 +330,21 @@ QemuLoadKernelImage (
 \r
   case EFI_SECURITY_VIOLATION:\r
     //\r
-    // We are running with UEFI secure boot enabled, and the image failed to\r
-    // authenticate. For compatibility reasons, we fall back to the legacy\r
-    // loader in this case. Since the image has been loaded, we need to unload\r
-    // it before proceeding\r
+    // Since the image has been loaded, we need to unload it before proceeding\r
+    // to the EFI_ACCESS_DENIED case below.\r
     //\r
     gBS->UnloadImage (KernelImageHandle);\r
     //\r
     // Fall through\r
     //\r
+  case EFI_ACCESS_DENIED:\r
+    //\r
+    // We are running with UEFI secure boot enabled, and the image failed to\r
+    // authenticate. For compatibility reasons, we fall back to the legacy\r
+    // loader in this case.\r
+    //\r
+    // Fall through\r
+    //\r
   case EFI_UNSUPPORTED:\r
     //\r
     // The image is not natively supported or cross-type supported. Let's try\r
@@ -425,14 +446,16 @@ QemuLoadKernelImage (
   }\r
 \r
   *ImageHandle = KernelImageHandle;\r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
 \r
 FreeCommandLine:\r
   if (CommandLineSize > 0) {\r
     FreePool (CommandLine);\r
   }\r
 UnloadImage:\r
-  gBS->UnloadImage (KernelImageHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->UnloadImage (KernelImageHandle);\r
+  }\r
 \r
   return Status;\r
 }\r