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