]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EmbeddedPkg: AndroidBootImgBoot error handling updates
authorJeff Brasen <jbrasen@nvidia.com>
Mon, 13 Sep 2021 23:18:49 +0000 (23:18 +0000)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 23 Sep 2021 18:36:39 +0000 (18:36 +0000)
Update AndroidBootImgBoot to use a single return point
Make sure Kernel args are freed and Image is unloaded.

Signed-off-by: Jeff Brasen <jbrasen@nvidia.com>
Reviewed-by: Leif Lindholm <leif@nuviainc.com>
EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c

index 33425060b15d7b6311de75f5351c841a58113a54..324933013d91d2a8be45020fed9fd900886d2f4d 100644 (file)
@@ -382,10 +382,13 @@ AndroidBootImgBoot (
   UINTN                               RamdiskSize;\r
   IN  VOID                           *FdtBase;\r
 \r
+  NewKernelArg = NULL;\r
+  ImageHandle = NULL;\r
+\r
   Status = gBS->LocateProtocol (&gAndroidBootImgProtocolGuid, NULL,\r
                                 (VOID **) &mAndroidBootImg);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   Status = AndroidBootImgGetKernelInfo (\r
@@ -394,19 +397,19 @@ AndroidBootImgBoot (
             &KernelSize\r
             );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   NewKernelArg = AllocateZeroPool (ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);\r
   if (NewKernelArg == NULL) {\r
     DEBUG ((DEBUG_ERROR, "Fail to allocate memory\n"));\r
-    return EFI_OUT_OF_RESOURCES;\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Exit;\r
   }\r
 \r
   Status = AndroidBootImgUpdateArgs (Buffer, NewKernelArg);\r
   if (EFI_ERROR (Status)) {\r
-    FreePool (NewKernelArg);\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   Status = AndroidBootImgGetRamdiskInfo (\r
@@ -415,19 +418,17 @@ AndroidBootImgBoot (
             &RamdiskSize\r
             );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   Status = AndroidBootImgLocateFdt (Buffer, &FdtBase);\r
   if (EFI_ERROR (Status)) {\r
-    FreePool (NewKernelArg);\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   Status = AndroidBootImgUpdateFdt (Buffer, FdtBase, RamdiskData, RamdiskSize);\r
   if (EFI_ERROR (Status)) {\r
-    FreePool (NewKernelArg);\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   KernelDevicePath = mMemoryDevicePathTemplate;\r
@@ -440,21 +441,15 @@ AndroidBootImgBoot (
                            (EFI_DEVICE_PATH *)&KernelDevicePath,\r
                            (VOID*)(UINTN)Kernel, KernelSize, &ImageHandle);\r
   if (EFI_ERROR (Status)) {\r
-    //\r
-    // With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created\r
-    // with a valid EFI_LOADED_IMAGE_PROTOCOL, but the image can not be started right now.\r
-    // If the caller doesn't have the option to defer the execution of an image, we should\r
-    // unload image for the EFI_SECURITY_VIOLATION to avoid resource leak.\r
-    //\r
-    if (Status == EFI_SECURITY_VIOLATION) {\r
-      gBS->UnloadImage (ImageHandle);\r
-    }\r
-    return Status;\r
+    goto Exit;\r
   }\r
 \r
   // Set kernel arguments\r
   Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid,\r
                                 (VOID **) &ImageInfo);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Exit;\r
+  }\r
   ImageInfo->LoadOptions = NewKernelArg;\r
   ImageInfo->LoadOptionsSize = StrLen (NewKernelArg) * sizeof (CHAR16);\r
 \r
@@ -464,5 +459,18 @@ AndroidBootImgBoot (
   Status = gBS->StartImage (ImageHandle, NULL, NULL);\r
   // Clear the Watchdog Timer if the image returns\r
   gBS->SetWatchdogTimer (0, 0x10000, 0, NULL);\r
-  return EFI_SUCCESS;\r
+\r
+Exit:\r
+  //Unload image as it will not be used anymore\r
+  if (ImageHandle != NULL) {\r
+    gBS->UnloadImage (ImageHandle);\r
+    ImageHandle = NULL;\r
+  }\r
+  if (EFI_ERROR (Status)) {\r
+    if (NewKernelArg != NULL) {\r
+      FreePool (NewKernelArg);\r
+      NewKernelArg = NULL;\r
+    }\r
+  }\r
+  return Status;\r
 }\r