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
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
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
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
UINTN Size;\r
CHAR16 TagBuffer[2];\r
SPLIT_LIST *Split;\r
+ CHAR16 *FirstLocation;\r
\r
OutUnicode = TRUE;\r
InUnicode = TRUE;\r
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
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
}\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
}\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
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
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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
}\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
//\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
||(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
||(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