]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg/alias: Fix flag parsing logic
authorHuajing Li <huajing.li@intel.com>
Fri, 13 Oct 2017 02:44:10 +0000 (10:44 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Fri, 20 Oct 2017 04:54:36 +0000 (12:54 +0800)
Existing logic to parse the flags isn't complete and cannot detect
some invalid combinations of flags.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c

index daf46a9f657a4ae034bb3e527654500d518af581..3e00eb1d556ef8d6fc49925727617301179738b7 100644 (file)
 \r
 #include <Library/ShellLib.h>\r
 \r
+/**\r
+  Print out single alias registered with the Shell.\r
+\r
+  @param[in]  Alias             Points to the NULL-terminated shell alias.\r
+                                If this parameter is NULL, then all\r
+                                aliases will be returned in ReturnedData.\r
+  @retval     SHELL_SUCCESS     the printout was sucessful\r
+**/\r
+SHELL_STATUS\r
+PrintSingleShellAlias(\r
+  IN  CONST CHAR16 *Alias\r
+  )\r
+{\r
+  CONST CHAR16        *ConstAliasVal;\r
+  SHELL_STATUS        ShellStatus;\r
+  BOOLEAN             Volatile;\r
+\r
+  ShellStatus = SHELL_SUCCESS;\r
+  ConstAliasVal = gEfiShellProtocol->GetAlias (Alias, &Volatile);\r
+  if (ConstAliasVal == NULL) {\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Alias);\r
+    ShellStatus = SHELL_INVALID_PARAMETER;\r
+  } else {\r
+    if (ShellCommandIsOnAliasList (Alias)) {\r
+      Volatile = FALSE;\r
+    }\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal);\r
+  }\r
+  return ShellStatus;\r
+}\r
+\r
 /**\r
   Print out each alias registered with the Shell.\r
 \r
@@ -30,11 +61,7 @@ PrintAllShellAlias(
 {\r
   CONST CHAR16      *ConstAllAliasList;\r
   CHAR16            *Alias;\r
-  CONST CHAR16      *Command;\r
   CHAR16            *Walker;\r
-  BOOLEAN           Volatile;\r
-\r
-  Volatile = FALSE;\r
 \r
   ConstAllAliasList = gEfiShellProtocol->GetAlias(NULL, NULL);\r
   if (ConstAllAliasList == NULL) {\r
@@ -53,11 +80,7 @@ PrintAllShellAlias(
       Walker[0] = CHAR_NULL;\r
       Walker = Walker + 1;\r
     }\r
-    Command = gEfiShellProtocol->GetAlias(Alias, &Volatile);\r
-    if (ShellCommandIsOnAliasList(Alias)) {\r
-      Volatile = FALSE;\r
-    }\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile?L' ':L'*', Alias, Command);\r
+    PrintSingleShellAlias(Alias);\r
   } while (Walker != NULL && Walker[0] != CHAR_NULL);\r
 \r
   FreePool(Alias);\r
@@ -65,9 +88,58 @@ PrintAllShellAlias(
   return (SHELL_SUCCESS);\r
 }\r
 \r
+/**\r
+  Changes a shell command alias.\r
+\r
+  This function creates an alias for a shell command or if Alias is NULL it will delete an existing alias.\r
+\r
+\r
+  @param[in] Command            Points to the NULL-terminated shell command or existing alias.\r
+  @param[in] Alias              Points to the NULL-terminated alias for the shell command. If this is NULL, and\r
+                                Command refers to an alias, that alias will be deleted.\r
+  @param[in] Replace            If TRUE and the alias already exists, then the existing alias will be replaced. If\r
+                                FALSE and the alias already exists, then the existing alias is unchanged and\r
+                                EFI_ACCESS_DENIED is returned.\r
+  @param[in] Volatile           if TRUE the Alias being set will be stored in a volatile fashion.  if FALSE the\r
+                                Alias being set will be stored in a non-volatile fashion.\r
+\r
+  @retval SHELL_SUCCESS        Alias created or deleted successfully.\r
+  @retval SHELL_NOT_FOUND       the Alias intended to be deleted was not found\r
+  @retval SHELL_ACCESS_DENIED   The alias is a built-in alias or already existed and Replace was set to\r
+                                FALSE.\r
+  @retval SHELL_DEVICE_ERROR    Command is null or the empty string.\r
+**/\r
+SHELL_STATUS\r
+ShellLevel3CommandsLibSetAlias(\r
+  IN CONST CHAR16 *Command,\r
+  IN CONST CHAR16 *Alias,\r
+  IN BOOLEAN Replace,\r
+  IN BOOLEAN Volatile\r
+  )\r
+{\r
+  SHELL_STATUS        ShellStatus;\r
+  EFI_STATUS          Status;\r
+\r
+  ShellStatus = SHELL_SUCCESS;\r
+  Status = gEfiShellProtocol->SetAlias (Command, Alias, Replace, Volatile);\r
+  if (EFI_ERROR(Status)) {\r
+    if (Status == EFI_ACCESS_DENIED) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias");\r
+      ShellStatus = SHELL_ACCESS_DENIED;\r
+    } else if (Status == EFI_NOT_FOUND) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Command);\r
+      ShellStatus = SHELL_NOT_FOUND;\r
+    } else {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status);\r
+      ShellStatus = SHELL_DEVICE_ERROR;\r
+    }\r
+  }\r
+  return ShellStatus;\r
+}\r
+\r
 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
   {L"-v", TypeFlag},\r
-  {L"-d", TypeFlag},\r
+  {L"-d", TypeValue},\r
   {NULL, TypeMax}\r
   };\r
 \r
@@ -90,9 +162,10 @@ ShellCommandRunAlias (
   SHELL_STATUS        ShellStatus;\r
   CONST CHAR16        *Param1;\r
   CONST CHAR16        *Param2;\r
+  CONST CHAR16        *ParamStrD;\r
   CHAR16              *CleanParam2;\r
-  CONST CHAR16        *ConstAliasVal;\r
-  BOOLEAN             Volatile;\r
+  BOOLEAN             DeleteFlag;\r
+  BOOLEAN             VolatileFlag;\r
 \r
   ProblemParam        = NULL;\r
   ShellStatus         = SHELL_SUCCESS;\r
@@ -123,9 +196,13 @@ ShellCommandRunAlias (
     Param1 = ShellCommandLineGetRawValue(Package, 1);\r
     Param2 = ShellCommandLineGetRawValue(Package, 2);\r
 \r
+    DeleteFlag   = ShellCommandLineGetFlag (Package, L"-d");\r
+    VolatileFlag = ShellCommandLineGetFlag (Package, L"-v");\r
+\r
     if (Param2 != NULL) {\r
       CleanParam2 = AllocateCopyPool (StrSize(Param2), Param2);\r
       if (CleanParam2 == NULL) {\r
+        ShellCommandLineFreeVarList (Package);\r
         return SHELL_OUT_OF_RESOURCES;\r
       }\r
 \r
@@ -135,65 +212,68 @@ ShellCommandRunAlias (
       }\r
     }\r
 \r
-    //\r
-    // check for "-?"\r
-    //\r
-    if (ShellCommandLineGetFlag(Package, L"-?")) {\r
-      ASSERT(FALSE);\r
-    }\r
-    if (ShellCommandLineGetCount(Package) == 1) {\r
-      //\r
-      // print out alias'\r
-      //\r
-      Status = PrintAllShellAlias();\r
-    } else if (ShellCommandLineGetFlag(Package, L"-d")) {\r
-      //\r
-      // delete an alias\r
-      //\r
-      Status = gEfiShellProtocol->SetAlias(Param1, NULL, TRUE, FALSE);\r
-      if (EFI_ERROR(Status)) {\r
-        if (Status == EFI_ACCESS_DENIED) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias");\r
-          ShellStatus = SHELL_ACCESS_DENIED;\r
-        } else if (Status == EFI_NOT_FOUND) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Param1);\r
-          ShellStatus = SHELL_NOT_FOUND;\r
-        } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status);\r
-          ShellStatus = SHELL_DEVICE_ERROR;\r
-        }\r
+    if (!DeleteFlag && !VolatileFlag) {\r
+      switch (ShellCommandLineGetCount (Package)) {\r
+        case 1:\r
+          //\r
+          // "alias"\r
+          //\r
+          ShellStatus = PrintAllShellAlias ();\r
+          break;\r
+        case 2:\r
+          //\r
+          // "alias Param1"\r
+          //\r
+          ShellStatus = PrintSingleShellAlias (Param1);\r
+          break;\r
+        case 3:\r
+          //\r
+          // "alias Param1 CleanParam2"\r
+          //\r
+          ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
+          break;\r
+        default:\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
       }\r
-    } else if (ShellCommandLineGetCount(Package) == 3) {\r
-      //\r
-      // must be adding an alias\r
-      //\r
-      Status = gEfiShellProtocol->SetAlias(CleanParam2, Param1, FALSE, ShellCommandLineGetFlag(Package, L"-v"));\r
-      if (EFI_ERROR(Status)) {\r
-        if (Status == EFI_ACCESS_DENIED) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias");  \r
-          ShellStatus = SHELL_ACCESS_DENIED;\r
+    } else if (DeleteFlag) {\r
+      if (VolatileFlag || ShellCommandLineGetCount (Package) > 1) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+      } else {\r
+        ParamStrD = ShellCommandLineGetValue (Package, L"-d");\r
+        if (ParamStrD == NULL) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status);  \r
-          ShellStatus = SHELL_DEVICE_ERROR;\r
+          //\r
+          // Delete an alias: "alias -d ParamStrD"\r
+          //\r
+          ShellStatus = ShellLevel3CommandsLibSetAlias (ParamStrD, NULL, TRUE, FALSE);\r
         }\r
       }\r
-    } else if (ShellCommandLineGetCount(Package) == 2) {\r
+    } else {\r
       //\r
-      // print out a single alias\r
+      // Set volatile alias.\r
       //\r
-      ConstAliasVal = gEfiShellProtocol->GetAlias(Param1, &Volatile);\r
-      if (ConstAliasVal == NULL) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Param1);\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
-      } else {\r
-        if (ShellCommandIsOnAliasList(Param1)) {\r
-          Volatile = FALSE;\r
-        }\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile?L' ':L'*', Param1, ConstAliasVal);\r
-      }      \r
-    } else {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");  \r
-      ShellStatus = SHELL_INVALID_PARAMETER;\r
+      ASSERT (VolatileFlag);\r
+      ASSERT (!DeleteFlag); \r
+      switch (ShellCommandLineGetCount (Package)) {\r
+        case 1:\r
+        case 2:\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          break;\r
+        case 3:\r
+          //\r
+          // "alias -v Param1 CleanParam2"\r
+          //\r
+          ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
+          break;\r
+        default:\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+      }\r
     }\r
     //\r
     // free the command line package\r