]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ShellParametersProtocol.c
Comment's added and fixed.
[mirror_edk2.git] / ShellPkg / Application / Shell / ShellParametersProtocol.c
index 3d138825ff69c4cd73c6743cca64eeecd0e56bfe..238ccd96811867382f868d07f254d228ab8b5ce9 100644 (file)
@@ -73,10 +73,6 @@ GetNextParameter(
         TempLoc++;\r
       } else if (*TempLoc == L'^' && *(TempLoc+1) == L'\"') {\r
         TempLoc++;\r
-      } else if (*TempLoc == L'^' && *(TempLoc+1) == L'|') {\r
-        TempLoc++;\r
-      } else if (*TempLoc == L'^') {\r
-        *TempLoc = L' ';\r
       } else if (*TempLoc == L'\"') {\r
         NextDelim = TempLoc;\r
         break;\r
@@ -419,6 +415,14 @@ CleanUpShellParametersProtocol (
   return (Status);\r
 }\r
 \r
+/**\r
+  Determin if a file name represents a unicode file.\r
+\r
+  @param[in] FileName     Pointer to the filename to open.\r
+\r
+  @retval EFI_SUCCESS     The file is a unicode file.\r
+  @return An error upon failure.\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsUnicodeFile(\r
@@ -447,6 +451,30 @@ IsUnicodeFile(
   return (Status);  \r
 }\r
 \r
+/**\r
+  Strips out quotes sections of a string.\r
+\r
+  All of the characters between quotes is replaced with spaces.\r
+**/\r
+VOID\r
+EFIAPI\r
+StripQuotes (\r
+  IN OUT CHAR16 *TheString\r
+  )\r
+{\r
+  BOOLEAN RemoveNow;\r
+\r
+  for (RemoveNow = FALSE ; TheString != NULL && *TheString != CHAR_NULL ; TheString++) {\r
+    if (*TheString == L'^' && *(TheString + 1) == L'\"') {\r
+      TheString++;\r
+    } else if (*TheString == L'\"') {\r
+      RemoveNow = (BOOLEAN)!RemoveNow;\r
+    } else if (RemoveNow) {\r
+      *TheString = L' ';\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   Funcion will replace the current StdIn and StdOut in the ShellParameters protocol\r
   structure by parsing NewCommandLine.  The current values are returned to the\r
@@ -468,7 +496,7 @@ EFI_STATUS
 EFIAPI\r
 UpdateStdInStdOutStdErr(\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters,\r
-  IN CONST CHAR16                       *NewCommandLine,\r
+  IN CHAR16                             *NewCommandLine,\r
   OUT SHELL_FILE_HANDLE                 *OldStdIn,\r
   OUT SHELL_FILE_HANDLE                 *OldStdOut,\r
   OUT SHELL_FILE_HANDLE                 *OldStdErr,\r
@@ -494,6 +522,7 @@ UpdateStdInStdOutStdErr(
   UINTN             Size;\r
   CHAR16            TagBuffer[2];\r
   SPLIT_LIST        *Split;\r
+  CHAR16            *FirstLocation;\r
 \r
   OutUnicode      = TRUE;\r
   InUnicode       = TRUE;\r
@@ -507,6 +536,7 @@ UpdateStdInStdOutStdErr(
   ErrAppend       = FALSE;\r
   OutAppend       = FALSE;\r
   CommandLineCopy = NULL;\r
+  FirstLocation   = NULL;\r
 \r
   if (ShellParameters == NULL || SystemTableInfo == NULL || OldStdIn == NULL || OldStdOut == NULL || OldStdErr == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
@@ -529,6 +559,9 @@ UpdateStdInStdOutStdErr(
   CommandLineCopy = StrnCatGrow(&CommandLineCopy, NULL, NewCommandLine, 0);\r
   Status          = EFI_SUCCESS;\r
   Split           = NULL;\r
+  FirstLocation   = CommandLineCopy + StrLen(CommandLineCopy);\r
+\r
+  StripQuotes(CommandLineCopy);\r
 \r
   if (!IsListEmpty(&ShellInfoObject.SplitList.Link)) {\r
     Split = (SPLIT_LIST*)GetFirstNode(&ShellInfoObject.SplitList.Link);\r
@@ -541,6 +574,7 @@ UpdateStdInStdOutStdErr(
   }\r
 \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 2>>v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 12, L' ');\r
     StdErrVarName   = CommandLineWalker += 6;\r
     ErrAppend       = TRUE;\r
@@ -549,6 +583,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>>v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 12, L' ');\r
     StdOutVarName   = CommandLineWalker += 6;\r
     OutAppend       = TRUE;\r
@@ -556,6 +591,7 @@ UpdateStdInStdOutStdErr(
       Status = EFI_NOT_FOUND;\r
     }\r
   } else if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >>v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     StdOutVarName   = CommandLineWalker += 5;\r
     OutAppend       = TRUE;\r
@@ -563,6 +599,7 @@ UpdateStdInStdOutStdErr(
       Status = EFI_NOT_FOUND;\r
     }\r
   } else if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     StdOutVarName   = CommandLineWalker += 4;\r
     OutAppend       = FALSE;\r
@@ -571,6 +608,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>>a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 12, L' ');\r
     StdOutFileName  = CommandLineWalker += 6;\r
     OutAppend       = TRUE;\r
@@ -580,6 +618,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>> ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -592,6 +631,7 @@ UpdateStdInStdOutStdErr(
     }\r
   } \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >> ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -604,6 +644,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >>a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -617,6 +658,7 @@ UpdateStdInStdOutStdErr(
     }\r
   } \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -630,6 +672,7 @@ UpdateStdInStdOutStdErr(
     }\r
   } \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -643,6 +686,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 2>> ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdErrFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -656,6 +700,7 @@ UpdateStdInStdOutStdErr(
   }\r
 \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 2>v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdErrVarName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -668,6 +713,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdOutVarName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -680,6 +726,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 2>a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 10, L' ');\r
     if (StdErrFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -693,6 +740,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 2> ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdErrFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -706,6 +754,7 @@ UpdateStdInStdOutStdErr(
   }\r
 \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1> ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -719,6 +768,7 @@ UpdateStdInStdOutStdErr(
   }\r
 \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" > ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 6, L' ');\r
     if (StdOutFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -732,6 +782,7 @@ UpdateStdInStdOutStdErr(
   }\r
 \r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" < ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 6, L' ');\r
     if (StdInFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -743,6 +794,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" <a ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdInFileName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -755,6 +807,7 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
   if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" <v ")) != NULL) {\r
+    FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
     SetMem16(CommandLineWalker, 8, L' ');\r
     if (StdInVarName != NULL) {\r
       Status = EFI_INVALID_PARAMETER;\r
@@ -766,6 +819,12 @@ UpdateStdInStdOutStdErr(
     }\r
   }\r
 \r
+  if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)\r
+    && ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))\r
+    ){\r
+    *(NewCommandLine + (UINTN)(FirstLocation - CommandLineCopy)) = CHAR_NULL;\r
+  }\r
+\r
   if (!EFI_ERROR(Status)) {\r
     if (StdErrFileName != NULL && (CommandLineWalker = StrStr(StdErrFileName, L" ")) != NULL) {\r
       CommandLineWalker[0] = CHAR_NULL;\r
@@ -793,7 +852,7 @@ UpdateStdInStdOutStdErr(
       //\r
       // Check that no 2 filenames are the same\r
       //\r
-        (StdErrFileName != NULL && StdOutFileName!= NULL && StringNoCaseCompare(&StdErrFileName, &StdOutFileName) == 0)\r
+      (StdErrFileName != NULL && StdOutFileName!= NULL && StringNoCaseCompare(&StdErrFileName, &StdOutFileName) == 0)\r
       ||(StdErrFileName != NULL && StdInFileName != NULL && StringNoCaseCompare(&StdErrFileName, &StdInFileName ) == 0)\r
       ||(StdOutFileName != NULL && StdInFileName != NULL && StringNoCaseCompare(&StdOutFileName, &StdInFileName ) == 0)\r
       //\r
@@ -814,11 +873,6 @@ UpdateStdInStdOutStdErr(
       ||(StdOutFileName != NULL && StdOutVarName != NULL)\r
       ||(StdInFileName  != NULL && StdInVarName  != NULL)\r
       //\r
-      // There should not be extra > or <\r
-      //\r
-      ||(StrStr(CommandLineCopy, L"<") != NULL)\r
-      ||(StrStr(CommandLineCopy, L">") != NULL)\r
-      //\r
       // Check for no volatile environment variables\r
       //\r
       ||(StdErrVarName  != NULL && !IsVolatileEnv(StdErrVarName))\r
@@ -837,7 +891,7 @@ UpdateStdInStdOutStdErr(
       ||(StdErrFileName != NULL && !ErrUnicode && ErrAppend && (!EFI_ERROR(ShellFileExists(StdErrFileName)) && !EFI_ERROR(IsUnicodeFile(StdErrFileName))))\r
       ){\r
       Status = EFI_INVALID_PARAMETER;\r
-    } else {\r
+    } else if (!EFI_ERROR(Status)){\r
       //\r
       // Open the Std<Whatever> and we should not have conflicts here...\r
       //\r