On 11/22/18 19:14, Ard Biesheuvel wrote: > On Thu, 22 Nov 2018 at 19:09, Laszlo Ersek <[email protected]> wrote: >> >> On 11/22/18 18:26, Ard Biesheuvel wrote: >>> BdsLoadImage () is part of the BdsLib library API and is not documented >>> as modifying its DevicePath argument, but does so nonetheless. So take >>> a copy instead, and free it after use. >>> >>> Contributed-under: TianoCore Contribution Agreement 1.1 >>> Signed-off-by: Ard Biesheuvel <[email protected]> >>> --- >>> Platform/ARM/Library/BdsLib/BdsFilePath.c | 13 ++++++++++++- >>> 1 file changed, 12 insertions(+), 1 deletion(-) >>> >>> diff --git a/Platform/ARM/Library/BdsLib/BdsFilePath.c >>> b/Platform/ARM/Library/BdsLib/BdsFilePath.c >>> index 67dafa4f3651..74fdbbee773d 100644 >>> --- a/Platform/ARM/Library/BdsLib/BdsFilePath.c >>> +++ b/Platform/ARM/Library/BdsLib/BdsFilePath.c >>> @@ -1351,5 +1351,16 @@ BdsLoadImage ( >>> OUT UINTN *FileSize >>> ) >>> { >>> - return BdsLoadImageAndUpdateDevicePath (&DevicePath, Type, Image, >>> FileSize); >>> + EFI_DEVICE_PATH *Path; >>> + EFI_STATUS Status; >>> + >>> + Path = DuplicateDevicePath (DevicePath); >>> + if (Path == NULL) { >>> + return EFI_OUT_OF_RESOURCES; >>> + } >> >> This introduces a minor change in behavior. >> >> Previously, if BdsLoadImage() got DevicePath==NULL, then >> BdsLoadImageAndUpdateDevicePath() -> BdsConnectAndUpdateDevicePath() >> would hit (*DevicePath == NULL), and return EFI_INVALID_PARAMETER. >> >> Now, (DevicePath==NULL) causes DuplicateDevicePath() to return NULL, and >> we translate that to EFI_OUT_OF_RESOURCES. >> >> Can you check for (DevicePath==NULL) first, and preserve >> EFI_INVALID_PARAMETER? >> >>> + >>> + Status = BdsLoadImageAndUpdateDevicePath (&Path, Type, Image, FileSize); >>> + FreePool (Path); >> >> This is not safe; BdsLoadImageAndUpdateDevicePath() may change Path. >> Namely, in BdsConnectAndUpdateDevicePath(), we have at one location, >> >> *DevicePath = NewDevicePath; >> >> ... Which, in fact, makes me wonder whether we need this patch at all. I >> believe BdsLoadImageAndUpdateDevicePath() -- and >> BdsConnectAndUpdateDevicePath() -- are supposed to update the caller's >> *pointer* to the device path, and not the pointed-to device path itself. >> >> Do you agree? >> > > Indeed. > > EFI_STATUS > BdsLoadImage ( > IN EFI_DEVICE_PATH *DevicePath, > > vs > > EFI_STATUS > BdsLoadImageAndUpdateDevicePath ( > IN OUT EFI_DEVICE_PATH **DevicePath, > > and I didn't spot the diference in * vs ** > > So you are right: BdsConnectAndUpdateDevicePath() assigns to > *DevicePath, which means it updates BdsLoadImage()'s local copy of the > pointer, but not the memory it points to. > > The IN/OUT notation makes this a bit ambiguous, though. Having > something like EFI_DEVICE_PATH CONST ** vs EFI_DEVICE_PATH * CONST * > is not necessarily easier to read, but less ambiguous. >
Exactly! Laszlo _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

