From nobody Mon May 6 09:24:03 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1508399061719793.7090773708185; Thu, 19 Oct 2017 00:44:21 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 51C6220347159; Thu, 19 Oct 2017 00:40:42 -0700 (PDT) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id BC5B62034714E for ; Thu, 19 Oct 2017 00:40:41 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Oct 2017 00:44:19 -0700 Received: from ray-dev.ccr.corp.intel.com ([10.239.9.7]) by fmsmga002.fm.intel.com with ESMTP; 19 Oct 2017 00:44:18 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.43,400,1503385200"; d="scan'208";a="1232556450" From: Ruiyu Ni To: edk2-devel@lists.01.org Date: Thu, 19 Oct 2017 15:44:16 +0800 Message-Id: <20171019074416.381700-1-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.12.2.windows.2 Subject: [edk2] [PATCH] ShellPkg/alias: Fix flag parsing logic X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jaben Carsey , Huajing Li MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Huajing Li 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 Cc: Jaben Carsey Reviewed-by: Jaben Carsey --- .../Library/UefiShellLevel3CommandsLib/Alias.c | 210 ++++++++++++++---= ---- 1 file changed, 145 insertions(+), 65 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c b/ShellPkg= /Library/UefiShellLevel3CommandsLib/Alias.c index daf46a9f65..3e00eb1d55 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c @@ -18,6 +18,37 @@ #include =20 /** + 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 =3D SHELL_SUCCESS; + ConstAliasVal =3D gEfiShellProtocol->GetAlias (Alias, &Volatile); + if (ConstAliasVal =3D=3D NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShel= lLevel3HiiHandle, L"alias", Alias); + ShellStatus =3D SHELL_INVALID_PARAMETER; + } else { + if (ShellCommandIsOnAliasList (Alias)) { + Volatile =3D FALSE; + } + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShell= Level3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal); + } + return ShellStatus; +} + +/** Print out each alias registered with the Shell. =20 @retval STATUS_SUCCESS the printout was sucessful @@ -30,11 +61,7 @@ PrintAllShellAlias( { CONST CHAR16 *ConstAllAliasList; CHAR16 *Alias; - CONST CHAR16 *Command; CHAR16 *Walker; - BOOLEAN Volatile; - - Volatile =3D FALSE; =20 ConstAllAliasList =3D gEfiShellProtocol->GetAlias(NULL, NULL); if (ConstAllAliasList =3D=3D NULL) { @@ -53,11 +80,7 @@ PrintAllShellAlias( Walker[0] =3D CHAR_NULL; Walker =3D Walker + 1; } - Command =3D gEfiShellProtocol->GetAlias(Alias, &Volatile); - if (ShellCommandIsOnAliasList(Alias)) { - Volatile =3D FALSE; - } - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellL= evel3HiiHandle, !Volatile?L' ':L'*', Alias, Command); + PrintSingleShellAlias(Alias); } while (Walker !=3D NULL && Walker[0] !=3D CHAR_NULL); =20 FreePool(Alias); @@ -65,9 +88,58 @@ PrintAllShellAlias( return (SHELL_SUCCESS); } =20 +/** + Changes a shell command alias. + + This function creates an alias for a shell command or if Alias is NULL i= t will delete an existing alias. + + + @param[in] Command Points to the NULL-terminated shell comman= d or existing alias. + @param[in] Alias Points to the NULL-terminated alias for th= e shell command. If this is NULL, and + Command refers to an alias, that alias wil= l 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 t= he 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-vo= latile fashion. + + @retval SHELL_SUCCESS Alias created or deleted successfully. + @retval SHELL_NOT_FOUND the Alias intended to be deleted was not f= ound + @retval SHELL_ACCESS_DENIED The alias is a built-in alias or already e= xisted 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 =3D SHELL_SUCCESS; + Status =3D gEfiShellProtocol->SetAlias (Command, Alias, Replace, Volatil= e); + if (EFI_ERROR(Status)) { + if (Status =3D=3D EFI_ACCESS_DENIED) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShell= Level3HiiHandle, L"alias"); + ShellStatus =3D SHELL_ACCESS_DENIED; + } else if (Status =3D=3D EFI_NOT_FOUND) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND),= gShellLevel3HiiHandle, L"alias", Command); + ShellStatus =3D SHELL_NOT_FOUND; + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShell= Level3HiiHandle, L"alias", Status); + ShellStatus =3D SHELL_DEVICE_ERROR; + } + } + return ShellStatus; +} + STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { {L"-v", TypeFlag}, - {L"-d", TypeFlag}, + {L"-d", TypeValue}, {NULL, TypeMax} }; =20 @@ -90,9 +162,10 @@ ShellCommandRunAlias ( SHELL_STATUS ShellStatus; CONST CHAR16 *Param1; CONST CHAR16 *Param2; + CONST CHAR16 *ParamStrD; CHAR16 *CleanParam2; - CONST CHAR16 *ConstAliasVal; - BOOLEAN Volatile; + BOOLEAN DeleteFlag; + BOOLEAN VolatileFlag; =20 ProblemParam =3D NULL; ShellStatus =3D SHELL_SUCCESS; @@ -123,9 +196,13 @@ ShellCommandRunAlias ( Param1 =3D ShellCommandLineGetRawValue(Package, 1); Param2 =3D ShellCommandLineGetRawValue(Package, 2); =20 + DeleteFlag =3D ShellCommandLineGetFlag (Package, L"-d"); + VolatileFlag =3D ShellCommandLineGetFlag (Package, L"-v"); + if (Param2 !=3D NULL) { CleanParam2 =3D AllocateCopyPool (StrSize(Param2), Param2); if (CleanParam2 =3D=3D NULL) { + ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } =20 @@ -135,65 +212,68 @@ ShellCommandRunAlias ( } } =20 - // - // check for "-?" - // - if (ShellCommandLineGetFlag(Package, L"-?")) { - ASSERT(FALSE); - } - if (ShellCommandLineGetCount(Package) =3D=3D 1) { - // - // print out alias' - // - Status =3D PrintAllShellAlias(); - } else if (ShellCommandLineGetFlag(Package, L"-d")) { - // - // delete an alias - // - Status =3D gEfiShellProtocol->SetAlias(Param1, NULL, TRUE, FALSE); - if (EFI_ERROR(Status)) { - if (Status =3D=3D EFI_ACCESS_DENIED) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gSh= ellLevel3HiiHandle, L"alias"); - ShellStatus =3D SHELL_ACCESS_DENIED; - } else if (Status =3D=3D EFI_NOT_FOUND) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUN= D), gShellLevel3HiiHandle, L"alias", Param1); - ShellStatus =3D SHELL_NOT_FOUND; - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gSh= ellLevel3HiiHandle, L"alias", Status); - ShellStatus =3D SHELL_DEVICE_ERROR; - } + if (!DeleteFlag && !VolatileFlag) { + switch (ShellCommandLineGetCount (Package)) { + case 1: + // + // "alias" + // + ShellStatus =3D PrintAllShellAlias (); + break; + case 2: + // + // "alias Param1" + // + ShellStatus =3D PrintSingleShellAlias (Param1); + break; + case 3: + // + // "alias Param1 CleanParam2" + // + ShellStatus =3D ShellLevel3CommandsLibSetAlias (CleanParam2, Par= am1, FALSE, VolatileFlag); + break; + default: + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), = gShellLevel3HiiHandle, L"alias"); + ShellStatus =3D SHELL_INVALID_PARAMETER; } - } else if (ShellCommandLineGetCount(Package) =3D=3D 3) { - // - // must be adding an alias - // - Status =3D gEfiShellProtocol->SetAlias(CleanParam2, Param1, FALSE, S= hellCommandLineGetFlag(Package, L"-v")); - if (EFI_ERROR(Status)) { - if (Status =3D=3D EFI_ACCESS_DENIED) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gSh= ellLevel3HiiHandle, L"alias"); =20 - ShellStatus =3D SHELL_ACCESS_DENIED; + } else if (DeleteFlag) { + if (VolatileFlag || ShellCommandLineGetCount (Package) > 1) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gS= hellLevel3HiiHandle, L"alias"); + ShellStatus =3D SHELL_INVALID_PARAMETER; + } else { + ParamStrD =3D ShellCommandLineGetValue (Package, L"-d"); + if (ParamStrD =3D=3D NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), g= ShellLevel3HiiHandle, L"alias"); + ShellStatus =3D SHELL_INVALID_PARAMETER; } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gSh= ellLevel3HiiHandle, L"alias", Status); =20 - ShellStatus =3D SHELL_DEVICE_ERROR; + // + // Delete an alias: "alias -d ParamStrD" + // + ShellStatus =3D ShellLevel3CommandsLibSetAlias (ParamStrD, NULL,= TRUE, FALSE); } } - } else if (ShellCommandLineGetCount(Package) =3D=3D 2) { + } else { // - // print out a single alias + // Set volatile alias. // - ConstAliasVal =3D gEfiShellProtocol->GetAlias(Param1, &Volatile); - if (ConstAliasVal =3D=3D NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gS= hellLevel3HiiHandle, L"alias", Param1); - ShellStatus =3D SHELL_INVALID_PARAMETER; - } else { - if (ShellCommandIsOnAliasList(Param1)) { - Volatile =3D FALSE; - } - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gSh= ellLevel3HiiHandle, !Volatile?L' ':L'*', Param1, ConstAliasVal); - } =20 - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShel= lLevel3HiiHandle, L"alias"); =20 - ShellStatus =3D SHELL_INVALID_PARAMETER; + ASSERT (VolatileFlag); + ASSERT (!DeleteFlag);=20 + switch (ShellCommandLineGetCount (Package)) { + case 1: + case 2: + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), g= ShellLevel3HiiHandle, L"alias"); + ShellStatus =3D SHELL_INVALID_PARAMETER; + break; + case 3: + // + // "alias -v Param1 CleanParam2" + // + ShellStatus =3D ShellLevel3CommandsLibSetAlias (CleanParam2, Par= am1, FALSE, VolatileFlag); + break; + default: + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), = gShellLevel3HiiHandle, L"alias"); + ShellStatus =3D SHELL_INVALID_PARAMETER; + } } // // free the command line package --=20 2.12.2.windows.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel