]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ShellParametersProtocol.c
ShellPkg: acpiview: Add GT Frame Number validation to GTDT parser
[mirror_edk2.git] / ShellPkg / Application / Shell / ShellParametersProtocol.c
index 9c502f8f212e70290706b18c874b02582bb8fbb4..bcd8f0ae21121fded04ea5c23a003bf84cdc94b4 100644 (file)
@@ -2,16 +2,11 @@
   Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation,\r
   manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL.\r
 \r
+  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
   Copyright (C) 2014, Red Hat, Inc.\r
   (C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>\r
-  Copyright (c) 2009 - 2015, 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
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -25,7 +20,6 @@ BOOLEAN AsciiRedirection = FALSE;
   @param[in] String        the string to parse\r
 **/\r
 CONST CHAR16*\r
-EFIAPI\r
 FindEndOfParameter(\r
   IN CONST CHAR16 *String\r
   )\r
@@ -74,20 +68,22 @@ FindEndOfParameter(
 \r
   This will also remove all remaining ^ characters after processing.\r
 \r
-  @param[in, out] Walker        pointer to string of command line.  Adjusted to\r
-                                reminaing command line on return\r
-  @param[in, out] TempParameter pointer to string of command line item extracted.\r
-  @param[in]      Length        buffer size of TempParameter.\r
+  @param[in, out] Walker          pointer to string of command line.  Adjusted to\r
+                                  reminaing command line on return\r
+  @param[in, out] TempParameter   pointer to string of command line item extracted.\r
+  @param[in]      Length          buffer size of TempParameter.\r
+  @param[in]      StripQuotation  if TRUE then strip the quotation marks surrounding\r
+                                  the parameters.\r
 \r
   @return   EFI_INALID_PARAMETER  A required parameter was NULL or pointed to a NULL or empty string.\r
   @return   EFI_NOT_FOUND         A closing " could not be found on the specified string\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 GetNextParameter(\r
   IN OUT CHAR16   **Walker,\r
   IN OUT CHAR16   **TempParameter,\r
-  IN CONST UINTN  Length\r
+  IN CONST UINTN  Length,\r
+  IN BOOLEAN      StripQuotation\r
   )\r
 {\r
   CONST CHAR16 *NextDelim;\r
@@ -145,8 +141,8 @@ DEBUG_CODE_END();
   // Remove any non-escaped quotes in the string\r
   // Remove any remaining escape characters in the string\r
   //\r
-  for (NextDelim = FindFirstCharacter(*TempParameter, L"\"^", CHAR_NULL) \r
-    ; *NextDelim != CHAR_NULL \r
+  for (NextDelim = FindFirstCharacter(*TempParameter, L"\"^", CHAR_NULL)\r
+    ; *NextDelim != CHAR_NULL\r
     ; NextDelim = FindFirstCharacter(NextDelim, L"\"^", CHAR_NULL)\r
     ) {\r
     if (*NextDelim == L'^') {\r
@@ -161,7 +157,11 @@ DEBUG_CODE_END();
       //\r
       // eliminate the unescaped quote\r
       //\r
-      CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+      if (StripQuotation) {\r
+        CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+    } else{\r
+        NextDelim++;\r
+    }\r
     }\r
   }\r
 \r
@@ -175,22 +175,24 @@ DEBUG_CODE_END();
   parameters for inclusion in EFI_SHELL_PARAMETERS_PROTOCOL.  this supports space\r
   delimited and quote surrounded parameter definition.\r
 \r
-  All special character processing (alias, environment variable, redirection, \r
+  All special character processing (alias, environment variable, redirection,\r
   etc... must be complete before calling this API.\r
 \r
-  @param[in] CommandLine         String of command line to parse\r
-  @param[in, out] Argv           pointer to array of strings; one for each parameter\r
-  @param[in, out] Argc           pointer to number of strings in Argv array\r
+  @param[in] CommandLine          String of command line to parse\r
+  @param[in] StripQuotation       if TRUE then strip the quotation marks surrounding\r
+                                  the parameters.\r
+  @param[in, out] Argv            pointer to array of strings; one for each parameter\r
+  @param[in, out] Argc            pointer to number of strings in Argv array\r
 \r
   @return EFI_SUCCESS           the operation was sucessful\r
   @return EFI_OUT_OF_RESOURCES  a memory allocation failed.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 ParseCommandLineToArgs(\r
   IN CONST CHAR16 *CommandLine,\r
-  IN OUT CHAR16 ***Argv,\r
-  IN OUT UINTN *Argc\r
+  IN BOOLEAN      StripQuotation,\r
+  IN OUT CHAR16   ***Argv,\r
+  IN OUT UINTN    *Argc\r
   )\r
 {\r
   UINTN       Count;\r
@@ -228,7 +230,7 @@ ParseCommandLineToArgs(
       ; Walker != NULL && *Walker != CHAR_NULL\r
       ; Count++\r
       ) {\r
-    if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {\r
+    if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, TRUE))) {\r
       break;\r
     }\r
   }\r
@@ -246,7 +248,7 @@ ParseCommandLineToArgs(
   Walker = (CHAR16*)NewCommandLine;\r
   while(Walker != NULL && *Walker != CHAR_NULL) {\r
     SetMem16(TempParameter, Size, CHAR_NULL);\r
-    if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {\r
+    if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, StripQuotation))) {\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Done;\r
     }\r
@@ -261,7 +263,7 @@ ParseCommandLineToArgs(
   }\r
   ASSERT(Count >= (*Argc));\r
   Status = EFI_SUCCESS;\r
-  \r
+\r
 Done:\r
   SHELL_FREE_NON_NULL(TempParameter);\r
   SHELL_FREE_NON_NULL(NewCommandLine);\r
@@ -285,7 +287,6 @@ Done:
   @sa ParseCommandLineToArgs\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 CreatePopulateInstallShellParametersProtocol (\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  **NewShellParameters,\r
   IN OUT BOOLEAN                        *RootShellInstance\r
@@ -375,6 +376,7 @@ CreatePopulateInstallShellParametersProtocol (
     // Populate Argc and Argv\r
     //\r
     Status = ParseCommandLineToArgs(FullCommandLine,\r
+                                    TRUE,\r
                                     &(*NewShellParameters)->Argv,\r
                                     &(*NewShellParameters)->Argc);\r
 \r
@@ -426,7 +428,6 @@ CreatePopulateInstallShellParametersProtocol (
   @sa UninstallProtocolInterface\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 CleanUpShellParametersProtocol (\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *NewShellParameters\r
   )\r
@@ -473,7 +474,6 @@ CleanUpShellParametersProtocol (
   @return An error upon failure.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 IsUnicodeFile(\r
   IN CONST CHAR16 *FileName\r
   )\r
@@ -497,7 +497,7 @@ IsUnicodeFile(
   }\r
   gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
   gEfiShellProtocol->CloseFile(Handle);\r
-  return (Status);  \r
+  return (Status);\r
 }\r
 \r
 /**\r
@@ -508,7 +508,6 @@ IsUnicodeFile(
   @param[in, out] TheString  A pointer to the string to update.\r
 **/\r
 VOID\r
-EFIAPI\r
 StripQuotes (\r
   IN OUT CHAR16 *TheString\r
   )\r
@@ -560,7 +559,6 @@ CalculateEfiHdrCrc (
   @return       The modified FileName.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 FixFileName (\r
   IN CHAR16 *FileName\r
   )\r
@@ -576,7 +574,7 @@ FixFileName (
     Copy = FileName+1;\r
     if ((TempLocation = StrStr(Copy , L"\"")) != NULL) {\r
       TempLocation[0] = CHAR_NULL;\r
-    }    \r
+    }\r
   } else {\r
     Copy = FileName;\r
     while(Copy[0] == L' ') {\r
@@ -584,7 +582,7 @@ FixFileName (
     }\r
     if ((TempLocation = StrStr(Copy , L" ")) != NULL) {\r
       TempLocation[0] = CHAR_NULL;\r
-    }    \r
+    }\r
   }\r
 \r
   if (Copy[0] == CHAR_NULL) {\r
@@ -603,7 +601,6 @@ FixFileName (
   @return       The modified FileName.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 FixVarName (\r
   IN CHAR16 *FileName\r
   )\r
@@ -617,37 +614,12 @@ FixVarName (
     Copy = FileName+1;\r
     if ((TempLocation = StrStr(Copy , L"%")) != NULL) {\r
       TempLocation[0] = CHAR_NULL;\r
-    }    \r
+    }\r
   }\r
 \r
   return (FixFileName(Copy));\r
 }\r
 \r
-/**\r
-  Remove the unicode file tag from the begining of the file buffer since that will not be\r
-  used by StdIn.\r
-  \r
-  @param[in]  Handle    Pointer to the handle of the file to be processed.\r
-  \r
-  @retval EFI_SUCCESS   The unicode file tag has been moved successfully.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-RemoveFileTag(\r
-  IN SHELL_FILE_HANDLE *Handle\r
-  )\r
-{\r
-  UINTN             CharSize;\r
-  CHAR16            CharBuffer;\r
-\r
-  CharSize    = sizeof(CHAR16);\r
-  CharBuffer  = 0;\r
-  gEfiShellProtocol->ReadFile(*Handle, &CharSize, &CharBuffer);\r
-  if (CharBuffer != gUnicodeFileTag) {\r
-    gEfiShellProtocol->SetFilePosition(*Handle, 0);\r
-  }\r
-  return (EFI_SUCCESS);\r
-}\r
 \r
 /**\r
   Write the unicode file tag to the specified file.\r
@@ -696,7 +668,6 @@ WriteFileTag (
   @retval   EFI_OUT_OF_RESOURCES        A memory allocation failed.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 UpdateStdInStdOutStdErr(\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters,\r
   IN CHAR16                             *NewCommandLine,\r
@@ -725,6 +696,7 @@ UpdateStdInStdOutStdErr(
   UINTN             Size;\r
   SPLIT_LIST        *Split;\r
   CHAR16            *FirstLocation;\r
+  BOOLEAN           Volatile;\r
 \r
   OutUnicode      = TRUE;\r
   InUnicode       = TRUE;\r
@@ -835,7 +807,7 @@ UpdateStdInStdOutStdErr(
     if (StrStr(CommandLineWalker, L" 1>> ") != NULL) {\r
       Status = EFI_NOT_FOUND;\r
     }\r
-  } \r
+  }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >> ")) != NULL) {\r
     FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
@@ -862,7 +834,7 @@ UpdateStdInStdOutStdErr(
     if (StrStr(CommandLineWalker, L" >>a ") != NULL) {\r
       Status = EFI_NOT_FOUND;\r
     }\r
-  } \r
+  }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>a ")) != NULL) {\r
     FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
@@ -876,7 +848,7 @@ UpdateStdInStdOutStdErr(
     if (StrStr(CommandLineWalker, L" 1>a ") != NULL) {\r
       Status = EFI_NOT_FOUND;\r
     }\r
-  } \r
+  }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >a ")) != NULL) {\r
     FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
@@ -1032,9 +1004,9 @@ UpdateStdInStdOutStdErr(
   StrnCpyS(CommandLineCopy, StrSize(CommandLineCopy)/sizeof(CHAR16), NewCommandLine, StrLen(NewCommandLine));\r
 \r
   if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)\r
-    && ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))\r
+    && (((UINTN)FirstLocation - (UINTN)CommandLineCopy)/sizeof(CHAR16) < StrLen(NewCommandLine))\r
     ){\r
-    *(NewCommandLine + (UINTN)(FirstLocation - CommandLineCopy)) = CHAR_NULL;\r
+    *(NewCommandLine + ((UINTN)FirstLocation - (UINTN)CommandLineCopy)/sizeof(CHAR16)) = CHAR_NULL;\r
   }\r
 \r
   if (!EFI_ERROR(Status)) {\r
@@ -1100,12 +1072,12 @@ UpdateStdInStdOutStdErr(
       //\r
       // Check for no volatile environment variables\r
       //\r
-      ||(StdErrVarName  != NULL && !IsVolatileEnv(StdErrVarName))\r
-      ||(StdOutVarName  != NULL && !IsVolatileEnv(StdOutVarName))\r
+      ||(StdErrVarName  != NULL && !EFI_ERROR (IsVolatileEnv (StdErrVarName, &Volatile)) && !Volatile)\r
+      ||(StdOutVarName  != NULL && !EFI_ERROR (IsVolatileEnv (StdOutVarName, &Volatile)) && !Volatile)\r
       //\r
       // Cant redirect during a reconnect operation.\r
       //\r
-      ||(StrStr(NewCommandLine, L"connect -r") != NULL \r
+      ||(StrStr(NewCommandLine, L"connect -r") != NULL\r
          && (StdOutVarName != NULL || StdOutFileName != NULL || StdErrFileName != NULL || StdErrVarName != NULL))\r
       //\r
       // Check that filetypes (Unicode/Ascii) do not change during an append\r
@@ -1162,7 +1134,7 @@ UpdateStdInStdOutStdErr(
         if (TempHandle == NULL) {\r
           Status = EFI_INVALID_PARAMETER;\r
         } else {\r
-          if (StrStr(StdOutFileName, L"NUL")==StdOutFileName) {\r
+          if (gUnicodeCollation->MetaiMatch (gUnicodeCollation, StdOutFileName, L"NUL")) {\r
             //no-op\r
           } else if (!OutAppend && OutUnicode && !EFI_ERROR(Status)) {\r
             Status = WriteFileTag (TempHandle);\r
@@ -1254,18 +1226,13 @@ UpdateStdInStdOutStdErr(
           &TempHandle,\r
           EFI_FILE_MODE_READ,\r
           0);\r
-        if (InUnicode) {\r
-          //\r
-          // Chop off the 0xFEFF if it's there...\r
-          //\r
-          RemoveFileTag(&TempHandle);\r
-        } else if (!EFI_ERROR(Status)) {\r
-          //\r
-          // Create the ASCII->Unicode conversion layer\r
-          //\r
-          TempHandle = CreateFileInterfaceFile(TempHandle, FALSE);\r
-        }\r
         if (!EFI_ERROR(Status)) {\r
+          if (!InUnicode) {\r
+            //\r
+            // Create the ASCII->Unicode conversion layer\r
+            //\r
+            TempHandle = CreateFileInterfaceFile(TempHandle, FALSE);\r
+          }\r
           ShellParameters->StdIn = TempHandle;\r
           gST->ConIn = CreateSimpleTextInOnFile(TempHandle, &gST->ConsoleInHandle);\r
         }\r
@@ -1300,7 +1267,6 @@ UpdateStdInStdOutStdErr(
   @param[in] SystemTableInfo           Pointer to old system table information.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 RestoreStdInStdOutStdErr (\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters,\r
   IN  SHELL_FILE_HANDLE                 *OldStdIn,\r
@@ -1311,7 +1277,7 @@ RestoreStdInStdOutStdErr (
 {\r
   SPLIT_LIST        *Split;\r
 \r
-  if (ShellParameters == NULL \r
+  if (ShellParameters == NULL\r
     ||OldStdIn        == NULL\r
     ||OldStdOut       == NULL\r
     ||OldStdErr       == NULL\r
@@ -1369,6 +1335,7 @@ RestoreStdInStdOutStdErr (
 \r
   @param[in, out] ShellParameters        Pointer to parameter structure to modify.\r
   @param[in] NewCommandLine              The new command line to parse and use.\r
+  @param[in] Type                        The type of operation.\r
   @param[out] OldArgv                    Pointer to old list of parameters.\r
   @param[out] OldArgc                    Pointer to old number of items in Argv list.\r
 \r
@@ -1376,15 +1343,18 @@ RestoreStdInStdOutStdErr (
   @retval   EFI_OUT_OF_RESOURCES        A memory allocation failed.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 UpdateArgcArgv(\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters,\r
   IN CONST CHAR16                       *NewCommandLine,\r
+  IN SHELL_OPERATION_TYPES              Type,\r
   OUT CHAR16                            ***OldArgv OPTIONAL,\r
   OUT UINTN                             *OldArgc OPTIONAL\r
   )\r
 {\r
+  BOOLEAN                 StripParamQuotation;\r
+\r
   ASSERT(ShellParameters != NULL);\r
+  StripParamQuotation = TRUE;\r
 \r
   if (OldArgc != NULL) {\r
     *OldArgc = ShellParameters->Argc;\r
@@ -1393,7 +1363,15 @@ UpdateArgcArgv(
     *OldArgv = ShellParameters->Argv;\r
   }\r
 \r
-  return (ParseCommandLineToArgs(NewCommandLine, &(ShellParameters->Argv), &(ShellParameters->Argc)));\r
+  if (Type == Script_File_Name) {\r
+    StripParamQuotation = FALSE;\r
+  }\r
+\r
+  return ParseCommandLineToArgs( NewCommandLine,\r
+                                 StripParamQuotation,\r
+                                 &(ShellParameters->Argv),\r
+                                 &(ShellParameters->Argc)\r
+                                );\r
 }\r
 \r
 /**\r
@@ -1406,7 +1384,6 @@ UpdateArgcArgv(
   @param[in] OldArgc                    pointer to old number of items in Argv list\r
 **/\r
 VOID\r
-EFIAPI\r
 RestoreArgcArgv(\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters,\r
   IN CHAR16                             ***OldArgv,\r