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:
Ard Biesheuvel
2020-03-03 14:37:49 +01:00
committed by mergify[bot]
parent d55cfdc51f
commit ecb30848fd
2 changed files with 34 additions and 0 deletions

View File

@ -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),