Update AndroidBootImgBoot to use a single return point Make sure Kernel args are freed and Image is unloaded.
Signed-off-by: Jeff Brasen <jbra...@nvidia.com> --- .../AndroidBootImgLib/AndroidBootImgLib.c | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c index bbc240c3632a..3c617649f735 100644 --- a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c +++ b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c @@ -384,10 +384,13 @@ AndroidBootImgBoot ( UINTN RamdiskSize; IN VOID *FdtBase; + NewKernelArg = NULL; + ImageHandle = NULL; + Status = gBS->LocateProtocol (&gAndroidBootImgProtocolGuid, NULL, (VOID **) &mAndroidBootImg); if (EFI_ERROR (Status)) { - return Status; + goto Exit; } Status = AndroidBootImgGetKernelInfo ( @@ -396,19 +399,19 @@ AndroidBootImgBoot ( &KernelSize ); if (EFI_ERROR (Status)) { - return Status; + goto Exit; } NewKernelArg = AllocateZeroPool (ANDROID_BOOTIMG_KERNEL_ARGS_SIZE); if (NewKernelArg == NULL) { DEBUG ((DEBUG_ERROR, "Fail to allocate memory\n")); - return EFI_OUT_OF_RESOURCES; + Status = EFI_OUT_OF_RESOURCES; + goto Exit; } Status = AndroidBootImgUpdateArgs (Buffer, NewKernelArg); if (EFI_ERROR (Status)) { - FreePool (NewKernelArg); - return Status; + goto Exit; } Status = AndroidBootImgGetRamdiskInfo ( @@ -417,19 +420,17 @@ AndroidBootImgBoot ( &RamdiskSize ); if (EFI_ERROR (Status)) { - return Status; + goto Exit; } Status = AndroidBootImgLocateFdt (Buffer, &FdtBase); if (EFI_ERROR (Status)) { - FreePool (NewKernelArg); - return Status; + goto Exit; } Status = AndroidBootImgUpdateFdt (Buffer, FdtBase, RamdiskData, RamdiskSize); if (EFI_ERROR (Status)) { - FreePool (NewKernelArg); - return Status; + goto Exit; } KernelDevicePath = mMemoryDevicePathTemplate; @@ -442,21 +443,15 @@ AndroidBootImgBoot ( (EFI_DEVICE_PATH *)&KernelDevicePath, (VOID*)(UINTN)Kernel, KernelSize, &ImageHandle); if (EFI_ERROR (Status)) { - // - // With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created - // with a valid EFI_LOADED_IMAGE_PROTOCOL, but the image can not be started right now. - // If the caller doesn't have the option to defer the execution of an image, we should - // unload image for the EFI_SECURITY_VIOLATION to avoid resource leak. - // - if (Status == EFI_SECURITY_VIOLATION) { - gBS->UnloadImage (ImageHandle); - } - return Status; + goto Exit; } // Set kernel arguments Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &ImageInfo); + if (EFI_ERROR (Status)) { + goto Exit; + } ImageInfo->LoadOptions = NewKernelArg; ImageInfo->LoadOptionsSize = StrLen (NewKernelArg) * sizeof (CHAR16); @@ -466,5 +461,18 @@ AndroidBootImgBoot ( Status = gBS->StartImage (ImageHandle, NULL, NULL); // Clear the Watchdog Timer if the image returns gBS->SetWatchdogTimer (0, 0x10000, 0, NULL); - return EFI_SUCCESS; + +Exit: + //Unload image as it will not be used anymore + if (ImageHandle != NULL) { + gBS->UnloadImage (ImageHandle); + ImageHandle = NULL; + } + if (EFI_ERROR (Status)) { + if (NewKernelArg != NULL) { + FreePool (NewKernelArg); + NewKernelArg = NULL; + } + } + return Status; } -- 2.17.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#80113): https://edk2.groups.io/g/devel/message/80113 Mute This Topic: https://groups.io/mt/85313032/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-