OvmfPkg/LinuxInitrdDynamicShellCommand: bail if initrd already exists
Before taking any actions, check if an instance of the LoadFile2 exists already on the Linux initrd media GUID device path, and whether it was provided by this command. If so, abort, since no duplicate instances of the device path should exist. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2564 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
committed by
mergify[bot]
parent
d55cfdc51f
commit
ecb30848fd
@ -53,6 +53,33 @@ STATIC CONST SINGLE_NODE_VENDOR_MEDIA_DEVPATH mInitrdDevicePath = {
|
||||
}
|
||||
};
|
||||
|
||||
STATIC
|
||||
BOOLEAN
|
||||
IsOtherInitrdDevicePathAlreadyInstalled (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)&mInitrdDevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiLoadFile2ProtocolGuid, &DevicePath,
|
||||
&Handle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Check whether the existing instance is one that we installed during
|
||||
// a previous invocation.
|
||||
//
|
||||
if (Handle == mInitrdLoadFile2Handle) {
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@ -217,6 +244,10 @@ RunInitrd (
|
||||
} else {
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
} else if (IsOtherInitrdDevicePathAlreadyInstalled ()) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ALREADY_INSTALLED),
|
||||
mLinuxInitrdShellCommandHiiHandle, L"initrd");
|
||||
ShellStatus = SHELL_UNSUPPORTED;
|
||||
} else {
|
||||
if (ShellCommandLineGetCount (Package) > 2) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY),
|
||||
|
Reference in New Issue
Block a user