Revision: 19402
http://sourceforge.net/p/edk2/code/19402
Author: vanjeff
Date: 2015-12-18 07:34:43 +0000 (Fri, 18 Dec 2015)
Log Message:
-----------
ShellPkg: Don't strip positional parameters of quotation marks.
Per Shell SPEC 2.1 'Double-quotation marks that surround arguments are not
stripped in positional parameters'. This patch makes Shell implementation to
follow SPEC.
(Sync patch r18742 from main trunk.)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>
Revision Links:
--------------
http://sourceforge.net/p/edk2/code/18742
Modified Paths:
--------------
branches/UDK2015/ShellPkg/Application/Shell/Shell.c
branches/UDK2015/ShellPkg/Application/Shell/Shell.h
branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c
branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.h
branches/UDK2015/ShellPkg/Application/Shell/ShellProtocol.c
Modified: branches/UDK2015/ShellPkg/Application/Shell/Shell.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/Shell.c 2015-12-18 07:34:01 UTC
(rev 19401)
+++ branches/UDK2015/ShellPkg/Application/Shell/Shell.c 2015-12-18 07:34:43 UTC
(rev 19402)
@@ -1863,7 +1863,7 @@
return (EFI_OUT_OF_RESOURCES);
}
TempWalker = (CHAR16*)Temp;
- if (!EFI_ERROR(GetNextParameter(&TempWalker, &FirstParameter,
StrSize(CmdLine)))) {
+ if (!EFI_ERROR(GetNextParameter(&TempWalker, &FirstParameter,
StrSize(CmdLine), TRUE))) {
if (GetOperationType(FirstParameter) == Unknown_Invalid) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND),
ShellInfoObject.HiiHandle, FirstParameter);
SetLastError(SHELL_NOT_FOUND);
@@ -2029,7 +2029,7 @@
Walker = *CmdLine;
while(Walker != NULL && *Walker != CHAR_NULL) {
- if (!EFI_ERROR(GetNextParameter(&Walker, &CurrentParameter,
StrSize(*CmdLine)))) {
+ if (!EFI_ERROR(GetNextParameter(&Walker, &CurrentParameter,
StrSize(*CmdLine), TRUE))) {
if (StrStr(CurrentParameter, L"-?") == CurrentParameter) {
CurrentParameter[0] = L' ';
CurrentParameter[1] = L' ';
@@ -2173,7 +2173,7 @@
//
// get the argc and argv updated for internal commands
//
- Status = UpdateArgcArgv(ParamProtocol, NewCmdLine, &Argv, &Argc);
+ Status = UpdateArgcArgv(ParamProtocol, NewCmdLine, Internal_Command, &Argv,
&Argc);
if (!EFI_ERROR(Status)) {
//
// Run the internal command.
@@ -2520,7 +2520,7 @@
return (EFI_OUT_OF_RESOURCES);
}
TempWalker = CleanOriginal;
- if (!EFI_ERROR(GetNextParameter(&TempWalker, &FirstParameter,
StrSize(CleanOriginal)))) {
+ if (!EFI_ERROR(GetNextParameter(&TempWalker, &FirstParameter,
StrSize(CleanOriginal), TRUE))) {
//
// Depending on the first parameter we change the behavior
//
@@ -2767,34 +2767,34 @@
if (NewScriptFile->Argv != NULL) {
switch (NewScriptFile->Argc) {
default:
- Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%9", NewScriptFile->Argv[9], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%9", NewScriptFile->Argv[9], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 9:
- Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%8", NewScriptFile->Argv[8], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%8", NewScriptFile->Argv[8], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 8:
- Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%7", NewScriptFile->Argv[7], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%7", NewScriptFile->Argv[7], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 7:
- Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%6", NewScriptFile->Argv[6], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%6", NewScriptFile->Argv[6], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 6:
- Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%5", NewScriptFile->Argv[5], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%5", NewScriptFile->Argv[5], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 5:
- Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%4", NewScriptFile->Argv[4], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%4", NewScriptFile->Argv[4], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 4:
- Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%3", NewScriptFile->Argv[3], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%3", NewScriptFile->Argv[3], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 3:
- Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%2", NewScriptFile->Argv[2], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%2", NewScriptFile->Argv[2], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 2:
- Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%1", NewScriptFile->Argv[1], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine2, CommandLine,
PrintBuffSize, L"%1", NewScriptFile->Argv[1], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
case 1:
- Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%0", NewScriptFile->Argv[0], FALSE, TRUE);
+ Status = ShellCopySearchAndReplace(CommandLine, CommandLine2,
PrintBuffSize, L"%0", NewScriptFile->Argv[0], FALSE, FALSE);
ASSERT_EFI_ERROR(Status);
break;
case 0:
@@ -2944,7 +2944,7 @@
//
// get the argc and argv updated for scripts
//
- Status = UpdateArgcArgv(ParamProtocol, CmdLine, &Argv, &Argc);
+ Status = UpdateArgcArgv(ParamProtocol, CmdLine, Script_File_Name, &Argv,
&Argc);
if (!EFI_ERROR(Status)) {
if (Handle == NULL) {
Modified: branches/UDK2015/ShellPkg/Application/Shell/Shell.h
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/Shell.h 2015-12-18 07:34:01 UTC
(rev 19401)
+++ branches/UDK2015/ShellPkg/Application/Shell/Shell.h 2015-12-18 07:34:43 UTC
(rev 19402)
@@ -124,14 +124,6 @@
extern SHELL_INFO ShellInfoObject;
-typedef enum {
- Internal_Command,
- Script_File_Name,
- Efi_Application,
- File_Sys_Change,
- Unknown_Invalid
-} SHELL_OPERATION_TYPES;
-
/**
Converts the command line to it's post-processed form. this replaces
variables and alias' per UEFI Shell spec.
Modified: branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c
2015-12-18 07:34:01 UTC (rev 19401)
+++ branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c
2015-12-18 07:34:43 UTC (rev 19402)
@@ -74,10 +74,12 @@
This will also remove all remaining ^ characters after processing.
- @param[in, out] Walker pointer to string of command line. Adjusted to
- reminaing command line on return
- @param[in, out] TempParameter pointer to string of command line item
extracted.
- @param[in] Length buffer size of TempParameter.
+ @param[in, out] Walker pointer to string of command line. Adjusted
to
+ reminaing command line on return
+ @param[in, out] TempParameter pointer to string of command line item
extracted.
+ @param[in] Length buffer size of TempParameter.
+ @param[in] StripQuotation if TRUE then strip the quotation marks
surrounding
+ the parameters.
@return EFI_INALID_PARAMETER A required parameter was NULL or pointed to
a NULL or empty string.
@return EFI_NOT_FOUND A closing " could not be found on the
specified string
@@ -87,7 +89,8 @@
GetNextParameter(
IN OUT CHAR16 **Walker,
IN OUT CHAR16 **TempParameter,
- IN CONST UINTN Length
+ IN CONST UINTN Length,
+ IN BOOLEAN StripQuotation
)
{
CONST CHAR16 *NextDelim;
@@ -161,7 +164,11 @@
//
// eliminate the unescaped quote
//
- CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));
+ if (StripQuotation) {
+ CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));
+ } else{
+ NextDelim++;
+ }
}
}
@@ -178,9 +185,11 @@
All special character processing (alias, environment variable, redirection,
etc... must be complete before calling this API.
- @param[in] CommandLine String of command line to parse
- @param[in, out] Argv pointer to array of strings; one for each
parameter
- @param[in, out] Argc pointer to number of strings in Argv array
+ @param[in] CommandLine String of command line to parse
+ @param[in] StripQuotation if TRUE then strip the quotation marks
surrounding
+ the parameters.
+ @param[in, out] Argv pointer to array of strings; one for each
parameter
+ @param[in, out] Argc pointer to number of strings in Argv array
@return EFI_SUCCESS the operation was sucessful
@return EFI_OUT_OF_RESOURCES a memory allocation failed.
@@ -189,8 +198,9 @@
EFIAPI
ParseCommandLineToArgs(
IN CONST CHAR16 *CommandLine,
- IN OUT CHAR16 ***Argv,
- IN OUT UINTN *Argc
+ IN BOOLEAN StripQuotation,
+ IN OUT CHAR16 ***Argv,
+ IN OUT UINTN *Argc
)
{
UINTN Count;
@@ -228,7 +238,7 @@
; Walker != NULL && *Walker != CHAR_NULL
; Count++
) {
- if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, TRUE))) {
break;
}
}
@@ -246,7 +256,7 @@
Walker = (CHAR16*)NewCommandLine;
while(Walker != NULL && *Walker != CHAR_NULL) {
SetMem16(TempParameter, Size, CHAR_NULL);
- if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size,
StripQuotation))) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
@@ -375,6 +385,7 @@
// Populate Argc and Argv
//
Status = ParseCommandLineToArgs(FullCommandLine,
+ TRUE,
&(*NewShellParameters)->Argv,
&(*NewShellParameters)->Argc);
@@ -1369,6 +1380,7 @@
@param[in, out] ShellParameters Pointer to parameter structure to
modify.
@param[in] NewCommandLine The new command line to parse and use.
+ @param[in] Type The type of operation.
@param[out] OldArgv Pointer to old list of parameters.
@param[out] OldArgc Pointer to old number of items in
Argv list.
@@ -1380,11 +1392,15 @@
UpdateArgcArgv(
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,
IN CONST CHAR16 *NewCommandLine,
+ IN SHELL_OPERATION_TYPES Type,
OUT CHAR16 ***OldArgv OPTIONAL,
OUT UINTN *OldArgc OPTIONAL
)
{
+ BOOLEAN StripParamQuotation;
+
ASSERT(ShellParameters != NULL);
+ StripParamQuotation = TRUE;
if (OldArgc != NULL) {
*OldArgc = ShellParameters->Argc;
@@ -1393,7 +1409,15 @@
*OldArgv = ShellParameters->Argv;
}
- return (ParseCommandLineToArgs(NewCommandLine, &(ShellParameters->Argv),
&(ShellParameters->Argc)));
+ if (Type == Script_File_Name) {
+ StripParamQuotation = FALSE;
+ }
+
+ return ParseCommandLineToArgs( NewCommandLine,
+ StripParamQuotation,
+ &(ShellParameters->Argv),
+ &(ShellParameters->Argc)
+ );
}
/**
Modified: branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.h
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.h
2015-12-18 07:34:01 UTC (rev 19401)
+++ branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.h
2015-12-18 07:34:43 UTC (rev 19402)
@@ -18,6 +18,14 @@
#include "Shell.h"
+typedef enum {
+ Internal_Command,
+ Script_File_Name,
+ Efi_Application,
+ File_Sys_Change,
+ Unknown_Invalid
+} SHELL_OPERATION_TYPES;
+
/**
creates a new EFI_SHELL_PARAMETERS_PROTOCOL instance and populates it and
then
installs it on our handle and if there is an existing version of the protocol
@@ -66,6 +74,7 @@
@param[in, out] ShellParameters pointer to parameter structure to
modify
@param[in] NewCommandLine the new command line to parse and use
+ @param[in] Type the type of operation.
@param[out] OldArgv pointer to old list of parameters
@param[out] OldArgc pointer to old number of items in Argv
list
@@ -77,6 +86,7 @@
UpdateArgcArgv(
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,
IN CONST CHAR16 *NewCommandLine,
+ IN SHELL_OPERATION_TYPES Type,
OUT CHAR16 ***OldArgv,
OUT UINTN *OldArgc
);
@@ -162,9 +172,11 @@
parameters for inclusion in EFI_SHELL_PARAMETERS_PROTOCOL. this supports
space
delimited and quote surrounded parameter definition.
- @param[in] CommandLine String of command line to parse
- @param[in, out] Argv pointer to array of strings; one for each
parameter
- @param[in, out] Argc pointer to number of strings in Argv array
+ @param[in] CommandLine String of command line to parse
+ @param[in] StripQuotation if TRUE then strip the quotation marks
surrounding
+ the parameters.
+ @param[in, out] Argv pointer to array of strings; one for each
parameter
+ @param[in, out] Argc pointer to number of strings in Argv array
@return EFI_SUCCESS the operation was sucessful
@return EFI_OUT_OF_RESOURCES a memory allocation failed.
@@ -173,8 +185,9 @@
EFIAPI
ParseCommandLineToArgs(
IN CONST CHAR16 *CommandLine,
- IN OUT CHAR16 ***Argv,
- IN OUT UINTN *Argc
+ IN BOOLEAN StripQuotation,
+ IN OUT CHAR16 ***Argv,
+ IN OUT UINTN *Argc
);
/**
@@ -187,10 +200,12 @@
Temp Parameter must be large enough to hold the parameter before calling this
function.
- @param[in, out] Walker pointer to string of command line. Adjusted to
- reminaing command line on return
- @param[in, out] TempParameter pointer to string of command line item
extracted.
- @param[in] Length Length of (*TempParameter) in bytes
+ @param[in, out] Walker pointer to string of command line. Adjusted
to
+ reminaing command line on return
+ @param[in, out] TempParameter pointer to string of command line item
extracted.
+ @param[in] Length Length of (*TempParameter) in bytes
+ @param[in] StripQuotation if TRUE then strip the quotation marks
surrounding
+ the parameters.
@return EFI_INALID_PARAMETER A required parameter was NULL or pointed to
a NULL or empty string.
@return EFI_NOT_FOUND A closing " could not be found on the
specified string
@@ -200,7 +215,8 @@
GetNextParameter(
IN OUT CHAR16 **Walker,
IN OUT CHAR16 **TempParameter,
- IN CONST UINTN Length
+ IN CONST UINTN Length,
+ IN BOOLEAN StripQuotation
);
#endif //_SHELL_PARAMETERS_PROTOCOL_PROVIDER_HEADER_
Modified: branches/UDK2015/ShellPkg/Application/Shell/ShellProtocol.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/ShellProtocol.c 2015-12-18
07:34:01 UTC (rev 19401)
+++ branches/UDK2015/ShellPkg/Application/Shell/ShellProtocol.c 2015-12-18
07:34:43 UTC (rev 19402)
@@ -1501,7 +1501,7 @@
ShellParamsProtocol.StdIn =
ShellInfoObject.NewShellParametersProtocol->StdIn;
ShellParamsProtocol.StdOut =
ShellInfoObject.NewShellParametersProtocol->StdOut;
ShellParamsProtocol.StdErr =
ShellInfoObject.NewShellParametersProtocol->StdErr;
- Status = UpdateArgcArgv(&ShellParamsProtocol, NewCmdLine, NULL, NULL);
+ Status = UpdateArgcArgv(&ShellParamsProtocol, NewCmdLine, Efi_Application,
NULL, NULL);
ASSERT_EFI_ERROR(Status);
//
// Replace Argv[0] with the full path of the binary we're executing:
------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits