MdeModulePkg/UefiBootManagerLib: Initialize Handle before using it

BmExpandMediaDevicePath contains a bug that it uses the
uninitialized Handle.

Since the function is called when the Handle supports BlockIo
or SimpleFileSystem, when there is no SimpleFileSystem installed
on the Handle, BlockIo is *guaranteed* to be installed on the Handle.
The fix initializes the Handle by locating the BlockIo protocol
from the device path.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Sunny Wang <sunnywang@hpe.com>
This commit is contained in:
Ruiyu Ni
2017-02-06 10:00:33 +08:00
parent cc20411062
commit 00e39b0939

View File

@ -991,9 +991,13 @@ BmExpandMediaDevicePath (
return FileBuffer; return FileBuffer;
} }
Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
ASSERT_EFI_ERROR (Status);
// //
// For device boot option only pointing to the removable device handle, // For device boot option only pointing to the removable device handle,
// should make sure all its children handles (its child partion or media handles) are created and connected. // should make sure all its children handles (its child partion or media handles)
// are created and connected.
// //
gBS->ConnectController (Handle, NULL, NULL, TRUE); gBS->ConnectController (Handle, NULL, NULL, TRUE);
@ -1004,8 +1008,6 @@ BmExpandMediaDevicePath (
// returned. After the Block IO protocol is reinstalled, subsequent // returned. After the Block IO protocol is reinstalled, subsequent
// Block IO read/write will success. // Block IO read/write will success.
// //
Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &TempDevicePath, &Handle);
ASSERT_EFI_ERROR (Status);
Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo); Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Buffer = AllocatePool (BlockIo->Media->BlockSize); Buffer = AllocatePool (BlockIo->Media->BlockSize);