forked from acidanthera/OpenCorePkg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
0005-ShellPkg-Devices-shell-command-support-misaligned-de.patch
66 lines (60 loc) · 1.91 KB
/
0005-ShellPkg-Devices-shell-command-support-misaligned-de.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
From 835e353002ab6e5606c3a9f73d6e2f00f3c2a259 Mon Sep 17 00:00:00 2001
From: ocbuild <[email protected]>
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 509eb60e40..25f33166e6 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.c
+++ b/ShellPkg/Application/Shell/ShellProtocol.c
@@ -598,6 +598,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.
@@ -655,6 +674,7 @@ EfiShellGetDeviceName (
EFI_HANDLE *ParentControllerBuffer;
UINTN ParentDriverCount;
EFI_HANDLE *ParentDriverBuffer;
+ BOOLEAN NeedsRealign;
if ((BestDeviceName == NULL) ||
(DeviceHandle == NULL)
@@ -783,7 +803,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