Reviewed-by: Zhichao Gao <[email protected]> Thanks, Zhichao
> -----Original Message----- > From: [email protected] [mailto:[email protected]] On Behalf Of > Dandan Bi > Sent: Wednesday, September 18, 2019 11:06 AM > To: [email protected] > Cc: Wang, Jian J <[email protected]>; Wu, Hao A <[email protected]>; > Ni, Ray <[email protected]>; Gao, Zhichao <[email protected]>; Gao, > Liming <[email protected]>; Laszlo Ersek <[email protected]> > Subject: [edk2-devel] [patch v2 3/5] MdeModulePkg/UefiBootManager: > Unload image on EFI_SECURITY_VIOLATION > > For the LoadImage() boot service, 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. > This follows UEFI Spec. > > But if the caller of LoadImage() doesn't have the option to defer the > execution of an image, we can not treat EFI_SECURITY_VIOLATION like any > other LoadImage() error, we should unload image for the > EFI_SECURITY_VIOLATION to avoid resource leak. > > This patch is to do error handling for EFI_SECURITY_VIOLATION explicitly for > the callers in UefiBootManagerLib which don't have the policy to defer the > execution of the image. > > Cc: Jian J Wang <[email protected]> > Cc: Hao A Wu <[email protected]> > Cc: Ray Ni <[email protected]> > Cc: Zhichao Gao <[email protected]> > Cc: Liming Gao <[email protected]> > Cc: Laszlo Ersek <[email protected]> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1992 > Signed-off-by: Dandan Bi <[email protected]> > --- > MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 9 +++++++++ > .../Library/UefiBootManagerLib/BmLoadOption.c | 11 ++++++++++- > MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c | 11 > ++++++++++- > 3 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > index 952033fc82..760d7647b8 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c > @@ -1859,10 +1859,19 @@ EfiBootManagerBoot ( > if (FilePath != NULL) { > FreePool (FilePath); > } > > 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); > + } > // > // Report Status Code with the failure status to indicate that the > failure to > load boot option > // > BmReportLoadFailure > (EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR, Status); > BootOption->Status = Status; > diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c > b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c > index 07592f8ebd..af47b787d1 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c > +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c > @@ -1,9 +1,9 @@ > /** @file > Load option library functions which relate with creating and processing > load > options. > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2015-2018 Hewlett Packard Enterprise Development LP<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > @@ -1409,10 +1409,19 @@ EfiBootManagerProcessLoadOption ( > FileSize, > &ImageHandle > ); > FreePool (FileBuffer); > > + // > + // 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); > + } > if (!EFI_ERROR (Status)) { > Status = gBS->HandleProtocol (ImageHandle, > &gEfiLoadedImageProtocolGuid, (VOID **)&ImageInfo); > ASSERT_EFI_ERROR (Status); > > ImageInfo->LoadOptionsSize = LoadOption->OptionalDataSize; diff --git > a/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c > b/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c > index 6b8fb4d924..833e38c6fe 100644 > --- a/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c > +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmMisc.c > @@ -1,9 +1,9 @@ > /** @file > Misc library functions. > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > @@ -491,10 +491,19 @@ EfiBootManagerDispatchDeferredImages ( > ImageDevicePath, > NULL, > 0, > &ImageHandle > ); > + // > + // 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); > + } > if (!EFI_ERROR (Status)) { > LoadCount++; > // > // Before calling the image, enable the Watchdog Timer for > // a 5 Minute period > -- > 2.18.0.windows.1 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#47454): https://edk2.groups.io/g/devel/message/47454 Mute This Topic: https://groups.io/mt/34184008/21656 Group Owner: [email protected] Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
