OpenCorePkg/Patches/0005-ShellPkg-Devices-shell-command-support-misaligned-de.patch

67 lines
1.9 KiB
Diff

From 835e353002ab6e5606c3a9f73d6e2f00f3c2a259 Mon Sep 17 00:00:00 2001
From: ocbuild <ocbuild@acidanthera.local>
Date: Wed, 31 Mar 2021 07:11:46 +0100
Subject: [PATCH] ShellPkg: Devices shell command support misaligned device
names found in some Apple firmware
---
ShellPkg/Application/Shell/ShellProtocol.c | 27 ++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c
index 4e639fe..c9b2d5a 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.c
+++ b/ShellPkg/Application/Shell/ShellProtocol.c
@@ -573,6 +573,25 @@ EfiShellGetDevicePathFromFilePath(
return (DevicePathForReturn);
}
+STATIC
+CHAR16 *
+RealignString16 (
+ IN CONST VOID *Source
+ )
+{
+ CHAR16 NextChar;
+ CONST UINT8 *Walker;
+
+ Walker = Source;
+
+ do {
+ NextChar = ReadUnaligned16 ((VOID *) Walker);
+ Walker += sizeof (CHAR16);
+ } while (NextChar != CHAR_NULL);
+
+ return AllocateCopyPool ((UINTN) (Walker - (CONST UINT8 *) Source), Source);
+}
+
/**
Gets the name of the device specified by the device handle.
@@ -630,6 +649,7 @@ EfiShellGetDeviceName(
EFI_HANDLE *ParentControllerBuffer;
UINTN ParentDriverCount;
EFI_HANDLE *ParentDriverBuffer;
+ BOOLEAN NeedsRealign;
if (BestDeviceName == NULL ||
DeviceHandle == NULL
@@ -748,7 +768,14 @@ EfiShellGetDeviceName(
//
if (DeviceNameToReturn != NULL){
ASSERT(BestDeviceName != NULL);
+ NeedsRealign = ((UINTN) DeviceNameToReturn & BIT0) != 0;
+ if (NeedsRealign) {
+ DeviceNameToReturn = RealignString16 (DeviceNameToReturn);
+ }
StrnCatGrow(BestDeviceName, NULL, DeviceNameToReturn, 0);
+ if (NeedsRealign) {
+ FreePool (DeviceNameToReturn);
+ }
return (EFI_SUCCESS);
}
}
--
2.27.0