]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c
MdeModulePkg/String.c: Zero memory before free (CVE-2019-14558)
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / HiiDatabaseEntry.c
CommitLineData
93e3992d 1/** @file\r
3cb3f198 2This file contains the entry code to the HII database, which is defined by\r
3UEFI 2.1 specification.\r
93e3992d 4\r
d1102dba 5Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
93e3992d 7\r
93e3992d 8**/\r
9\r
10\r
11#include "HiiDatabase.h"\r
12\r
13//\r
14// Global variables\r
15//\r
16EFI_EVENT gHiiKeyboardLayoutChanged;\r
8a45f80e 17BOOLEAN gExportAfterReadyToBoot = FALSE;\r
93e3992d 18\r
fe1e36e5 19HII_DATABASE_PRIVATE_DATA mPrivate = {\r
93e3992d 20 HII_DATABASE_PRIVATE_DATA_SIGNATURE,\r
21 {\r
22 (LIST_ENTRY *) NULL,\r
23 (LIST_ENTRY *) NULL\r
24 },\r
25 {\r
26 (LIST_ENTRY *) NULL,\r
27 (LIST_ENTRY *) NULL\r
28 },\r
29 {\r
30 HiiStringToImage,\r
31 HiiStringIdToImage,\r
32 HiiGetGlyph,\r
33 HiiGetFontInfo\r
34 },\r
93e3992d 35 {\r
101a1122
RN
36 HiiNewImage,\r
37 HiiGetImage,\r
38 HiiSetImage,\r
39 HiiDrawImage,\r
40 HiiDrawImageId\r
41 },\r
42 {\r
43 HiiNewImageEx,\r
44 HiiGetImageEx,\r
45 HiiSetImageEx,\r
46 HiiDrawImageEx,\r
47 HiiDrawImageIdEx,\r
48 HiiGetImageInfo\r
93e3992d 49 },\r
93e3992d 50 {\r
51 HiiNewString,\r
52 HiiGetString,\r
53 HiiSetString,\r
54 HiiGetLanguages,\r
55 HiiGetSecondaryLanguages\r
56 },\r
57 {\r
58 HiiNewPackageList,\r
59 HiiRemovePackageList,\r
60 HiiUpdatePackageList,\r
61 HiiListPackageLists,\r
62 HiiExportPackageLists,\r
63 HiiRegisterPackageNotify,\r
64 HiiUnregisterPackageNotify,\r
65 HiiFindKeyboardLayouts,\r
66 HiiGetKeyboardLayout,\r
67 HiiSetKeyboardLayout,\r
68 HiiGetPackageListHandle\r
69 },\r
70 {\r
71 HiiConfigRoutingExtractConfig,\r
72 HiiConfigRoutingExportConfig,\r
813acf3a 73 HiiConfigRoutingRouteConfig,\r
93e3992d 74 HiiBlockToConfig,\r
75 HiiConfigToBlock,\r
76 HiiGetAltCfg\r
77 },\r
87bfeb11
ED
78 {\r
79 EfiConfigKeywordHandlerSetData,\r
80 EfiConfigKeywordHandlerGetData\r
81 },\r
93e3992d 82 {\r
83 (LIST_ENTRY *) NULL,\r
84 (LIST_ENTRY *) NULL\r
85 },\r
86 0,\r
87 {\r
88 (LIST_ENTRY *) NULL,\r
89 (LIST_ENTRY *) NULL\r
90 },\r
91 EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK),\r
92 {\r
93 0x00000000,\r
94 0x0000,\r
95 0x0000,\r
7fd21395 96 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\r
93e3992d 97 },\r
98 NULL\r
99};\r
100\r
e90b081a 101/**\r
102 The default event handler for gHiiKeyboardLayoutChanged\r
103 event group.\r
104\r
105 This is internal function.\r
106\r
107 @param Event The event that triggered this notification function.\r
108 @param Context Pointer to the notification functions context.\r
109\r
110**/\r
813acf3a 111VOID\r
112EFIAPI\r
113KeyboardLayoutChangeNullEvent (\r
114 IN EFI_EVENT Event,\r
115 IN VOID *Context\r
116 )\r
117{\r
118 return;\r
119}\r
120\r
8a45f80e
DB
121/**\r
122 On Ready To Boot Services Event notification handler.\r
123\r
124 To trigger the function that to export the Hii Configuration setting.\r
125\r
126 @param[in] Event Event whose notification function is being invoked\r
127 @param[in] Context Pointer to the notification function's context\r
128\r
129**/\r
130VOID\r
131EFIAPI\r
132OnReadyToBoot (\r
133 IN EFI_EVENT Event,\r
134 IN VOID *Context\r
135 )\r
136{\r
137 //\r
138 // When ready to boot, we begin to export the HiiDatabase date.\r
139 // And hook all the possible HiiDatabase change actions to export data.\r
140 //\r
adb2c050
DB
141 HiiGetDatabaseInfo (&mPrivate.HiiDatabase);\r
142 HiiGetConfigRespInfo (&mPrivate.HiiDatabase);\r
8a45f80e 143 gExportAfterReadyToBoot = TRUE;\r
c87b13cd
DB
144\r
145 gBS->CloseEvent (Event);\r
8a45f80e
DB
146}\r
147\r
e90b081a 148/**\r
149 Initialize HII Database.\r
150\r
151\r
152 @param ImageHandle The image handle.\r
153 @param SystemTable The system table.\r
154\r
155 @retval EFI_SUCCESS The Hii database is setup correctly.\r
156 @return Other value if failed to create the default event for\r
157 gHiiKeyboardLayoutChanged. Check gBS->CreateEventEx for\r
4a429716 158 details. Or failed to install the protocols.\r
e90b081a 159 Check gBS->InstallMultipleProtocolInterfaces for details.\r
8a45f80e
DB
160 Or failed to create Ready To Boot Event.\r
161 Check EfiCreateEventReadyToBootEx for details.\r
e90b081a 162\r
163**/\r
93e3992d 164EFI_STATUS\r
165EFIAPI\r
166InitializeHiiDatabase (\r
167 IN EFI_HANDLE ImageHandle,\r
168 IN EFI_SYSTEM_TABLE *SystemTable\r
169 )\r
93e3992d 170{\r
171 EFI_STATUS Status;\r
172 EFI_HANDLE Handle;\r
8a45f80e 173 EFI_EVENT ReadyToBootEvent;\r
93e3992d 174\r
93e3992d 175 //\r
176 // There will be only one HII Database in the system\r
177 // If there is another out there, someone is trying to install us\r
178 // again. Fail that scenario.\r
179 //\r
e90b081a 180 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiDatabaseProtocolGuid);\r
181 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiFontProtocolGuid);\r
182 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiImageProtocolGuid);\r
183 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiStringProtocolGuid);\r
184 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiConfigRoutingProtocolGuid);\r
87bfeb11 185 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiConfigKeywordHandlerProtocolGuid);\r
d1102dba 186\r
93e3992d 187 InitializeListHead (&mPrivate.DatabaseList);\r
188 InitializeListHead (&mPrivate.DatabaseNotifyList);\r
189 InitializeListHead (&mPrivate.HiiHandleList);\r
190 InitializeListHead (&mPrivate.FontInfoList);\r
191\r
192 //\r
193 // Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type.\r
194 //\r
195 Status = gBS->CreateEventEx (\r
e53a6ea9 196 EVT_NOTIFY_SIGNAL,\r
813acf3a 197 TPL_NOTIFY,\r
198 KeyboardLayoutChangeNullEvent,\r
93e3992d 199 NULL,\r
ea021002 200 &gEfiHiiKeyBoardLayoutGuid,\r
93e3992d 201 &gHiiKeyboardLayoutChanged\r
202 );\r
203 if (EFI_ERROR (Status)) {\r
204 return Status;\r
205 }\r
206\r
207 Handle = NULL;\r
e94358a3 208 Status = gBS->InstallMultipleProtocolInterfaces (\r
209 &Handle,\r
210 &gEfiHiiFontProtocolGuid,\r
211 &mPrivate.HiiFont,\r
212 &gEfiHiiStringProtocolGuid,\r
213 &mPrivate.HiiString,\r
214 &gEfiHiiDatabaseProtocolGuid,\r
215 &mPrivate.HiiDatabase,\r
216 &gEfiHiiConfigRoutingProtocolGuid,\r
217 &mPrivate.ConfigRouting,\r
87bfeb11
ED
218 &gEfiConfigKeywordHandlerProtocolGuid,\r
219 &mPrivate.ConfigKeywordHandler,\r
e94358a3 220 NULL\r
221 );\r
222\r
223 if (EFI_ERROR (Status)) {\r
224 return Status;\r
225 }\r
226\r
227 if (FeaturePcdGet (PcdSupportHiiImageProtocol)) {\r
e94358a3 228 Status = gBS->InstallMultipleProtocolInterfaces (\r
229 &Handle,\r
101a1122
RN
230 &gEfiHiiImageProtocolGuid, &mPrivate.HiiImage,\r
231 &gEfiHiiImageExProtocolGuid, &mPrivate.HiiImageEx,\r
e94358a3 232 NULL\r
233 );\r
234\r
235 }\r
236\r
8a45f80e
DB
237 if (FeaturePcdGet(PcdHiiOsRuntimeSupport)) {\r
238 Status = EfiCreateEventReadyToBootEx (\r
239 TPL_CALLBACK,\r
240 OnReadyToBoot,\r
241 NULL,\r
242 &ReadyToBootEvent\r
243 );\r
244 if (EFI_ERROR (Status)) {\r
245 return Status;\r
246 }\r
247 }\r
248\r
e94358a3 249 return Status;\r
93e3992d 250}\r
251\r