]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add logic to validate console variables when enter BDS.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 18 May 2012 02:13:29 +0000 (02:13 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 18 May 2012 02:13:29 +0000 (02:13 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13322 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c

index 6561efe5a74fccbbe521e1a2343e9f7b2edbce35..e0862aed5ef04aa1d92d29a8c6974479e4e3c5b9 100644 (file)
@@ -274,6 +274,112 @@ BdsBootDeviceSelect (
 \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
@@ -323,6 +429,11 @@ BdsEntry (
   //\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