]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c
ShellPkg/for: Fix potential null pointer deference
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Cls.c
index 96028e4fc4455f64361ef8e0cd0aa680519f0f18..7e7d58d16c08e7a599ad351475f9f43e44602d41 100644 (file)
@@ -1,6 +1,8 @@
 /** @file\r
   Main file for attrib shell level 2 function.\r
 \r
+  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
   Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
 \r
 #include "UefiShellLevel3CommandsLib.h"\r
 \r
+STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
+  {L"-sfo", TypeFlag},\r
+  {NULL,    TypeMax}\r
+  };\r
+\r
 /**\r
   Function for 'cls' command.\r
 \r
@@ -30,10 +37,11 @@ ShellCommandRunCls (
   EFI_STATUS    Status;\r
   LIST_ENTRY    *Package;\r
   UINTN         Background;\r
-  UINTN         ForeColor;\r
+  UINTN         Foreground;\r
   CHAR16        *ProblemParam;\r
   SHELL_STATUS  ShellStatus;\r
-  CONST CHAR16  *Param1;\r
+  CONST CHAR16  *BackColorStr;\r
+  CONST CHAR16  *ForeColorStr;\r
 \r
   //\r
   // Initialize variables\r
@@ -41,6 +49,7 @@ ShellCommandRunCls (
   ShellStatus   = SHELL_SUCCESS;\r
   ProblemParam  = NULL;\r
   Background    = 0;\r
+  Foreground    = 0;\r
 \r
   //\r
   // initialize the shell lib (we must be in non-auto-init...)\r
@@ -51,10 +60,10 @@ ShellCommandRunCls (
   //\r
   // parse the command line\r
   //\r
-  Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
+  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"cls", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -66,55 +75,144 @@ ShellCommandRunCls (
     //\r
     if (ShellCommandLineGetFlag(Package, L"-?")) {\r
       ASSERT(FALSE);\r
+    } else if (ShellCommandLineGetFlag (Package, L"-sfo")) {\r
+      if (ShellCommandLineGetCount (Package) > 1) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls");\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+      } else {\r
+        Background = (gST->ConOut->Mode->Attribute >> 4) & 0x7;\r
+        Foreground = gST->ConOut->Mode->Attribute & 0x0F;\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel3HiiHandle, L"cls");\r
+        ShellPrintHiiEx (\r
+          -1,\r
+          -1,\r
+          NULL,\r
+          STRING_TOKEN (STR_CLS_OUTPUT_SFO),\r
+          gShellLevel3HiiHandle,\r
+          gST->ConOut->Mode->Attribute,\r
+          Foreground,\r
+          Background\r
+          );\r
+      }\r
     } else {\r
       //\r
       // If there are 0 value parameters, clear sceen\r
       //\r
-      Param1 = ShellCommandLineGetRawValue(Package, 1);\r
-      if (Param1 == NULL) {\r
+      BackColorStr = ShellCommandLineGetRawValue (Package, 1);\r
+      ForeColorStr = ShellCommandLineGetRawValue (Package, 2);\r
+\r
+      if (BackColorStr == NULL && ForeColorStr == NULL) {\r
         //\r
         // clear screen\r
         //\r
         gST->ConOut->ClearScreen (gST->ConOut);\r
-      } else if (ShellCommandLineGetCount(Package) > 2) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle);\r
+      } else if (ShellCommandLineGetCount (Package) > 3) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        if (ShellStrToUintn(Param1) > 7 || StrLen(Param1) > 1 || !ShellIsDecimalDigitCharacter(*Param1)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, Param1);\r
-          ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else {\r
-          switch (ShellStrToUintn(Param1)) {\r
-            case 0:\r
-              Background = EFI_BACKGROUND_BLACK;\r
-              break;\r
-            case 1:\r
-              Background = EFI_BACKGROUND_BLUE;\r
-              break;\r
-            case 2:\r
-              Background = EFI_BACKGROUND_GREEN;\r
-              break;\r
-            case 3:\r
-              Background = EFI_BACKGROUND_CYAN;\r
-              break;\r
-            case 4:\r
-              Background = EFI_BACKGROUND_RED;\r
-              break;\r
-            case 5:\r
-              Background = EFI_BACKGROUND_MAGENTA;\r
-              break;\r
-            case 6:\r
-              Background = EFI_BACKGROUND_BROWN;\r
-              break;\r
-            case 7:\r
-              Background = EFI_BACKGROUND_LIGHTGRAY;\r
-              break;\r
+        if (BackColorStr != NULL) {\r
+          if ((ShellStrToUintn (BackColorStr) > 7) || (StrLen (BackColorStr) > 1) || (!ShellIsDecimalDigitCharacter (*BackColorStr))) {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", BackColorStr);\r
+            ShellStatus = SHELL_INVALID_PARAMETER;\r
+          } else {\r
+            switch (ShellStrToUintn (BackColorStr)) {\r
+              case 0:\r
+                Background = EFI_BACKGROUND_BLACK;\r
+                break;\r
+              case 1:\r
+                Background = EFI_BACKGROUND_BLUE;\r
+                break;\r
+              case 2:\r
+                Background = EFI_BACKGROUND_GREEN;\r
+                break;\r
+              case 3:\r
+                Background = EFI_BACKGROUND_CYAN;\r
+                break;\r
+              case 4:\r
+                Background = EFI_BACKGROUND_RED;\r
+                break;\r
+              case 5:\r
+                Background = EFI_BACKGROUND_MAGENTA;\r
+                break;\r
+              case 6:\r
+                Background = EFI_BACKGROUND_BROWN;\r
+                break;\r
+              case 7:\r
+                Background = EFI_BACKGROUND_LIGHTGRAY;\r
+                break;\r
+            }\r
+\r
+            if (ForeColorStr != NULL) {\r
+              if ((ShellStrToUintn (ForeColorStr) > 15) || (StrLen (ForeColorStr) > 2) || (!ShellIsDecimalDigitCharacter (*ForeColorStr))) {\r
+                ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", ForeColorStr);\r
+                ShellStatus = SHELL_INVALID_PARAMETER;\r
+              } else {\r
+                switch (ShellStrToUintn (ForeColorStr)) {\r
+                  case 0:\r
+                    Foreground = EFI_BLACK;\r
+                    break;\r
+                  case 1:\r
+                    Foreground = EFI_BLUE;\r
+                    break;\r
+                  case 2:\r
+                    Foreground = EFI_GREEN;\r
+                    break;\r
+                  case 3:\r
+                    Foreground = EFI_CYAN;\r
+                    break;\r
+                  case 4:\r
+                    Foreground = EFI_RED;\r
+                    break;\r
+                  case 5:\r
+                    Foreground = EFI_MAGENTA;\r
+                    break;\r
+                  case 6:\r
+                    Foreground = EFI_BROWN;\r
+                    break;\r
+                  case 7:\r
+                    Foreground = EFI_LIGHTGRAY;\r
+                    break;\r
+                  case 8:\r
+                    Foreground = EFI_DARKGRAY;\r
+                    break;\r
+                  case 9:\r
+                    Foreground = EFI_LIGHTBLUE;\r
+                    break;\r
+                  case 10:\r
+                    Foreground = EFI_LIGHTGREEN;\r
+                    break;\r
+                  case 11:\r
+                    Foreground = EFI_LIGHTCYAN;\r
+                    break;\r
+                  case 12:\r
+                    Foreground = EFI_LIGHTRED;\r
+                    break;\r
+                  case 13:\r
+                    Foreground = EFI_LIGHTMAGENTA;\r
+                    break;\r
+                  case 14:\r
+                    Foreground = EFI_YELLOW;\r
+                    break;\r
+                  case 15:\r
+                    Foreground = EFI_WHITE;\r
+                    break;\r
+                }\r
+              }\r
+            } else {\r
+              //\r
+              // Since foreground color is not modified, so retain\r
+              // existing foreground color without any change to it.\r
+              //\r
+              Foreground = gST->ConOut->Mode->Attribute & 0x0F;\r
+            }\r
+\r
+            if (ShellStatus == SHELL_SUCCESS) {\r
+              Status = gST->ConOut->SetAttribute (gST->ConOut, (Foreground | Background) & 0x7F);\r
+              ASSERT_EFI_ERROR (Status);\r
+              Status = gST->ConOut->ClearScreen (gST->ConOut);\r
+              ASSERT_EFI_ERROR (Status);\r
+            }\r
           }\r
-          ForeColor = (~ShellStrToUintn(Param1)) & 0xF;\r
-          Status = gST->ConOut->SetAttribute (gST->ConOut, (ForeColor | Background) & 0x7F );\r
-          ASSERT_EFI_ERROR(Status);\r
-          Status = gST->ConOut->ClearScreen (gST->ConOut);\r
-          ASSERT_EFI_ERROR(Status);\r
         }\r
       }\r
     }\r