\r
}\r
\r
+/**\r
+ Validate the device path instance. \r
+\r
+ Only base on the length filed in the device path node to validate the device path. \r
+\r
+ @param DevicePath A pointer to a device path data structure.\r
+ @param MaxSize Max valid device path size. If big than this size, \r
+ return error.\r
+ \r
+ @retval TRUE An valid device path.\r
+ @retval FALSE An invalid device path.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN UINTN MaxSize\r
+ )\r
+{\r
+ UINTN Size;\r
+ UINTN NodeSize;\r
+\r
+ if (DevicePath == NULL) {\r
+ return TRUE;\r
+ }\r
+\r
+ Size = 0;\r
+\r
+ while (!IsDevicePathEnd (DevicePath)) {\r
+ NodeSize = DevicePathNodeLength (DevicePath);\r
+ if (NodeSize < END_DEVICE_PATH_LENGTH) {\r
+ return FALSE;\r
+ }\r
+\r
+ Size += NodeSize;\r
+ if (Size > MaxSize) {\r
+ return FALSE;\r
+ }\r
+\r
+ DevicePath = NextDevicePathNode (DevicePath);\r
+ }\r
+\r
+ Size += DevicePathNodeLength (DevicePath);\r
+ if (Size > MaxSize) {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+\r
+ Validate input console variable data. \r
+\r
+ If found the device path is not a valid device path, remove the variable.\r
+ \r
+ @param VariableName Input console variable name.\r
+\r
+**/\r
+\r
+VOID\r
+BdsFormalizeConsoleVariable (\r
+ IN CHAR16 *VariableName\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ UINTN VariableSize;\r
+ EFI_STATUS Status;\r
+\r
+ DevicePath = BdsLibGetVariableAndSize (\r
+ VariableName,\r
+ &gEfiGlobalVariableGuid,\r
+ &VariableSize\r
+ );\r
+ if (!IsValidDevicePath (DevicePath, VariableSize)) { \r
+ Status = gRT->SetVariable (\r
+ VariableName,\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ 0,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Validate variables. \r
+\r
+ If found the device path is not a valid device path, remove the variable.\r
+\r
+**/\r
+VOID \r
+BdsFormalizeEfiGlobalVariable (\r
+ VOID\r
+ )\r
+{\r
+ //\r
+ // Validate Console variable.\r
+ //\r
+ BdsFormalizeConsoleVariable (L"ConIn");\r
+ BdsFormalizeConsoleVariable (L"ConOut");\r
+ BdsFormalizeConsoleVariable (L"ErrOut");\r
+}\r
+\r
/**\r
\r
Service routine for BdsInstance->Entry(). Devices are connected, the\r
//\r
gBS->CalculateCrc32 ((VOID *)gST, sizeof(EFI_SYSTEM_TABLE), &gST->Hdr.CRC32);\r
\r
+ //\r
+ // Validate Variable.\r
+ //\r
+ BdsFormalizeEfiGlobalVariable();\r
+\r
//\r
// Do the platform init, can be customized by OEM/IBV\r
//\r